⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bus.h

📁 基于组件方式开发操作系统的OSKIT源代码
💻 H
📖 第 1 页 / 共 3 页
字号:
			loop 1b"				:		    "=&a" (__x)					:		    "d" (bsh + offset), "D" (addr), "c" (count)	:		    "%edx", "%edi", "%ecx", "memory");	}#endif#if defined(_I386_BUS_MEMIO_H_)#if defined(_I386_BUS_PIO_H_)	else#endif	{		__asm __volatile("				\n\			cld					\n\			repne					\n\			movsl"					:								:		    "S" (bsh + offset), "D" (addr), "c" (count)	:		    "%esi", "%edi", "%ecx", "memory");	}#endif}#if 0	/* Cause a link error for bus_space_read_region_8 */#define	bus_space_read_region_8	!!! bus_space_read_region_8 unimplemented !!!#endif/* * Write the 1, 2, 4, or 8 byte value `value' to bus space * described by tag/handle/offset. */static __inline void bus_space_write_1(bus_space_tag_t tag,				       bus_space_handle_t bsh,				       bus_size_t offset, u_int8_t value);static __inline void bus_space_write_2(bus_space_tag_t tag,				       bus_space_handle_t bsh,				       bus_size_t offset, u_int16_t value);static __inline void bus_space_write_4(bus_space_tag_t tag,				       bus_space_handle_t bsh,				       bus_size_t offset, u_int32_t value);static __inline voidbus_space_write_1(bus_space_tag_t tag, bus_space_handle_t bsh,		       bus_size_t offset, u_int8_t value){#if defined(_I386_BUS_PIO_H_)#if defined(_I386_BUS_MEMIO_H_)	if (tag == I386_BUS_SPACE_IO)#endif		outb(bsh + offset, value);#endif#if defined(_I386_BUS_MEMIO_H_)#if defined(_I386_BUS_PIO_H_)	else#endif		*(volatile u_int8_t *)(bsh + offset) = value;#endif}static __inline voidbus_space_write_2(bus_space_tag_t tag, bus_space_handle_t bsh,		       bus_size_t offset, u_int16_t value){#if defined(_I386_BUS_PIO_H_)#if defined(_I386_BUS_MEMIO_H_)	if (tag == I386_BUS_SPACE_IO)#endif		outw(bsh + offset, value);#endif#if defined(_I386_BUS_MEMIO_H_)#if defined(_I386_BUS_PIO_H_)	else#endif		*(volatile u_int16_t *)(bsh + offset) = value;#endif}static __inline voidbus_space_write_4(bus_space_tag_t tag, bus_space_handle_t bsh,		       bus_size_t offset, u_int32_t value){#if defined(_I386_BUS_PIO_H_)#if defined(_I386_BUS_MEMIO_H_)	if (tag == I386_BUS_SPACE_IO)#endif		outl(bsh + offset, value);#endif#if defined(_I386_BUS_MEMIO_H_)#if defined(_I386_BUS_PIO_H_)	else#endif		*(volatile u_int32_t *)(bsh + offset) = value;#endif}#if 0	/* Cause a link error for bus_space_write_8 */#define	bus_space_write_8	!!! bus_space_write_8 not implemented !!!#endif/* * Write `count' 1, 2, 4, or 8 byte quantities from the buffer * provided to bus space described by tag/handle/offset. */static __inline void bus_space_write_multi_1(bus_space_tag_t tag,					     bus_space_handle_t bsh,					     bus_size_t offset,					     const u_int8_t *addr,					     size_t count);static __inline void bus_space_write_multi_2(bus_space_tag_t tag,					     bus_space_handle_t bsh,					     bus_size_t offset,					     const u_int16_t *addr,					     size_t count);static __inline void bus_space_write_multi_4(bus_space_tag_t tag,					     bus_space_handle_t bsh,					     bus_size_t offset,					     const u_int32_t *addr,					     size_t count);static __inline voidbus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh,			bus_size_t offset, const u_int8_t *addr, size_t count){#if defined(_I386_BUS_PIO_H_)#if defined(_I386_BUS_MEMIO_H_)	if (tag == I386_BUS_SPACE_IO)#endif		outsb(bsh + offset, addr, count);#endif#if defined(_I386_BUS_MEMIO_H_)#if defined(_I386_BUS_PIO_H_)	else#endif	{		int __x __asm__("%eax");		__asm __volatile("				\n\			cld					\n\		1:	lodsb					\n\			movb %%al,(%1)				\n\			loop 1b"				:		    "=&a" (__x)					:		    "r" (bsh + offset), "S" (addr), "c" (count)	:		    "%esi", "%ecx");	}#endif}static __inline voidbus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh,			bus_size_t offset, const u_int16_t *addr, size_t count){#if defined(_I386_BUS_PIO_H_)#if defined(_I386_BUS_MEMIO_H_)	if (tag == I386_BUS_SPACE_IO)#endif		outsw(bsh + offset, addr, count);#endif#if defined(_I386_BUS_MEMIO_H_)#if defined(_I386_BUS_PIO_H_)	else#endif	{		int __x __asm__("%eax");		__asm __volatile("				\n\			cld					\n\		1:	lodsw					\n\			movw %%ax,(%1)				\n\			loop 1b"				:		    "=&a" (__x)					:		    "r" (bsh + offset), "S" (addr), "c" (count)	:		    "%esi", "%ecx");	}#endif}static __inline voidbus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh,			bus_size_t offset, const u_int32_t *addr, size_t count){#if defined(_I386_BUS_PIO_H_)#if defined(_I386_BUS_MEMIO_H_)	if (tag == I386_BUS_SPACE_IO)#endif		outsl(bsh + offset, addr, count);#endif#if defined(_I386_BUS_MEMIO_H_)#if defined(_I386_BUS_PIO_H_)	else#endif	{		int __x __asm__("%eax");		__asm __volatile("				\n\			cld					\n\		1:	lodsl					\n\			movl %%eax,(%1)				\n\			loop 1b"				:		    "=&a" (__x)					:		    "r" (bsh + offset), "S" (addr), "c" (count)	:		    "%esi", "%ecx");	}#endif}#if 0	/* Cause a link error for bus_space_write_multi_8 */#define	bus_space_write_multi_8(t, h, o, a, c)				\			!!! bus_space_write_multi_8 unimplemented !!!#endif/* * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided * to bus space described by tag/handle starting at `offset'. */static __inline void bus_space_write_region_1(bus_space_tag_t tag,					      bus_space_handle_t bsh,					      bus_size_t offset,					      const u_int8_t *addr,					      size_t count);static __inline void bus_space_write_region_2(bus_space_tag_t tag,					      bus_space_handle_t bsh,					      bus_size_t offset,					      const u_int16_t *addr,					      size_t count);static __inline void bus_space_write_region_4(bus_space_tag_t tag,					      bus_space_handle_t bsh,					      bus_size_t offset,					      const u_int32_t *addr,					      size_t count);static __inline voidbus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,			 bus_size_t offset, const u_int8_t *addr, size_t count){#if defined(_I386_BUS_PIO_H_)#if defined(_I386_BUS_MEMIO_H_)	if (tag == I386_BUS_SPACE_IO)#endif	{		int __x __asm__("%eax");		__asm __volatile("				\n\			cld					\n\		1:	lodsb					\n\			outb %%al,%w1				\n\			incl %1					\n\			loop 1b"				:		    "=&a" (__x)					:		    "d" (bsh + offset), "S" (addr), "c" (count)	:		    "%edx", "%esi", "%ecx", "memory");	}#endif#if defined(_I386_BUS_MEMIO_H_)#if defined(_I386_BUS_PIO_H_)	else#endif	{		__asm __volatile("				\n\			cld					\n\			repne					\n\			movsb"					:								:		    "D" (bsh + offset), "S" (addr), "c" (count)	:		    "%edi", "%esi", "%ecx", "memory");	}#endif}static __inline voidbus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,			 bus_size_t offset, const u_int16_t *addr, size_t count){#if defined(_I386_BUS_PIO_H_)#if defined(_I386_BUS_MEMIO_H_)	if (tag == I386_BUS_SPACE_IO)#endif	{		int __x __asm__("%eax");		__asm __volatile("				\n\			cld					\n\		1:	lodsw					\n\			outw %%ax,%w1				\n\			addl $2,%1				\n\			loop 1b"				:		    "=&a" (__x)					:		    "d" (bsh + offset), "S" (addr), "c" (count)	:		    "%edx", "%esi", "%ecx", "memory");	}#endif#if defined(_I386_BUS_MEMIO_H_)#if defined(_I386_BUS_PIO_H_)	else#endif	{		__asm __volatile("				\n\			cld					\n\			repne					\n\			movsw"					:								:		    "D" (bsh + offset), "S" (addr), "c" (count)	:		    "%edi", "%esi", "%ecx", "memory");	}#endif}static __inline voidbus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,			 bus_size_t offset, const u_int32_t *addr, size_t count){#if defined(_I386_BUS_PIO_H_)#if defined(_I386_BUS_MEMIO_H_)	if (tag == I386_BUS_SPACE_IO)#endif	{		int __x __asm__("%eax");		__asm __volatile("				\n\			cld					\n\		1:	lodsl					\n\			outl %%eax,%w1				\n\			addl $4,%1				\n\			loop 1b"				:		    "=&a" (__x)					:		    "d" (bsh + offset), "S" (addr), "c" (count)	:		    "%edx", "%esi", "%ecx", "memory");	}#endif#if defined(_I386_BUS_MEMIO_H_)#if defined(_I386_BUS_PIO_H_)	else#endif	{		__asm __volatile("				\n\			cld					\n\			repne					\n\			movsl"					:								:		    "D" (bsh + offset), "S" (addr), "c" (count)	:		    "%edi", "%esi", "%ecx", "memory");	}#endif}#if 0	/* Cause a link error for bus_space_write_region_8 */#define	bus_space_write_region_8					\			!!! bus_space_write_region_8 unimplemented !!!#endif/* * Write the 1, 2, 4, or 8 byte value `val' to bus space described * by tag/handle/offset `count' times. */static __inline void bus_space_set_multi_1(bus_space_tag_t tag,					   bus_space_handle_t bsh,					   bus_size_t offset,					   u_int8_t value, size_t count);static __inline void bus_space_set_multi_2(bus_space_tag_t tag,					   bus_space_handle_t bsh,					   bus_size_t offset,					   u_int16_t value, size_t count);static __inline void bus_space_set_multi_4(bus_space_tag_t tag,					   bus_space_handle_t bsh,					   bus_size_t offset,					   u_int32_t value, size_t count);static __inline voidbus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh,		      bus_size_t offset, u_int8_t value, size_t count){	bus_addr_t addr = bsh + offset;#if defined(_I386_BUS_PIO_H_)#if defined(_I386_BUS_MEMIO_H_)	if (tag == I386_BUS_SPACE_IO)#endif		while (count--)			outb(addr, value);#endif#if defined(_I386_BUS_MEMIO_H_)#if defined(_I386_BUS_PIO_H_)	else#endif		while (count--)			*(volatile u_int8_t *)(addr) = value;#endif}static __inline voidbus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh,		     bus_size_t offset, u_int16_t value, size_t count){	bus_addr_t addr = bsh + offset;#if defined(_I386_BUS_PIO_H_)#if defined(_I386_BUS_MEMIO_H_)	if (tag == I386_BUS_SPACE_IO)#endif		while (count--)			outw(addr, value);#endif#if defined(_I386_BUS_MEMIO_H_)#if defined(_I386_BUS_PIO_H_)	else#endif		while (count--)			*(volatile u_int16_t *)(addr) = value;#endif}static __inline voidbus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh,		      bus_size_t offset, u_int32_t value, size_t count){	bus_addr_t addr = bsh + offset;#if defined(_I386_BUS_PIO_H_)#if defined(_I386_BUS_MEMIO_H_)	if (tag == I386_BUS_SPACE_IO)#endif		while (count--)			outl(addr, value);#endif#if defined(_I386_BUS_MEMIO_H_)#if defined(_I386_BUS_PIO_H_)	else#endif

⌨️ 快捷键说明

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