Coherent4.2.10/include/kernel/ddi_glob.h

/* (-lgl
 *	Coherent 386 release 4.2
 *	Copyright (c) 1982, 1993 by Mark Williams Company.
 *	All rights reserved. May not be copied without permission.
 *	For copying permission and licensing info, write licensing@mwc.com
 -lgl) */

#ifndef	__KERNEL_DDI_GLOB_H__
#define	__KERNEL_DDI_GLOB_H__

/*
 * This internal header file defines structures and an access procedure for
 * DDI/DKI global data that must be shared between all CPUs.  Note that this
 * may not be all the truly global context; examine the STREAMS header files
 * for additional global data specific to STREAMS.
 */

#include <common/ccompat.h>
#include <kernel/x86lock.h>
#include <kernel/_lock.h>
#include <kernel/_sv.h>
#include <kernel/_toid.h>
#include <kernel/ddi_data.h>
#include <kernel/st_alloc.h>

/*
 * Timeout events are stored on a global queue, both while they are pending
 * and once they have expired. When an event expires, it is bound to a CPU
 * (if one was not specified when the event was created) and a function to
 * process expired events on that CPU is deferred.
 */

typedef	struct timeout	timeout_t;

typedef struct tlist {
	__lock_t      *	td_lock;
	toid_t		td_id;
	timeout_t     *	td_first;
	timeout_t     *	td_run;
} timelist_t;


/*
 * Truly global data used by the DDI/DKI system (except for STREAMS global
 * data).
 */

typedef	struct ddi_global_data	dgdata_t;

struct ddi_global_data {
	/*
	 * The defer-table data is at the front of the structure because it is
	 * typically manipulated by hand-coded assembly-language routines.
	 */

	defer_t		dg_defint;		/* interrupt-level defers */
	defer_t		dg_defproc;		/* process-level defers */

	atomic_uchar_t	dg_run_bufcalls;	/* bufcall check deferred */
	atomic_uchar_t	dg_run_strsched;	/* STREAMS service deferred */
	atomic_uchar_t	dg_run_time;		/* timeout check deferred */
	atomic_uchar_t	dg_init_flag;		/* initialization spin-lock */

	unsigned long	dg_reserved_2 [4];

	__lock_t      *	dg_polllock;		/* global lock on polling */
	__lock_t      *	dg_proclock;		/* process reference count */

	timelist_t	dg_timeouts;		/* timeout data */

	__lock_t      *	dg_kmem_lock;		/* basic lock for heap */
	_ST_HEAP_CONTROL_P dg_kmem_heap;
	__sv_t	      *	dg_kmem_sv;		/*
						 * synchronization variable for
						 * waiting for free memory.
						 */
	__size_t	dg_kmem_required;	/* Level of memory required */
};


__EXTERN_C_BEGIN__

dgdata_t      *	ddi_global_data	__PROTO ((void));

__EXTERN_C_END__


extern dgdata_t		__ddi_global_data;

#define	ddi_global_data() 	(& __ddi_global_data)


#endif	/* ! defined (__KERNEL_DDI_GLOB_H__) */