By Olaf Seibert <rhialto@polderland.nl>, posted on port-alpha on 2000/08/08. Compiles fine, otherwise untested.
258 lines
7.5 KiB
Text
258 lines
7.5 KiB
Text
$NetBSD: patch-ag,v 1.1 2000/12/28 03:56:54 wiz Exp $
|
|
|
|
--- machdep/engine-alpha-netbsd-1.3.c.orig Fri Dec 10 13:40:41 1999
|
|
+++ machdep/engine-alpha-netbsd-1.3.c
|
|
@@ -3,17 +3,17 @@
|
|
*
|
|
* Description : Machine dependent functions for NetBSD/Alpha 1.1(+)
|
|
*
|
|
- * 1.00 93/08/04 proven
|
|
+ * 1.00 93/08/04 proven
|
|
* -Started coding this file.
|
|
*
|
|
- * 95/04/22 cgd
|
|
- * -Modified to make it go with NetBSD/Alpha
|
|
+ * 95/04/22 cgd
|
|
+ * -Modified to make it go with NetBSD/Alpha
|
|
*/
|
|
|
|
#ifndef lint
|
|
static const char rcsid[] = "engine-alpha-osf1.c,v 1.4.4.1 1995/12/13 05:41:37 proven Exp";
|
|
#endif
|
|
-
|
|
+
|
|
#include <pthread.h>
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
@@ -23,77 +23,24 @@
|
|
#include <stdio.h>
|
|
|
|
/* ==========================================================================
|
|
- * machdep_save_state()
|
|
- */
|
|
-int machdep_save_state(void)
|
|
-{
|
|
- return __machdep_save_int_state(pthread_run->machdep_data.machdep_istate);
|
|
-}
|
|
-
|
|
-void machdep_restore_state(void)
|
|
-{
|
|
- __machdep_restore_int_state(pthread_run->machdep_data.machdep_istate);
|
|
-}
|
|
-
|
|
-void machdep_save_float_state (void)
|
|
-{
|
|
- __machdep_save_fp_state(pthread_run->machdep_data.machdep_fstate);
|
|
-}
|
|
-
|
|
-void machdep_restore_float_state (void)
|
|
-{
|
|
- __machdep_restore_fp_state(pthread_run->machdep_data.machdep_fstate);
|
|
-}
|
|
-
|
|
-/* ==========================================================================
|
|
- * machdep_set_thread_timer()
|
|
- */
|
|
-void machdep_set_thread_timer(struct machdep_pthread *machdep_pthread)
|
|
-{
|
|
- if (setitimer(ITIMER_VIRTUAL, &(machdep_pthread->machdep_timer), NULL)) {
|
|
- PANIC("setitimer failed");
|
|
- }
|
|
-}
|
|
-
|
|
-/* ==========================================================================
|
|
- * machdep_unset_thread_timer()
|
|
- */
|
|
-void machdep_unset_thread_timer(struct machdep_pthread *machdep_pthread)
|
|
-{
|
|
- struct itimerval zeroval = { { 0, 0 }, { 0, 0} };
|
|
-
|
|
- if (setitimer(ITIMER_VIRTUAL, &zeroval, NULL)) {
|
|
- PANIC("setitimer failed");
|
|
- }
|
|
-}
|
|
-
|
|
-/* ==========================================================================
|
|
- * machdep_pthread_cleanup()
|
|
- */
|
|
-void *machdep_pthread_cleanup(struct machdep_pthread *machdep_pthread)
|
|
-{
|
|
- return(machdep_pthread->machdep_stack);
|
|
-}
|
|
-
|
|
-/* ==========================================================================
|
|
* machdep_pthread_start()
|
|
*/
|
|
void machdep_pthread_start(void)
|
|
{
|
|
- context_switch_done();
|
|
- pthread_sched_resume ();
|
|
+ context_switch_done();
|
|
+ pthread_sched_resume ();
|
|
|
|
- /* XXXMLG
|
|
- * This is EXTREMELY bogus, but it seems that this function is called
|
|
- * with the pthread kernel locked. If this happens, __errno() will
|
|
- * return the wrong address until after the first context switch.
|
|
- *
|
|
- * Clearly there is a leak of pthread_kernel somewhere, but until
|
|
- * it is found, we force a context switch here, just before calling
|
|
- * the thread start routine. When we return from pthread_yield
|
|
- * the kernel will be unlocked.
|
|
- */
|
|
- pthread_yield();
|
|
+ /* XXXMLG
|
|
+ * This is EXTREMELY bogus, but it seems that this function is called
|
|
+ * with the pthread kernel locked. If this happens, __errno() will
|
|
+ * return the wrong address until after the first context switch.
|
|
+ *
|
|
+ * Clearly there is a leak of pthread_kernel somewhere, but until
|
|
+ * it is found, we force a context switch here, just before calling
|
|
+ * the thread start routine. When we return from pthread_yield
|
|
+ * the kernel will be unlocked.
|
|
+ */
|
|
+ pthread_yield();
|
|
|
|
/* Run current threads start routine with argument */
|
|
pthread_exit(pthread_run->machdep_data.start_routine
|
|
@@ -104,28 +51,10 @@
|
|
}
|
|
|
|
/* ==========================================================================
|
|
- * __machdep_stack_free()
|
|
- */
|
|
-void __machdep_stack_free(void * stack)
|
|
-{
|
|
- free(stack);
|
|
-}
|
|
-
|
|
-/* ==========================================================================
|
|
- * __machdep_stack_alloc()
|
|
- */
|
|
-void * __machdep_stack_alloc(size_t size)
|
|
-{
|
|
- void * stack;
|
|
-
|
|
- return(malloc(size));
|
|
-}
|
|
-
|
|
-/* ==========================================================================
|
|
* __machdep_pthread_create()
|
|
*/
|
|
void __machdep_pthread_create(struct machdep_pthread *machdep_pthread,
|
|
- void *(* start_routine)(), void *start_argument,
|
|
+ void *(* start_routine)(void *), void *start_argument,
|
|
long stack_size, long nsec, long flags)
|
|
{
|
|
machdep_pthread->start_routine = start_routine;
|
|
@@ -151,66 +80,68 @@
|
|
}
|
|
}
|
|
|
|
-int safe_store (loc, new)
|
|
- int *loc;
|
|
- int new;
|
|
+/* ==========================================================================
|
|
+ * machdep_save_state()
|
|
+ */
|
|
+int machdep_save_state(void)
|
|
{
|
|
- int locked, old;
|
|
- asm ("mb" : : : "memory");
|
|
- do {
|
|
- asm ("ldl_l %0,%1" : "=r" (old) : "m" (*loc));
|
|
- asm ("stl_c %0,%1" : "=r" (locked), "=m" (*loc) : "0" (new));
|
|
- } while (!locked);
|
|
- asm ("mb" : : : "memory");
|
|
- return old;
|
|
+ return __machdep_save_int_state(pthread_run->machdep_data.machdep_istate);
|
|
}
|
|
|
|
-/* ==========================================================================
|
|
- * machdep_sys_creat()
|
|
- */
|
|
-machdep_sys_creat(char * path, int mode)
|
|
-{
|
|
- return(machdep_sys_open(path, O_WRONLY | O_CREAT | O_TRUNC, mode));
|
|
-}
|
|
+void machdep_restore_state(void)
|
|
+{
|
|
+ __machdep_restore_int_state(pthread_run->machdep_data.machdep_istate);
|
|
+}
|
|
|
|
-/* ==========================================================================
|
|
- * machdep_sys_wait3()
|
|
- */
|
|
-machdep_sys_wait3(int * b, int c, int * d)
|
|
-{
|
|
- return(machdep_sys_wait4(0, b, c, d));
|
|
-}
|
|
-
|
|
-/* ==========================================================================
|
|
- * machdep_sys_waitpid()
|
|
- */
|
|
-machdep_sys_waitpid(int a, int * b, int c)
|
|
+void machdep_save_float_state (struct pthread *pthread)
|
|
+{
|
|
+ __machdep_save_fp_state(pthread->machdep_data.machdep_fstate);
|
|
+}
|
|
+
|
|
+void machdep_restore_float_state (void)
|
|
{
|
|
- return(machdep_sys_wait4(a, b, c, NULL));
|
|
+ __machdep_restore_fp_state(pthread_run->machdep_data.machdep_fstate);
|
|
}
|
|
|
|
/* ==========================================================================
|
|
- * machdep_sys_getdtablesize()
|
|
+ * machdep_set_thread_timer()
|
|
*/
|
|
-machdep_sys_getdtablesize()
|
|
+void machdep_set_thread_timer(struct machdep_pthread *machdep_pthread)
|
|
{
|
|
- return(sysconf(_SC_OPEN_MAX));
|
|
+ if (setitimer(ITIMER_VIRTUAL, &(machdep_pthread->machdep_timer), NULL)) {
|
|
+ PANIC("setitimer failed");
|
|
+ }
|
|
}
|
|
|
|
/* ==========================================================================
|
|
- * machdep_sys_lseek()
|
|
+ * machdep_unset_thread_timer()
|
|
*/
|
|
-off_t machdep_sys_lseek(int fd, off_t offset, int whence)
|
|
+void machdep_unset_thread_timer(struct machdep_pthread *machdep_pthread)
|
|
{
|
|
- extern off_t __syscall();
|
|
+ struct itimerval zeroval = { { 0, 0 }, { 0, 0} };
|
|
|
|
- return(__syscall((quad_t)SYS_lseek, fd, 0, offset, whence));
|
|
+ if (setitimer(ITIMER_VIRTUAL, &zeroval, NULL)) {
|
|
+ PANIC("setitimer failed");
|
|
+ }
|
|
}
|
|
|
|
/* ==========================================================================
|
|
- * machdep_sys_getdirentries()
|
|
+ * machdep_pthread_cleanup()
|
|
*/
|
|
-machdep_sys_getdirentries(int fd, char * buf, int len, int * seek)
|
|
+void *machdep_pthread_cleanup(struct machdep_pthread *machdep_pthread)
|
|
{
|
|
- return(machdep_sys_getdents(fd, buf, len));
|
|
-}
|
|
+ return(machdep_pthread->machdep_stack);
|
|
+}
|
|
+
|
|
+int safe_store (int *loc, int new)
|
|
+{
|
|
+ int locked, old;
|
|
+ asm ("mb" : : : "memory");
|
|
+ do {
|
|
+ asm ("ldl_l %0,%1" : "=r" (old) : "m" (*loc));
|
|
+ asm ("stl_c %0,%1" : "=r" (locked), "=m" (*loc) : "0" (new));
|
|
+ } while (!locked);
|
|
+ asm ("mb" : : : "memory");
|
|
+ return old;
|
|
+}
|
|
+
|