uvm_map.h

来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 518 行 · 第 1/2 页

H
518
字号
 *	Interrupt-safe maps must also be kept on a special list, *	to assist uvm_fault() in avoiding locking problems. */struct vm_map_intrsafe {	struct vm_map	vmi_map;	LIST_ENTRY(vm_map_intrsafe) vmi_list;};LIST_HEAD(vmi_list, vm_map_intrsafe);#ifdef _KERNELextern simple_lock_data_t vmi_list_slock;extern struct vmi_list vmi_list;static __inline int vmi_list_lock __P((void));static __inline void vmi_list_unlock __P((int));static __inline intvmi_list_lock(){	int s;#ifndef OSKIT	/* XXX */	s = splhigh();	simple_lock(&vmi_list_slock);#else	s = 0;#endif	return (s);}static __inline voidvmi_list_unlock(s)	int s;{#ifndef OSKIT	simple_unlock(&vmi_list_slock);	splx(s);#endif}#endif /* _KERNEL *//* * handle inline options */#ifdef UVM_MAP_INLINE#define MAP_INLINE static __inline#else #define MAP_INLINE /* nothing */#endif /* UVM_MAP_INLINE *//* * globals: */#ifdef _KERNEL#ifdef PMAP_GROWKERNELextern vaddr_t	uvm_maxkaddr;#endif/* * protos: the following prototypes define the interface to vm_map */MAP_INLINEvoid		uvm_map_deallocate __P((vm_map_t));int		uvm_map_clean __P((vm_map_t, vaddr_t, vaddr_t, int));void		uvm_map_clip_start __P((vm_map_t, vm_map_entry_t, vaddr_t));void		uvm_map_clip_end __P((vm_map_t, vm_map_entry_t, vaddr_t));MAP_INLINEvm_map_t	uvm_map_create __P((pmap_t, vaddr_t, vaddr_t, int));int		uvm_map_extract __P((vm_map_t, vaddr_t, vsize_t, 			vm_map_t, vaddr_t *, int));vm_map_entry_t	uvm_map_findspace __P((vm_map_t, vaddr_t, vsize_t, vaddr_t *,			struct uvm_object *, voff_t, vsize_t, int));int		uvm_map_inherit __P((vm_map_t, vaddr_t, vaddr_t, vm_inherit_t));int		uvm_map_advice __P((vm_map_t, vaddr_t, vaddr_t, int));void		uvm_map_init __P((void));boolean_t	uvm_map_lookup_entry __P((vm_map_t, vaddr_t, vm_map_entry_t *));MAP_INLINEvoid		uvm_map_reference __P((vm_map_t));int		uvm_map_replace __P((vm_map_t, vaddr_t, vaddr_t,			vm_map_entry_t, int));int		uvm_map_reserve __P((vm_map_t, vsize_t, vaddr_t, vsize_t,			vaddr_t *));void		uvm_map_setup __P((vm_map_t, vaddr_t, vaddr_t, int));int		uvm_map_submap __P((vm_map_t, vaddr_t, vaddr_t, vm_map_t));MAP_INLINEint		uvm_unmap __P((vm_map_t, vaddr_t, vaddr_t));void		uvm_unmap_detach __P((vm_map_entry_t,int));int		uvm_unmap_remove __P((vm_map_t, vaddr_t, vaddr_t,				      vm_map_entry_t *));#endif /* _KERNEL *//* * VM map locking operations: * *	These operations perform locking on the data portion of the *	map. * *	vm_map_lock_try: try to lock a map, failing if it is already locked. * *	vm_map_lock: acquire an exclusive (write) lock on a map. * *	vm_map_lock_read: acquire a shared (read) lock on a map. * *	vm_map_unlock: release an exclusive lock on a map. * *	vm_map_unlock_read: release a shared lock on a map. * *	vm_map_downgrade: downgrade an exclusive lock to a shared lock. * *	vm_map_upgrade: upgrade a shared lock to an exclusive lock. * *	vm_map_busy: mark a map as busy. * *	vm_map_unbusy: clear busy status on a map. * * Note that "intrsafe" maps use only exclusive, spin locks.  We simply * use the sleep lock's interlock for this. */#ifdef _KERNEL/* XXX: clean up later */#include <sys/time.h>#include <sys/proc.h>	/* for tsleep(), wakeup() */#include <sys/systm.h>	/* for panic() */static __inline boolean_t vm_map_lock_try __P((vm_map_t));static __inline void vm_map_lock __P((vm_map_t));static __inline boolean_tvm_map_lock_try(map)	vm_map_t map;{	boolean_t rv;	if (map->flags & VM_MAP_INTRSAFE)		rv = simple_lock_try(&map->lock.lk_interlock);	else {		simple_lock(&map->flags_lock);		if (map->flags & VM_MAP_BUSY) {			simple_unlock(&map->flags_lock);			return (FALSE);		}		rv = (lockmgr(&map->lock, LK_EXCLUSIVE|LK_NOWAIT|LK_INTERLOCK,		    &map->flags_lock) == 0);	}	if (rv)		map->timestamp++;	return (rv);}static __inline voidvm_map_lock(map)	vm_map_t map;{	int error;	if (map->flags & VM_MAP_INTRSAFE) {		simple_lock(&map->lock.lk_interlock);		return;	} try_again:	simple_lock(&map->flags_lock);	while (map->flags & VM_MAP_BUSY) {		map->flags |= VM_MAP_WANTLOCK;		ltsleep(&map->flags, PVM, "vmmapbsy", 0, &map->flags_lock);	}	error = lockmgr(&map->lock, LK_EXCLUSIVE|LK_SLEEPFAIL|LK_INTERLOCK,	    &map->flags_lock);	if (error) {#ifdef DIAGNOSTIC		if (error != ENOLCK)			panic("vm_map_lock: failed to get lock");#endif		goto try_again;	}	(map)->timestamp++;#ifdef OSKIT			/* XXX */	assert(map->lock.lk_lockholder == curproc->p_pid);#endif}#ifdef DIAGNOSTIC#define	vm_map_lock_read(map)						\do {									\	if (map->flags & VM_MAP_INTRSAFE)				\		panic("vm_map_lock_read: intrsafe map");		\	(void) lockmgr(&(map)->lock, LK_SHARED, NULL);			\} while (0)#else#define	vm_map_lock_read(map)						\	(void) lockmgr(&(map)->lock, LK_SHARED, NULL)#endif#define	vm_map_unlock(map)						\do {									\	if ((map)->flags & VM_MAP_INTRSAFE)				\		simple_unlock(&(map)->lock.lk_interlock);		\	else								\		(void) lockmgr(&(map)->lock, LK_RELEASE, NULL);		\} while (0)#define	vm_map_unlock_read(map)						\	(void) lockmgr(&(map)->lock, LK_RELEASE, NULL)#define	vm_map_downgrade(map)						\	(void) lockmgr(&(map)->lock, LK_DOWNGRADE, NULL)#ifdef DIAGNOSTIC#define	vm_map_upgrade(map)						\do {									\	if (lockmgr(&(map)->lock, LK_UPGRADE, NULL) != 0)		\		panic("vm_map_upgrade: failed to upgrade lock");	\} while (0)#else#define	vm_map_upgrade(map)						\	(void) lockmgr(&(map)->lock, LK_UPGRADE, NULL)#endif#define	vm_map_busy(map)						\do {									\	simple_lock(&(map)->flags_lock);				\	(map)->flags |= VM_MAP_BUSY;					\	simple_unlock(&(map)->flags_lock);				\} while (0)#define	vm_map_unbusy(map)						\do {									\	int oflags;							\									\	simple_lock(&(map)->flags_lock);				\	oflags = (map)->flags;						\	(map)->flags &= ~(VM_MAP_BUSY|VM_MAP_WANTLOCK);			\	simple_unlock(&(map)->flags_lock);				\	if (oflags & VM_MAP_WANTLOCK)					\		wakeup(&(map)->flags);					\} while (0)#endif /* _KERNEL *//* *	Functions implemented as macros */#define		vm_map_min(map)		((map)->min_offset)#define		vm_map_max(map)		((map)->max_offset)#define		vm_map_pmap(map)	((map)->pmap)#endif /* _UVM_UVM_MAP_H_ */

⌨️ 快捷键说明

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