lock.h

来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 253 行

H
253
字号
/* * Copyright (c) 1997, by Steve Passe * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. The name of the developer may NOT be used to endorse or promote products *    derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * *	$Id: lock.h,v 1.6 1998/04/06 11:38:17 phk Exp $ */#ifndef _MACHINE_LOCK_H_#define _MACHINE_LOCK_H_#ifdef LOCORE#ifdef SMP#define	MPLOCKED	lock ;/* * Some handy macros to allow logical organization and * convenient reassignment of various locks. */#define FPU_LOCK	call	_get_fpu_lock#define ALIGN_LOCK	call	_get_align_lock#define SYSCALL_LOCK	call	_get_syscall_lock#define ALTSYSCALL_LOCK	call	_get_altsyscall_lock/* * Protects INTR() ISRs. */#define ISR_TRYLOCK							\	pushl	$_mp_lock ;			/* GIANT_LOCK */	\	call	_MPtrylock ;			/* try to get lock */	\	add	$4, %esp#define ISR_RELLOCK							\	pushl	$_mp_lock ;			/* GIANT_LOCK */	\	call	_MPrellock ;						\	add	$4, %esp/* * Protects the IO APIC and apic_imen as a critical region. */#define IMASK_LOCK							\	pushl	$_imen_lock ;			/* address of lock */	\	call	_s_lock ;			/* MP-safe */		\	addl	$4, %esp#define IMASK_UNLOCK							\	pushl	$_imen_lock ;			/* address of lock */	\	call	_s_unlock ;			/* MP-safe */		\	addl	$4, %esp/* * Variations of CPL_LOCK protect spl updates as a critical region. * Items within this 'region' include: *  cpl *  cml *  cil *  ipending *//* * Botom half routines, ie. those already protected from INTs. * * Used in: *  sys/i386/isa/ipl.s:		_doreti *  sys/i386/isa/apic_vector.s:	_Xintr0, ..., _Xintr23 */#define CPL_LOCK							\	pushl	$_cpl_lock ;			/* address of lock */	\	call	_s_lock ;			/* MP-safe */		\	addl	$4, %esp#define CPL_UNLOCK							\	pushl	$_cpl_lock ;			/* address of lock */	\	call	_s_unlock ;			/* MP-safe */		\	addl	$4, %esp/* * INT safe version for top half of kernel. * * Used in: *  sys/i386/i386/exception.s:	_Xfpu, _Xalign, _Xsyscall, _Xint0x80_syscall *  sys/i386/isa/apic_ipl.s:	splz() */#define SCPL_LOCK 							\	pushl	$_cpl_lock ;						\	call	_ss_lock ;						\	addl	$4, %esp#define SCPL_UNLOCK							\	pushl	$_cpl_lock ;						\	call	_ss_unlock ;						\	addl	$4, %esp#else  /* SMP */#define	MPLOCKED				/* NOP */#define FPU_LOCK				/* NOP */#define ALIGN_LOCK				/* NOP */#define SYSCALL_LOCK				/* NOP */#define ALTSYSCALL_LOCK				/* NOP */#endif /* SMP */#else /* LOCORE */#ifdef SMP#include <machine/smptests.h>			/** xxx_LOCK *//* * Locks regions protected in UP kernel via cli/sti. */#ifdef USE_MPINTRLOCK#define MPINTR_LOCK()	s_lock(&mpintr_lock)#define MPINTR_UNLOCK()	s_unlock(&mpintr_lock)#else#define MPINTR_LOCK()#define MPINTR_UNLOCK()#endif /* USE_MPINTRLOCK *//* * Protects cpl/cml/cil/ipending data as a critical region. * * Used in: *  sys/i386/isa/ipl_funcs.c:	DO_SETBITS, softclockpending(), GENSPL, *				spl0(), splx(), splq() */#define CPL_LOCK() 	s_lock(&cpl_lock)	/* Bottom end */#define CPL_UNLOCK() 	s_unlock(&cpl_lock)#define SCPL_LOCK() 	ss_lock(&cpl_lock)	/* INT safe: top end */#define SCPL_UNLOCK() 	ss_unlock(&cpl_lock)/* * sio/cy lock. * XXX should rc (RISCom/8) use this? */#ifdef USE_COMLOCK#define COM_LOCK() 	s_lock(&com_lock)#define COM_UNLOCK() 	s_unlock(&com_lock)#define COM_DISABLE_INTR() \		{ __asm __volatile("cli" : : : "memory"); COM_LOCK(); }#define COM_ENABLE_INTR() \		{ COM_UNLOCK(); __asm __volatile("sti"); }#else#define COM_LOCK()#define COM_UNLOCK()#define COM_DISABLE_INTR()	disable_intr()#define COM_ENABLE_INTR()	enable_intr()#endif /* USE_COMLOCK *//*  * Clock hardware/struct lock. * XXX pcaudio and friends still need this lock installed. */#ifdef USE_CLOCKLOCK#define CLOCK_LOCK()	s_lock(&clock_lock)#define CLOCK_UNLOCK()	s_unlock(&clock_lock)#define CLOCK_DISABLE_INTR() \		{ __asm __volatile("cli" : : : "memory"); CLOCK_LOCK(); }#define CLOCK_ENABLE_INTR() \		{ CLOCK_UNLOCK(); __asm __volatile("sti"); }#else#define CLOCK_LOCK()#define CLOCK_UNLOCK()#define CLOCK_DISABLE_INTR()	disable_intr()#define CLOCK_ENABLE_INTR()	enable_intr()#endif /* USE_CLOCKLOCK */#else /* SMP */#define MPINTR_LOCK()#define MPINTR_UNLOCK()#define CPL_LOCK()#define CPL_UNLOCK()#define SCPL_LOCK()#define SCPL_UNLOCK()#define COM_LOCK()#define COM_UNLOCK()#define CLOCK_LOCK()#define CLOCK_UNLOCK()#endif /* SMP *//* * Simple spin lock. * It is an error to hold one of these locks while a process is sleeping. */struct simplelock {	volatile int	lock_data;};/* functions in simplelock.s */void	s_lock_init		__P((struct simplelock *));void	s_lock			__P((struct simplelock *));int	s_lock_try		__P((struct simplelock *));void	s_unlock		__P((struct simplelock *));void	ss_lock			__P((struct simplelock *));void	ss_unlock		__P((struct simplelock *));void	s_lock_np		__P((struct simplelock *));void	s_unlock_np		__P((struct simplelock *));/* global data in mp_machdep.c */extern struct simplelock	imen_lock;extern struct simplelock	cpl_lock;extern struct simplelock	fast_intr_lock;extern struct simplelock	intr_lock;extern struct simplelock	clock_lock;extern struct simplelock	com_lock;extern struct simplelock	mpintr_lock;extern struct simplelock	mcount_lock;#if !defined(SIMPLELOCK_DEBUG) && NCPUS > 1/* * This set of defines turns on the real functions in i386/isa/apic_ipl.s. */#define	simple_lock_init(alp)	s_lock_init(alp)#define	simple_lock(alp)	s_lock(alp)#define	simple_lock_try(alp)	s_lock_try(alp)#define	simple_unlock(alp)	s_unlock(alp)#endif /* !SIMPLELOCK_DEBUG && NCPUS > 1 */#endif /* LOCORE */#endif /* !_MACHINE_LOCK_H_ */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?