/tags/0.2.0/uspace/trunk/ns/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/ns/ns.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/uspace.config |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softint/generic/division.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softint/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softint/include/division.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/fb/sysio.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/fb/ega.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/fb/ppm.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/fb/fb.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/fb/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/fb/font-8x16.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/fb/ega.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/fb/ppm.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/fb/main.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/fb/sysio.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/fb/fb.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/fb/main.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/fb/font-8x16.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/klog/klog.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/klog/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/tools/config.py |
---|
File deleted |
Property changes: |
Deleted: svn:executable |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/kbd/include/kbd.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/kbd/include/key_buffer.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/kbd/generic/kbd.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/kbd/generic/key_buffer.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/kbd/arch/ia64/include/kbd.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/kbd/arch/ia64/src/kbd.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/kbd/arch/mips32eb |
---|
File deleted |
\ No newline at end of file |
Property changes: |
Deleted: svn:special |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/kbd/arch/ppc32/src/kbd.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/kbd/arch/ppc32/include/kbd.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/kbd/arch/amd64 |
---|
File deleted |
\ No newline at end of file |
Property changes: |
Deleted: svn:special |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/kbd/arch/mips32/src/kbd.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/kbd/arch/mips32/include/kbd.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/kbd/arch/ia32/src/kbd.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/kbd/arch/ia32/include/kbd.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/kbd/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/generic/mul.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/generic/other.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/generic/softfloat.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/generic/div.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/generic/conversion.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/generic/add.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/generic/common.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/generic/sub.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/generic/comparison.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/arch/sparc64/include/functions.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/arch/ia64/include/functions.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/arch/mips32eb/include/functions.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/arch/ppc32/include/functions.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/arch/amd64/include/functions.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/arch/ppc64/include/functions.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/arch/mips32/include/functions.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/arch/ia32/include/functions.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/include/conversion.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/include/add.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/include/common.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/include/sub.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/include/comparison.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/include/mul.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/include/sftypes.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/include/other.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/include/softfloat.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/softfloat/include/div.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/console/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/console/cons_has_data.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Deleted: svn:mime-type |
-application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/console/console.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/console/nameic.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Deleted: svn:mime-type |
-application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/console/helenos.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Deleted: svn:mime-type |
-application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/console/console.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/console/cons_idle.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Deleted: svn:mime-type |
-application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/console/screenbuffer.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/console/gcons.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/console/cons_kernel.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Deleted: svn:mime-type |
-application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/console/screenbuffer.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/console/anim_1.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Deleted: svn:mime-type |
-application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/console/gcons.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/console/anim_2.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Deleted: svn:mime-type |
-application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/console/anim_3.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Deleted: svn:mime-type |
-application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/console/anim_4.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Deleted: svn:mime-type |
-application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/console/cons_selected.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Deleted: svn:mime-type |
-application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/init/init.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/init/version.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/init/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/init/init.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/init/version.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/malloc/malloc.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/Makefile.toolchain |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/io/printf.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/io/snprintf.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/io/sprintf.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/io/io.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/io/vprintf.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/io/vsnprintf.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/io/printf_core.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/io/vsprintf.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/io/stream.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/err.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/sysinfo.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/mmap.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/futex.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/time.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/ddi.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/task.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/as.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/cap.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/string.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/thread.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/libc.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/psthread.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/ipc.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/async.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/libadt/hash_table.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/libadt/list.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/generic/stdlib.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/include/types.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/include/stack.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/include/thread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/include/psthread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/include/atomic.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/include/endian.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/include/stackarg.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/include/limits.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/Makefile.inc |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/src/syscall.S |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/src/psthread.S |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/src/entry.s |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/src/thread.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/src/thread_entry.s |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia64/_link.ld.in |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32eb/_link.ld.in |
---|
File deleted |
\ No newline at end of file |
Property changes: |
Deleted: svn:special |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/libc/arch/mips32eb/include/limits.h |
---|
File deleted |
\ No newline at end of file |
Property changes: |
Deleted: svn:special |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/libc/arch/mips32eb/include/types.h |
---|
File deleted |
\ No newline at end of file |
Property changes: |
Deleted: svn:special |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/libc/arch/mips32eb/include/thread.h |
---|
File deleted |
\ No newline at end of file |
Property changes: |
Deleted: svn:special |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/libc/arch/mips32eb/include/psthread.h |
---|
File deleted |
\ No newline at end of file |
Property changes: |
Deleted: svn:special |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/libc/arch/mips32eb/include/context_offset.h |
---|
File deleted |
\ No newline at end of file |
Property changes: |
Deleted: svn:special |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/libc/arch/mips32eb/include/atomic.h |
---|
File deleted |
\ No newline at end of file |
Property changes: |
Deleted: svn:special |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/libc/arch/mips32eb/include/endian.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32eb/include/stackarg.h |
---|
File deleted |
\ No newline at end of file |
Property changes: |
Deleted: svn:special |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/libc/arch/mips32eb/Makefile.inc |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32eb/src |
---|
File deleted |
\ No newline at end of file |
Property changes: |
Deleted: svn:special |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/include/atomic.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/include/regname.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/include/endian.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/include/stackarg.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/include/limits.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/include/types.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/include/thread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/include/psthread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/include/context_offset.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/Makefile.inc |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/src/entry.s |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/src/thread.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/src/thread_entry.s |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/src/syscall.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/src/psthread.S |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc32/_link.ld.in |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/_link.ld.in |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/include/stackarg.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/include/limits.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/include/types.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/include/thread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/include/psthread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/include/context_offset.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/include/atomic.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/include/endian.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/Makefile.inc |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/src/entry.s |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/src/thread.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/src/thread_entry.s |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/src/syscall.S |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/amd64/src/psthread.S |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/Makefile.inc |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/src/syscall.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/src/psthread.S |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/src/entry.s |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/src/thread.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/src/thread_entry.s |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/_link.ld.in |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/include/psthread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/include/context_offset.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/include/atomic.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/include/regname.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/include/endian.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/include/stackarg.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/include/limits.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/include/types.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ppc64/include/thread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/_link.ld.in |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/include/psthread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/include/context_offset.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/include/atomic.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/include/endian.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/include/stackarg.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/include/limits.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/include/types.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/include/thread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/Makefile.inc |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/src/entry.s |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/src/thread.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/src/thread_entry.s |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/src/syscall.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/mips32/src/psthread.S |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/_link.ld.in |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/include/psthread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/include/atomic.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/include/endian.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/include/stackarg.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/include/limits.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/include/types.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/include/thread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/Makefile.inc |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/src/thread.c |
---|
File deleted |
\ No newline at end of file |
Property changes: |
Deleted: svn:special |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/src/thread_entry.s |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/src/syscall.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/src/psthread.S |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/arch/ia32/src/entry.s |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/err.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/sysinfo.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/time.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/assert.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/task.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/cap.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/unistd.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/thread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/libadt/fifo.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/libadt/hash_table.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/libadt/list.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/libc.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/atomic.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/io/io.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/io/printf_core.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/io/stream.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/ctype.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/stdarg.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/ipc/ipc.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/ipc/ns.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/ipc/services.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/ipc/fb.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/errno.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/sys/mman.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/sys/time.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/sys/types.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/align.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/futex.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/endian.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/ddi.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/limits.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/as.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/types.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/stdint.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/string.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/malloc.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/stddef.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/psthread.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/async.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/stdlib.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/libc/include/stdio.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/tetris/scores.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/tetris/input.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/tetris/screen.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/tetris/tetris.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/tetris/scores.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/tetris/shapes.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/tetris/screen.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/tetris/input.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/tetris/pathnames.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/tetris/tetris.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/tetris/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/COPYING |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/pci.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/update-ids |
---|
File deleted |
Property changes: |
Deleted: svn:executable |
-* |
\ No newline at end of property |
/tags/0.2.0/uspace/trunk/pci/libpci/generic.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/libpci/sysdep.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/libpci/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/libpci/header.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/libpci/i386-ports.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/libpci/pci_ids.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/libpci/pci.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/libpci/internal.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/libpci/access.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/libpci/names.c |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/libpci/VERSION |
---|
File deleted |
/tags/0.2.0/uspace/trunk/pci/libpci/types.h |
---|
File deleted |
/tags/0.2.0/uspace/trunk/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/ipcc/Makefile |
---|
File deleted |
/tags/0.2.0/uspace/trunk/ipcc/ipcc.c |
---|
File deleted |
/tags/0.2.0/uspace/ns/ns.c |
---|
0,0 → 1,262 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @defgroup ns Naming Service |
* @brief Naming service for HelenOS IPC. |
* @{ |
*/ |
/** |
* @file ns.c |
* @brief Naming service for HelenOS IPC. |
*/ |
#include <ipc/ipc.h> |
#include <ipc/ns.h> |
#include <ipc/services.h> |
#include <stdio.h> |
#include <unistd.h> |
#include <stdlib.h> |
#include <errno.h> |
#include <assert.h> |
#include <libadt/list.h> |
#include <libadt/hash_table.h> |
#include <sysinfo.h> |
#include <ddi.h> |
#include <as.h> |
#define NAME "NS" |
#define NS_HASH_TABLE_CHAINS 20 |
static int register_service(ipcarg_t service, ipcarg_t phone, ipc_call_t *call); |
static int connect_to_service(ipcarg_t service, ipc_call_t *call, ipc_callid_t callid); |
/* Static functions implementing NS hash table operations. */ |
static hash_index_t ns_hash(unsigned long *key); |
static int ns_compare(unsigned long *key, hash_count_t keys, link_t *item); |
static void ns_remove(link_t *item); |
/** Operations for NS hash table. */ |
static hash_table_operations_t ns_hash_table_ops = { |
.hash = ns_hash, |
.compare = ns_compare, |
.remove_callback = ns_remove |
}; |
/** NS hash table structure. */ |
static hash_table_t ns_hash_table; |
/** NS hash table item. */ |
typedef struct { |
link_t link; |
ipcarg_t service; /**< Number of the service. */ |
ipcarg_t phone; /**< Phone registered with the service. */ |
ipcarg_t in_phone_hash; /**< Incoming phone hash. */ |
} hashed_service_t; |
int static ping_phone; |
static void *clockaddr = NULL; |
static void *klogaddr = NULL; |
static void get_as(ipc_callid_t callid, ipc_call_t *call, char *name, void **addr) |
{ |
void *ph_addr; |
if (!*addr) { |
ph_addr = (void *)sysinfo_value(name); |
if (!ph_addr) { |
ipc_answer_fast(callid, ENOENT, 0, 0); |
return; |
} |
*addr = as_get_mappable_page(PAGE_SIZE); |
map_physmem(ph_addr, *addr, 1, AS_AREA_READ | AS_AREA_CACHEABLE); |
} |
ipc_answer_fast(callid, 0, (ipcarg_t)*addr, AS_AREA_READ); |
} |
int main(int argc, char **argv) |
{ |
ipc_call_t call; |
ipc_callid_t callid; |
char *as_area; |
ipcarg_t retval, arg1, arg2; |
if (!hash_table_create(&ns_hash_table, NS_HASH_TABLE_CHAINS, 3, &ns_hash_table_ops)) { |
return ENOMEM; |
} |
while (1) { |
callid = ipc_wait_for_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_AS_AREA_RECV: |
switch (IPC_GET_ARG3(call)) { |
case SERVICE_MEM_REALTIME: |
get_as(callid, &call, "clock.faddr", &clockaddr); |
break; |
case SERVICE_MEM_KLOG: |
get_as(callid, &call, "klog.faddr", &klogaddr); |
break; |
default: |
ipc_answer_fast(callid, ENOENT, 0, 0); |
} |
continue; |
case IPC_M_PHONE_HUNGUP: |
retval = 0; |
break; |
case IPC_M_CONNECT_TO_ME: |
/* |
* Server requests service registration. |
*/ |
retval = register_service(IPC_GET_ARG1(call), IPC_GET_ARG3(call), &call); |
break; |
case IPC_M_CONNECT_ME_TO: |
/* |
* Client requests to be connected to a service. |
*/ |
retval = connect_to_service(IPC_GET_ARG1(call), &call, callid); |
break; |
default: |
retval = ENOENT; |
break; |
} |
if (! (callid & IPC_CALLID_NOTIFICATION)) { |
ipc_answer_fast(callid, retval, arg1, arg2); |
} |
} |
} |
/** Register service. |
* |
* @param service Service to be registered. |
* @param phone phone Phone to be used for connections to the service. |
* @param call Pointer to call structure. |
* |
* @return Zero on success or a value from @ref errno.h. |
*/ |
int register_service(ipcarg_t service, ipcarg_t phone, ipc_call_t *call) |
{ |
unsigned long keys[3] = { service, call->in_phone_hash, 0 }; |
hashed_service_t *hs; |
if (hash_table_find(&ns_hash_table, keys)) { |
return EEXISTS; |
} |
hs = (hashed_service_t *) malloc(sizeof(hashed_service_t)); |
if (!hs) { |
return ENOMEM; |
} |
link_initialize(&hs->link); |
hs->service = service; |
hs->phone = phone; |
hs->in_phone_hash = call->in_phone_hash; |
hash_table_insert(&ns_hash_table, keys, &hs->link); |
return 0; |
} |
/** Connect client to service. |
* |
* @param service Service to be connected to. |
* @param call Pointer to call structure. |
* @param callid Call ID of the request. |
* |
* @return Zero on success or a value from @ref errno.h. |
*/ |
int connect_to_service(ipcarg_t service, ipc_call_t *call, ipc_callid_t callid) |
{ |
unsigned long keys[3] = { service, 0, 0 }; |
link_t *hlp; |
hashed_service_t *hs; |
hlp = hash_table_find(&ns_hash_table, keys); |
if (!hlp) { |
return ENOENT; |
} |
hs = hash_table_get_instance(hlp, hashed_service_t, link); |
return ipc_forward_fast(callid, hs->phone, 0, 0); |
} |
/** Compute hash index into NS hash table. |
* |
* @param key Pointer keys. However, only the first key (i.e. service number) |
* is used to compute the hash index. |
* @return Hash index corresponding to key[0]. |
*/ |
hash_index_t ns_hash(unsigned long *key) |
{ |
assert(key); |
return *key % NS_HASH_TABLE_CHAINS; |
} |
/** Compare a key with hashed item. |
* |
* This compare function always ignores the third key. |
* It exists only to make it possible to remove records |
* originating from connection with key[1] in_phone_hash |
* value. Note that this is close to being classified |
* as a nasty hack. |
* |
* @param key Array of keys. |
* @param keys Must be lesser or equal to 3. |
* @param item Pointer to a hash table item. |
* @return Non-zero if the key matches the item, zero otherwise. |
*/ |
int ns_compare(unsigned long key[], hash_count_t keys, link_t *item) |
{ |
hashed_service_t *hs; |
assert(key); |
assert(keys <= 3); |
assert(item); |
hs = hash_table_get_instance(item, hashed_service_t, link); |
if (keys == 2) |
return key[1] == hs->in_phone_hash; |
else |
return key[0] == hs->service; |
} |
/** Perform actions after removal of item from the hash table. |
* |
* @param item Item that was removed from the hash table. |
*/ |
void ns_remove(link_t *item) |
{ |
assert(item); |
free(hash_table_get_instance(item, hashed_service_t, link)); |
} |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/ns/Makefile |
---|
0,0 → 1,72 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../libc |
SOFTINT_PREFIX = ../softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = ns |
SOURCES = \ |
ns.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.2.0/uspace/uspace.config |
---|
0,0 → 1,33 |
## General configuration directives |
# Architecture |
@ "amd64" AMD64/Intel EM64T |
@ "ia32" Intel IA-32 |
@ "ia64" Intel IA-64 |
@ "mips32" MIPS 32-bit Little Endian |
@ "mips32eb" MIPS 32-bit Big Endian |
@ "ppc32" PowerPC 32-bit |
@ "ppc64" PowerPC 64-bit |
! ARCH (choice) |
# IA32 Compiler |
@ "cross" Cross-compiler |
@ "native" Native |
! [ARCH=ia32] IA32_COMPILER (choice) |
% [ARCH=ia32] SAVEAS IA32_COMPILER COMPILER |
# PPC32 Compiler |
@ "cross" Cross-compiler |
@ "native" Native |
! [ARCH=ppc32] PPC32_COMPILER (choice) |
% [ARCH=ppc32] SAVEAS PPC32_COMPILER COMPILER |
# PPC64 Compiler |
@ "cross" Cross-compiler |
@ "native" Native |
! [ARCH=ppc64] PPC64_COMPILER (choice) |
% [ARCH=ppc64] SAVEAS PPC64_COMPILER COMPILER |
# MIPS FPU support |
! [ARCH=mips32|ARCH=mips32eb] CONFIG_MIPS_FPU (n/y) |
/tags/0.2.0/uspace/softint/include/division.h |
---|
0,0 → 1,70 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softint |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef __SOFTINT_DIVISION_H__ |
#define __SOFTINT_DIVISION_H__ |
/* 32bit integer division */ |
int __divsi3(int a, int b); |
/* 64bit integer division */ |
long long __divdi3(long long a, long long b); |
/* 32bit unsigned integer division */ |
unsigned int __udivsi3(unsigned int a, unsigned int b); |
/* 64bit unsigned integer division */ |
unsigned long long __udivdi3(unsigned long long a, unsigned long long b); |
/* 32bit remainder of the signed division */ |
int __modsi3(int a, int b); |
/* 64bit remainder of the signed division */ |
long long __moddi3(long long a, long long b); |
/* 32bit remainder of the unsigned division */ |
unsigned int __umodsi3(unsigned int a, unsigned int b); |
/* 64bit remainder of the unsigned division */ |
unsigned long long __umoddi3(unsigned long long a, unsigned long long b); |
unsigned long long __udivmoddi3(unsigned long long a, unsigned long long b, unsigned long long *c); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softint/generic/division.c |
---|
0,0 → 1,198 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softint SoftInt |
* @brief Software implementation of basic arithmetic operations. |
* @{ |
*/ |
/** |
* @file |
* SW implementation of 32 and 64 bit division and modulo. |
*/ |
#include <division.h> |
#define ABSVAL(x) ( (x) > 0 ? (x) : -(x)) |
#define SGN(x) ( (x) >= 0 ? 1 : 0 ) |
static unsigned int divandmod32(unsigned int a, unsigned int b, unsigned int *remainder) |
{ |
unsigned int result; |
int steps = sizeof(unsigned int) * 8; |
*remainder = 0; |
result = 0; |
if (b == 0) { |
/* FIXME: division by zero */ |
return 0; |
} |
if ( a < b) { |
*remainder = a; |
return 0; |
} |
for ( ; steps > 0; steps--) { |
/* shift one bit to remainder */ |
*remainder = ( (*remainder) << 1) | (( a >> 31) & 0x1); |
result <<= 1; |
if (*remainder >= b) { |
*remainder -= b; |
result |= 0x1; |
} |
a <<= 1; |
} |
return result; |
} |
static unsigned long long divandmod64(unsigned long long a, unsigned long long b, unsigned long long *remainder) |
{ |
unsigned long long result; |
int steps = sizeof(unsigned long long) * 8; |
*remainder = 0; |
result = 0; |
if (b == 0) { |
/* FIXME: division by zero */ |
return 0; |
} |
if ( a < b) { |
*remainder = a; |
return 0; |
} |
for ( ; steps > 0; steps--) { |
/* shift one bit to remainder */ |
*remainder = ( (*remainder) << 1) | ((a >> 63) & 0x1); |
result <<= 1; |
if (*remainder >= b) { |
*remainder -= b; |
result |= 0x1; |
} |
a <<= 1; |
} |
return result; |
} |
/* 32bit integer division */ |
int __divsi3(int a, int b) |
{ |
unsigned int rem; |
int result; |
result = (int)divandmod32(ABSVAL(a), ABSVAL(b), &rem); |
if ( SGN(a) == SGN(b)) return result; |
return -result; |
} |
/* 64bit integer division */ |
long long __divdi3(long long a, long long b) |
{ |
unsigned long long rem; |
long long result; |
result = (long long)divandmod64(ABSVAL(a), ABSVAL(b), &rem); |
if ( SGN(a) == SGN(b)) return result; |
return -result; |
} |
/* 32bit unsigned integer division */ |
unsigned int __udivsi3(unsigned int a, unsigned int b) |
{ |
unsigned int rem; |
return divandmod32(a, b, &rem); |
} |
/* 64bit unsigned integer division */ |
unsigned long long __udivdi3(unsigned long long a, unsigned long long b) |
{ |
unsigned long long rem; |
return divandmod64(a, b, &rem); |
} |
/* 32bit remainder of the signed division */ |
int __modsi3(int a, int b) |
{ |
unsigned int rem; |
divandmod32(a, b, &rem); |
/* if divident is negative, remainder must be too */ |
if (!(SGN(a))) { |
return -((int)rem); |
} |
return (int)rem; |
} |
/* 64bit remainder of the signed division */ |
long long __moddi3(long long a,long long b) |
{ |
unsigned long long rem; |
divandmod64(a, b, &rem); |
/* if divident is negative, remainder must be too */ |
if (!(SGN(a))) { |
return -((long long)rem); |
} |
return (long long)rem; |
} |
/* 32bit remainder of the unsigned division */ |
unsigned int __umodsi3(unsigned int a, unsigned int b) |
{ |
unsigned int rem; |
divandmod32(a, b, &rem); |
return rem; |
} |
/* 64bit remainder of the unsigned division */ |
unsigned long long __umoddi3(unsigned long long a, unsigned long long b) |
{ |
unsigned long long rem; |
divandmod64(a, b, &rem); |
return rem; |
} |
unsigned long long __udivmoddi3(unsigned long long a, unsigned long long b, unsigned long long *c) |
{ |
return divandmod64(a, b, c); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/softint/Makefile |
---|
0,0 → 1,73 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Common compiler flags |
# |
LIBC_PREFIX = ../libc |
## Setup toolchain |
# |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -Iinclude |
## Sources |
# |
ARCH_SOURCES = |
GENERIC_SOURCES = \ |
generic/division.c |
GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES))) |
.PHONY: all clean depend |
all: softint.a |
-include Makefile.depend |
clean: |
-rm -f softint.a Makefile.depend |
find generic/ -name '*.o' -follow -exec rm \{\} \; |
depend: |
-makedepend $(DEFS) $(CFLAGS) -f - $(GENERIC_SOURCES) > Makefile.depend 2> /dev/null |
softint.a: depend $(ARCH_OBJECTS) $(GENERIC_OBJECTS) |
$(AR) rc softint.a $(ARCH_OBJECTS) $(GENERIC_OBJECTS) |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.2.0/uspace/fb/ega.h |
---|
0,0 → 1,46 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup egafb |
* @brief HelenOS EGA framebuffer. |
* @ingroup fbs |
* @{ |
*/ |
/** @file |
*/ |
#ifndef _EGA_H_ |
#define _EGA_H_ |
int ega_init(void); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/fb/sysio.c |
---|
0,0 → 1,197 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @defgroup sysio SysIO |
* @brief HelenOS framebuffer emulation via kernel. |
* @ingroup fbs |
* @{ |
*/ |
/** @file |
*/ |
#include <async.h> |
#include <ipc/fb.h> |
#include <ipc/ipc.h> |
#include <libc.h> |
#include <errno.h> |
#include <string.h> |
#include <libc.h> |
#include <stdio.h> |
#include "sysio.h" |
#define WIDTH 80 |
#define HEIGHT 25 |
/* Allow only 1 connection */ |
static int client_connected = 0; |
static void sysput(char c) |
{ |
__SYSCALL3(SYS_IO, 1, (sysarg_t)&c, (sysarg_t) 1); |
} |
static void sysputs(char *s) |
{ |
while (*s) { |
sysput(*(s++)); |
} |
// __SYSCALL3(SYS_IO, 1, (sysarg_t)s, strlen(s)); |
} |
/** Send clearscreen sequence to console */ |
static void clrscr(void) |
{ |
sysputs("\033[2J"); |
} |
/** Send ansi sequence to console to change cursor position */ |
static void curs_goto(unsigned int row, unsigned int col) |
{ |
char control[20]; |
if (row > 200 || col > 200) |
return; |
snprintf(control, 20, "\033[%d;%df",row+1, col+1); |
sysputs(control); |
} |
static void set_style(int mode) |
{ |
char control[20]; |
snprintf(control, 20, "\033[%dm", mode); |
sysputs(control); |
} |
static void scroll(int i) |
{ |
if (i > 0) { |
curs_goto(HEIGHT-1, 0); |
while (i--) |
sysputs("\033D"); |
} else if (i < 0) { |
curs_goto(0,0); |
while (i++) |
sysputs("\033M"); |
} |
} |
/** ANSI terminal emulation main thread */ |
static void sysio_client_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
int retval; |
ipc_callid_t callid; |
ipc_call_t call; |
char c; |
int lastcol=0; |
int lastrow=0; |
int newcol,newrow; |
int fgcolor,bgcolor; |
int i; |
if (client_connected) { |
ipc_answer_fast(iid, ELIMIT, 0,0); |
return; |
} |
client_connected = 1; |
ipc_answer_fast(iid, 0, 0, 0); /* Accept connection */ |
while (1) { |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
client_connected = 0; |
ipc_answer_fast(callid,0,0,0); |
return; /* Exit thread */ |
case FB_PUTCHAR: |
c = IPC_GET_ARG1(call); |
newrow = IPC_GET_ARG2(call); |
newcol = IPC_GET_ARG3(call); |
if (lastcol != newcol || lastrow!=newrow) |
curs_goto(newrow, newcol); |
lastcol = newcol + 1; |
lastrow = newrow; |
sysput(c); |
retval = 0; |
break; |
case FB_CURSOR_GOTO: |
newrow = IPC_GET_ARG1(call); |
newcol = IPC_GET_ARG2(call); |
curs_goto(newrow, newcol); |
lastrow = newrow; |
lastcol = newcol; |
break; |
case FB_GET_CSIZE: |
ipc_answer_fast(callid, 0, HEIGHT, WIDTH); |
continue; |
case FB_CLEAR: |
clrscr(); |
retval = 0; |
break; |
case FB_SET_STYLE: |
fgcolor = IPC_GET_ARG1(call); |
bgcolor = IPC_GET_ARG2(call); |
if (fgcolor < bgcolor) |
set_style(0); |
else |
set_style(7); |
retval = 0; |
break; |
case FB_SCROLL: |
i = IPC_GET_ARG1(call); |
if (i > HEIGHT || i < -HEIGHT) { |
retval = EINVAL; |
break; |
} |
scroll(i); |
curs_goto(lastrow, lastcol); |
retval = 0; |
break; |
default: |
retval = ENOENT; |
} |
ipc_answer_fast(callid,retval,0,0); |
} |
} |
/** ANSI terminal emulation initialization */ |
void sysio_init(void) |
{ |
async_set_client_connection(sysio_client_connection); |
clrscr(); |
curs_goto(0,0); |
/* Set scrolling region to 0-25 lines */ |
sysputs("\033[0;25r"); |
} |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/fb/fb.c |
---|
0,0 → 1,1074 |
/* |
* Copyright (C) 2006 Jakub Vana |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @defgroup fbs Framebuffers |
* @brief HelenOS framebuffers. |
* @{ |
* @} |
*/ |
/** @defgroup fb Framebuffer |
* @brief HelenOS framebuffer. |
* @ingroup fbs |
* @{ |
*/ |
/** @file |
*/ |
#include <stdlib.h> |
#include <unistd.h> |
#include <string.h> |
#include <ddi.h> |
#include <sysinfo.h> |
#include <align.h> |
#include <as.h> |
#include <ipc/fb.h> |
#include <ipc/ipc.h> |
#include <ipc/ns.h> |
#include <ipc/services.h> |
#include <kernel/errno.h> |
#include <async.h> |
#include "font-8x16.h" |
#include "fb.h" |
#include "main.h" |
#include "../console/screenbuffer.h" |
#include "ppm.h" |
#define DEFAULT_BGCOLOR 0xf0f0f0 |
#define DEFAULT_FGCOLOR 0x0 |
/***************************************************************/ |
/* Pixel specific fuctions */ |
typedef void (*conv2scr_fn_t)(void *, int); |
typedef int (*conv2rgb_fn_t)(void *); |
struct { |
__u8 *fbaddress ; |
unsigned int xres ; |
unsigned int yres ; |
unsigned int scanline ; |
unsigned int pixelbytes ; |
conv2scr_fn_t rgb2scr; |
conv2rgb_fn_t scr2rgb; |
} screen; |
typedef struct { |
int initialized; |
unsigned int x, y; |
unsigned int width, height; |
/* Text support in window */ |
unsigned int rows, cols; |
/* Style for text printing */ |
style_t style; |
/* Auto-cursor position */ |
int cursor_active, cur_col, cur_row; |
int cursor_shown; |
} viewport_t; |
#define MAX_ANIM_LEN 8 |
#define MAX_ANIMATIONS 4 |
typedef struct { |
int initialized; |
int enabled; |
unsigned int vp; |
unsigned int pos; |
unsigned int animlen; |
unsigned int pixmaps[MAX_ANIM_LEN]; |
} animation_t; |
static animation_t animations[MAX_ANIMATIONS]; |
static int anims_enabled; |
/** Maximum number of saved pixmaps |
* Pixmap is a saved rectangle |
*/ |
#define MAX_PIXMAPS 256 |
typedef struct { |
unsigned int width; |
unsigned int height; |
__u8 *data; |
} pixmap_t; |
static pixmap_t pixmaps[MAX_PIXMAPS]; |
/* Viewport is a rectangular area on the screen */ |
#define MAX_VIEWPORTS 128 |
static viewport_t viewports[128]; |
/* Allow only 1 connection */ |
static int client_connected = 0; |
#define RED(x, bits) ((x >> (16 + 8 - bits)) & ((1 << bits) - 1)) |
#define GREEN(x, bits) ((x >> (8 + 8 - bits)) & ((1 << bits) - 1)) |
#define BLUE(x, bits) ((x >> (8 - bits)) & ((1 << bits) - 1)) |
#define COL_WIDTH 8 |
#define ROW_BYTES (screen.scanline * FONT_SCANLINES) |
#define POINTPOS(x, y) ((y) * screen.scanline + (x) * screen.pixelbytes) |
/* Conversion routines between different color representations */ |
static void rgb_4byte(void *dst, int rgb) |
{ |
*(int *)dst = rgb; |
} |
static int byte4_rgb(void *src) |
{ |
return (*(int *)src) & 0xffffff; |
} |
static void rgb_3byte(void *dst, int rgb) |
{ |
__u8 *scr = dst; |
#if (defined(BIG_ENDIAN) || defined(FB_BIG_ENDIAN)) |
scr[0] = RED(rgb, 8); |
scr[1] = GREEN(rgb, 8); |
scr[2] = BLUE(rgb, 8); |
#else |
scr[2] = RED(rgb, 8); |
scr[1] = GREEN(rgb, 8); |
scr[0] = BLUE(rgb, 8); |
#endif |
} |
static int byte3_rgb(void *src) |
{ |
__u8 *scr = src; |
#if (defined(BIG_ENDIAN) || defined(FB_BIG_ENDIAN)) |
return scr[0] << 16 | scr[1] << 8 | scr[2]; |
#else |
return scr[2] << 16 | scr[1] << 8 | scr[0]; |
#endif |
} |
/** 16-bit depth (5:6:5) */ |
static void rgb_2byte(void *dst, int rgb) |
{ |
/* 5-bit, 6-bits, 5-bits */ |
*((__u16 *)(dst)) = RED(rgb, 5) << 11 | GREEN(rgb, 6) << 5 | BLUE(rgb, 5); |
} |
/** 16-bit depth (5:6:5) */ |
static int byte2_rgb(void *src) |
{ |
int color = *(__u16 *)(src); |
return (((color >> 11) & 0x1f) << (16 + 3)) | (((color >> 5) & 0x3f) << (8 + 2)) | ((color & 0x1f) << 3); |
} |
/** Put pixel - 8-bit depth (3:2:3) */ |
static void rgb_1byte(void *dst, int rgb) |
{ |
*(__u8 *)dst = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | BLUE(rgb, 3); |
} |
/** Return pixel color - 8-bit depth (3:2:3) */ |
static int byte1_rgb(void *src) |
{ |
int color = *(__u8 *)src; |
return (((color >> 5) & 0x7) << (16 + 5)) | (((color >> 3) & 0x3) << (8 + 6)) | ((color & 0x7) << 5); |
} |
/** Put pixel into viewport |
* |
* @param vp Viewport identification |
* @param x X coord relative to viewport |
* @param y Y coord relative to viewport |
* @param color RGB color |
*/ |
static void putpixel(int vp, unsigned int x, unsigned int y, int color) |
{ |
int dx = viewports[vp].x + x; |
int dy = viewports[vp].y + y; |
(*screen.rgb2scr)(&screen.fbaddress[POINTPOS(dx,dy)],color); |
} |
/** Get pixel from viewport */ |
static int getpixel(int vp, unsigned int x, unsigned int y) |
{ |
int dx = viewports[vp].x + x; |
int dy = viewports[vp].y + y; |
return (*screen.scr2rgb)(&screen.fbaddress[POINTPOS(dx,dy)]); |
} |
/** Fill line with color BGCOLOR */ |
static void clear_line(int vp, unsigned int y) |
{ |
unsigned int x; |
for (x = 0; x < viewports[vp].width; x++) |
putpixel(vp, x, y, viewports[vp].style.bg_color); |
} |
static void draw_rectangle(int vp, unsigned int sx, unsigned int sy, |
unsigned int width, unsigned int height, |
int color) |
{ |
unsigned int x, y; |
/* Clear first line */ |
for (x = 0; x < width; x++) |
putpixel(vp, sx + x, sy, color); |
/* Recompute to screen coords */ |
sx += viewports[vp].x; |
sy += viewports[vp].y; |
/* Copy the rest */ |
for (y = sy+1;y < sy+height; y++) |
memcpy(&screen.fbaddress[POINTPOS(sx,y)], |
&screen.fbaddress[POINTPOS(sx,sy)], |
screen.pixelbytes * width); |
} |
/** Fill viewport with background color */ |
static void clear_port(int vp) |
{ |
viewport_t *vport = &viewports[vp]; |
draw_rectangle(vp, 0, 0, vport->width, vport->height, vport->style.bg_color); |
} |
/** Scroll port up/down |
* |
* @param vp Viewport to scroll |
* @param rows Positive number - scroll up, negative - scroll down |
*/ |
static void scroll_port(int vp, int rows) |
{ |
int y; |
int startline; |
int endline; |
viewport_t *vport = &viewports[vp]; |
if (rows > 0) { |
for (y=vport->y; y < vport->y+vport->height - rows*FONT_SCANLINES; y++) |
memcpy(&screen.fbaddress[POINTPOS(vport->x,y)], |
&screen.fbaddress[POINTPOS(vport->x,y + rows*FONT_SCANLINES)], |
screen.pixelbytes * vport->width); |
draw_rectangle(vp, 0, FONT_SCANLINES*(vport->rows - 1), |
vport->width, FONT_SCANLINES, vport->style.bg_color); |
} else if (rows < 0) { |
rows = -rows; |
for (y=vport->y + vport->height-1; y >= vport->y + rows*FONT_SCANLINES; y--) |
memcpy(&screen.fbaddress[POINTPOS(vport->x,y)], |
&screen.fbaddress[POINTPOS(vport->x,y - rows*FONT_SCANLINES)], |
screen.pixelbytes * vport->width); |
draw_rectangle(vp, 0, 0, vport->width, FONT_SCANLINES, vport->style.bg_color); |
} |
} |
static void invert_pixel(int vp,unsigned int x, unsigned int y) |
{ |
putpixel(vp, x, y, ~getpixel(vp, x, y)); |
} |
/***************************************************************/ |
/* Character-console functions */ |
/** Draw character at given position |
* |
* @param vp Viewport where the character is printed |
* @param sx Coordinates of top-left of the character |
* @param sy Coordinates of top-left of the character |
* @param style Color of the character |
* @param transparent If false, print background color |
*/ |
static void draw_glyph(int vp,__u8 glyph, unsigned int sx, unsigned int sy, |
style_t style, int transparent) |
{ |
int i; |
unsigned int y; |
unsigned int glline; |
for (y = 0; y < FONT_SCANLINES; y++) { |
glline = fb_font[glyph * FONT_SCANLINES + y]; |
for (i = 0; i < 8; i++) { |
if (glline & (1 << (7 - i))) |
putpixel(vp, sx + i, sy + y, style.fg_color); |
else if (!transparent) |
putpixel(vp, sx + i, sy + y, style.bg_color); |
} |
} |
} |
/** Invert character at given position */ |
static void invert_char(int vp,unsigned int row, unsigned int col) |
{ |
unsigned int x; |
unsigned int y; |
for (x = 0; x < COL_WIDTH; x++) |
for (y = 0; y < FONT_SCANLINES; y++) |
invert_pixel(vp, col * COL_WIDTH + x, row * FONT_SCANLINES + y); |
} |
/***************************************************************/ |
/* Stdout specific functions */ |
/** Create new viewport |
* |
* @return New viewport number |
*/ |
static int viewport_create(unsigned int x, unsigned int y,unsigned int width, |
unsigned int height) |
{ |
int i; |
for (i=0; i < MAX_VIEWPORTS; i++) { |
if (!viewports[i].initialized) |
break; |
} |
if (i == MAX_VIEWPORTS) |
return ELIMIT; |
if (width ==0 || height == 0 || |
x+width > screen.xres || y+height > screen.yres) |
return EINVAL; |
if (width < FONT_SCANLINES || height < COL_WIDTH) |
return EINVAL; |
viewports[i].x = x; |
viewports[i].y = y; |
viewports[i].width = width; |
viewports[i].height = height; |
viewports[i].rows = height / FONT_SCANLINES; |
viewports[i].cols = width / COL_WIDTH; |
viewports[i].style.bg_color = DEFAULT_BGCOLOR; |
viewports[i].style.fg_color = DEFAULT_FGCOLOR; |
viewports[i].cur_col = 0; |
viewports[i].cur_row = 0; |
viewports[i].cursor_active = 0; |
viewports[i].initialized = 1; |
return i; |
} |
/** Initialize framebuffer as a chardev output device |
* |
* @param addr Address of theframebuffer |
* @param x Screen width in pixels |
* @param y Screen height in pixels |
* @param bpp Bits per pixel (8, 16, 24, 32) |
* @param scan Bytes per one scanline |
* |
*/ |
static void screen_init(void *addr, unsigned int xres, unsigned int yres, unsigned int bpp, unsigned int scan) |
{ |
switch (bpp) { |
case 8: |
screen.rgb2scr = rgb_1byte; |
screen.scr2rgb = byte1_rgb; |
screen.pixelbytes = 1; |
break; |
case 16: |
screen.rgb2scr = rgb_2byte; |
screen.scr2rgb = byte2_rgb; |
screen.pixelbytes = 2; |
break; |
case 24: |
screen.rgb2scr = rgb_3byte; |
screen.scr2rgb = byte3_rgb; |
screen.pixelbytes = 3; |
break; |
case 32: |
screen.rgb2scr = rgb_4byte; |
screen.scr2rgb = byte4_rgb; |
screen.pixelbytes = 4; |
break; |
} |
screen.fbaddress = (unsigned char *) addr; |
screen.xres = xres; |
screen.yres = yres; |
screen.scanline = scan; |
/* Create first viewport */ |
viewport_create(0,0,xres,yres); |
} |
/** Hide cursor if it is shown */ |
static void cursor_hide(int vp) |
{ |
viewport_t *vport = &viewports[vp]; |
if (vport->cursor_active && vport->cursor_shown) { |
invert_char(vp, vport->cur_row, vport->cur_col); |
vport->cursor_shown = 0; |
} |
} |
/** Show cursor if cursor showing is enabled */ |
static void cursor_print(int vp) |
{ |
viewport_t *vport = &viewports[vp]; |
/* Do not check for cursor_shown */ |
if (vport->cursor_active) { |
invert_char(vp, vport->cur_row, vport->cur_col); |
vport->cursor_shown = 1; |
} |
} |
/** Invert cursor, if it is enabled */ |
static void cursor_blink(int vp) |
{ |
viewport_t *vport = &viewports[vp]; |
if (vport->cursor_shown) |
cursor_hide(vp); |
else |
cursor_print(vp); |
} |
/** Draw character at given position relative to viewport |
* |
* @param vp Viewport identification |
* @param c Character to print |
* @param row Screen position relative to viewport |
* @param col Screen position relative to viewport |
* @param transparent If false, print background color with character |
*/ |
static void draw_char(int vp, char c, unsigned int row, unsigned int col, style_t style, int transparent) |
{ |
viewport_t *vport = &viewports[vp]; |
/* Optimize - do not hide cursor if we are going to overwrite it */ |
if (vport->cursor_active && vport->cursor_shown && |
(vport->cur_col != col || vport->cur_row != row)) |
invert_char(vp, vport->cur_row, vport->cur_col); |
draw_glyph(vp, c, col * COL_WIDTH, row * FONT_SCANLINES, style, transparent); |
vport->cur_col = col; |
vport->cur_row = row; |
vport->cur_col++; |
if (vport->cur_col>= vport->cols) { |
vport->cur_col = 0; |
vport->cur_row++; |
if (vport->cur_row >= vport->rows) |
vport->cur_row--; |
} |
cursor_print(vp); |
} |
/** Draw text data to viewport |
* |
* @param vp Viewport id |
* @param data Text data fitting exactly into viewport |
*/ |
static void draw_text_data(int vp, keyfield_t *data) |
{ |
viewport_t *vport = &viewports[vp]; |
int i; |
char c; |
int col,row; |
clear_port(vp); |
for (i=0; i < vport->cols * vport->rows; i++) { |
if (data[i].character == ' ' && style_same(data[i].style,vport->style)) |
continue; |
col = i % vport->cols; |
row = i / vport->cols; |
draw_glyph(vp, data[i].character, col * COL_WIDTH, row * FONT_SCANLINES, |
data[i].style, style_same(data[i].style,vport->style)); |
} |
cursor_print(vp); |
} |
/** Return first free pixmap */ |
static int find_free_pixmap(void) |
{ |
int i; |
for (i=0;i < MAX_PIXMAPS;i++) |
if (!pixmaps[i].data) |
return i; |
return -1; |
} |
static void putpixel_pixmap(int pm, unsigned int x, unsigned int y, int color) |
{ |
pixmap_t *pmap = &pixmaps[pm]; |
int pos = (y * pmap->width + x) * screen.pixelbytes; |
(*screen.rgb2scr)(&pmap->data[pos],color); |
} |
/** Create a new pixmap and return appropriate ID */ |
static int shm2pixmap(char *shm, size_t size) |
{ |
int pm; |
pixmap_t *pmap; |
pm = find_free_pixmap(); |
if (pm == -1) |
return ELIMIT; |
pmap = &pixmaps[pm]; |
if (ppm_get_data(shm, size, &pmap->width, &pmap->height)) |
return EINVAL; |
pmap->data = malloc(pmap->width * pmap->height * screen.pixelbytes); |
if (!pmap->data) |
return ENOMEM; |
ppm_draw(shm, size, 0, 0, pmap->width, pmap->height, |
putpixel_pixmap, pm); |
return pm; |
} |
/** Handle shared memory communication calls |
* |
* Protocol for drawing pixmaps: |
* - FB_PREPARE_SHM(client shm identification) |
* - IPC_M_SEND_AS_AREA |
* - FB_DRAW_PPM(startx,starty) |
* - FB_DROP_SHM |
* |
* Protocol for text drawing |
* - IPC_M_SEND_AS_AREA |
* - FB_DRAW_TEXT_DATA |
* |
* @param callid Callid of the current call |
* @param call Current call data |
* @param vp Active viewport |
* @return 0 if the call was not handled byt this function, 1 otherwise |
* |
* note: this function is not threads safe, you would have |
* to redefine static variables with __thread |
*/ |
static int shm_handle(ipc_callid_t callid, ipc_call_t *call, int vp) |
{ |
static keyfield_t *interbuffer = NULL; |
static size_t intersize = 0; |
static char *shm = NULL; |
static ipcarg_t shm_id = 0; |
static size_t shm_size; |
int handled = 1; |
int retval = 0; |
viewport_t *vport = &viewports[vp]; |
unsigned int x,y; |
switch (IPC_GET_METHOD(*call)) { |
case IPC_M_AS_AREA_SEND: |
/* We accept one area for data interchange */ |
if (IPC_GET_ARG1(*call) == shm_id) { |
void *dest = as_get_mappable_page(IPC_GET_ARG2(*call)); |
shm_size = IPC_GET_ARG2(*call); |
if (!ipc_answer_fast(callid, 0, (sysarg_t)dest, 0)) |
shm = dest; |
else |
shm_id = 0; |
if (shm[0] != 'P') |
while (1) |
; |
return 1; |
} else { |
intersize = IPC_GET_ARG2(*call); |
receive_comm_area(callid,call,(void **)&interbuffer); |
} |
return 1; |
case FB_PREPARE_SHM: |
if (shm_id) |
retval = EBUSY; |
else |
shm_id = IPC_GET_ARG1(*call); |
break; |
case FB_DROP_SHM: |
if (shm) { |
as_area_destroy(shm); |
shm = NULL; |
} |
shm_id = 0; |
break; |
case FB_SHM2PIXMAP: |
if (!shm) { |
retval = EINVAL; |
break; |
} |
retval = shm2pixmap(shm, shm_size); |
break; |
case FB_DRAW_PPM: |
if (!shm) { |
retval = EINVAL; |
break; |
} |
x = IPC_GET_ARG1(*call); |
y = IPC_GET_ARG2(*call); |
if (x > vport->width || y > vport->height) { |
retval = EINVAL; |
break; |
} |
ppm_draw(shm, shm_size, IPC_GET_ARG1(*call), IPC_GET_ARG2(*call), |
vport->width - x, vport->height - y, putpixel, vp); |
break; |
case FB_DRAW_TEXT_DATA: |
if (!interbuffer) { |
retval = EINVAL; |
break; |
} |
if (intersize < vport->cols*vport->rows*sizeof(*interbuffer)) { |
retval = EINVAL; |
break; |
} |
draw_text_data(vp, interbuffer); |
break; |
default: |
handled = 0; |
} |
if (handled) |
ipc_answer_fast(callid, retval, 0, 0); |
return handled; |
} |
/** Save viewport to pixmap */ |
static int save_vp_to_pixmap(int vp) |
{ |
int pm; |
pixmap_t *pmap; |
viewport_t *vport = &viewports[vp]; |
int x,y; |
int rowsize; |
int tmp; |
pm = find_free_pixmap(); |
if (pm == -1) |
return ELIMIT; |
pmap = &pixmaps[pm]; |
pmap->data = malloc(screen.pixelbytes * vport->width * vport->height); |
if (!pmap->data) |
return ENOMEM; |
pmap->width = vport->width; |
pmap->height = vport->height; |
rowsize = vport->width * screen.pixelbytes; |
for (y=0;y < vport->height; y++) { |
tmp = (vport->y + y) * screen.scanline + vport->x * screen.pixelbytes; |
memcpy(pmap->data + rowsize*y, screen.fbaddress + tmp, rowsize); |
} |
return pm; |
} |
/** Draw pixmap on screen |
* |
* @param vp Viewport to draw on |
* @param pm Pixmap identifier |
*/ |
static int draw_pixmap(int vp, int pm) |
{ |
pixmap_t *pmap = &pixmaps[pm]; |
viewport_t *vport = &viewports[vp]; |
int x,y; |
int tmp, srcrowsize; |
int realwidth, realheight, realrowsize; |
if (!pmap->data) |
return EINVAL; |
realwidth = pmap->width <= vport->width ? pmap->width : vport->width; |
realheight = pmap->height <= vport->height ? pmap->height : vport->height; |
srcrowsize = vport->width * screen.pixelbytes; |
realrowsize = realwidth * screen.pixelbytes; |
for (y=0; y < realheight; y++) { |
tmp = (vport->y + y) * screen.scanline + vport->x * screen.pixelbytes; |
memcpy(screen.fbaddress + tmp, pmap->data + y * srcrowsize, realrowsize); |
} |
return 0; |
} |
/** Tick animation one step forward */ |
static void anims_tick(void) |
{ |
int i; |
static int counts = 0; |
/* Limit redrawing */ |
counts = (counts+1) % 8; |
if (counts) |
return; |
for (i=0; i < MAX_ANIMATIONS; i++) { |
if (!animations[i].animlen || !animations[i].initialized || !animations[i].enabled) |
continue; |
draw_pixmap(animations[i].vp, animations[i].pixmaps[animations[i].pos]); |
animations[i].pos = (animations[i].pos+1) % animations[i].animlen; |
} |
} |
static int anim_handle(ipc_callid_t callid, ipc_call_t *call, int vp) |
{ |
int handled = 1; |
int retval = 0; |
int i,nvp; |
int newval; |
switch (IPC_GET_METHOD(*call)) { |
case FB_ANIM_CREATE: |
nvp = IPC_GET_ARG1(*call); |
if (nvp == -1) |
nvp = vp; |
if (nvp >= MAX_VIEWPORTS || nvp < 0 || !viewports[nvp].initialized) { |
retval = EINVAL; |
break; |
} |
for (i=0; i < MAX_ANIMATIONS; i++) { |
if (! animations[i].initialized) |
break; |
} |
if (i == MAX_ANIMATIONS) { |
retval = ELIMIT; |
break; |
} |
animations[i].initialized = 1; |
animations[i].animlen = 0; |
animations[i].pos = 0; |
animations[i].enabled = 0; |
animations[i].vp = nvp; |
retval = i; |
break; |
case FB_ANIM_DROP: |
i = IPC_GET_ARG1(*call); |
if (nvp >= MAX_ANIMATIONS || i < 0) { |
retval = EINVAL; |
break; |
} |
animations[i].initialized = 0; |
break; |
case FB_ANIM_ADDPIXMAP: |
i = IPC_GET_ARG1(*call); |
if (i >= MAX_ANIMATIONS || i < 0 || !animations[i].initialized) { |
retval = EINVAL; |
break; |
} |
if (animations[i].animlen == MAX_ANIM_LEN) { |
retval = ELIMIT; |
break; |
} |
newval = IPC_GET_ARG2(*call); |
if (newval < 0 || newval > MAX_PIXMAPS || !pixmaps[newval].data) { |
retval = EINVAL; |
break; |
} |
animations[i].pixmaps[animations[i].animlen++] = newval; |
break; |
case FB_ANIM_CHGVP: |
i = IPC_GET_ARG1(*call); |
if (i >= MAX_ANIMATIONS || i < 0) { |
retval = EINVAL; |
break; |
} |
nvp = IPC_GET_ARG2(*call); |
if (nvp == -1) |
nvp = vp; |
if (nvp >= MAX_VIEWPORTS || nvp < 0 || !viewports[nvp].initialized) { |
retval = EINVAL; |
break; |
} |
animations[i].vp = nvp; |
break; |
case FB_ANIM_START: |
case FB_ANIM_STOP: |
i = IPC_GET_ARG1(*call); |
if (i >= MAX_ANIMATIONS || i < 0) { |
retval = EINVAL; |
break; |
} |
newval = (IPC_GET_METHOD(*call) == FB_ANIM_START); |
if (newval ^ animations[i].enabled) { |
animations[i].enabled = newval; |
anims_enabled += newval ? 1 : -1; |
} |
break; |
default: |
handled = 0; |
} |
if (handled) |
ipc_answer_fast(callid, retval, 0, 0); |
return handled; |
} |
/** Handler for messages concerning pixmap handling */ |
static int pixmap_handle(ipc_callid_t callid, ipc_call_t *call, int vp) |
{ |
int handled = 1; |
int retval = 0; |
int i,nvp; |
switch (IPC_GET_METHOD(*call)) { |
case FB_VP_DRAW_PIXMAP: |
nvp = IPC_GET_ARG1(*call); |
if (nvp == -1) |
nvp = vp; |
if (nvp < 0 || nvp >= MAX_VIEWPORTS || !viewports[nvp].initialized) { |
retval = EINVAL; |
break; |
} |
i = IPC_GET_ARG2(*call); |
retval = draw_pixmap(nvp, i); |
break; |
case FB_VP2PIXMAP: |
nvp = IPC_GET_ARG1(*call); |
if (nvp == -1) |
nvp = vp; |
if (nvp < 0 || nvp >= MAX_VIEWPORTS || !viewports[nvp].initialized) |
retval = EINVAL; |
else |
retval = save_vp_to_pixmap(nvp); |
break; |
case FB_DROP_PIXMAP: |
i = IPC_GET_ARG1(*call); |
if (i >= MAX_PIXMAPS) { |
retval = EINVAL; |
break; |
} |
if (pixmaps[i].data) { |
free(pixmaps[i].data); |
pixmaps[i].data = NULL; |
} |
break; |
default: |
handled = 0; |
} |
if (handled) |
ipc_answer_fast(callid, retval, 0, 0); |
return handled; |
} |
/** Function for handling connections to FB |
* |
*/ |
static void fb_client_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
int retval; |
int i; |
unsigned int row,col; |
char c; |
int vp = 0; |
viewport_t *vport = &viewports[0]; |
if (client_connected) { |
ipc_answer_fast(iid, ELIMIT, 0,0); |
return; |
} |
client_connected = 1; |
ipc_answer_fast(iid, 0, 0, 0); /* Accept connection */ |
while (1) { |
if (vport->cursor_active || anims_enabled) |
callid = async_get_call_timeout(&call,250000); |
else |
callid = async_get_call(&call); |
if (!callid) { |
cursor_blink(vp); |
anims_tick(); |
continue; |
} |
if (shm_handle(callid, &call, vp)) |
continue; |
if (pixmap_handle(callid, &call, vp)) |
continue; |
if (anim_handle(callid, &call, vp)) |
continue; |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
client_connected = 0; |
/* cleanup other viewports */ |
for (i=1; i < MAX_VIEWPORTS; i++) |
vport->initialized = 0; |
return; /* Exit thread */ |
case FB_PUTCHAR: |
case FB_TRANS_PUTCHAR: |
c = IPC_GET_ARG1(call); |
row = IPC_GET_ARG2(call); |
col = IPC_GET_ARG3(call); |
if (row >= vport->rows || col >= vport->cols) { |
retval = EINVAL; |
break; |
} |
ipc_answer_fast(callid,0,0,0); |
draw_char(vp, c, row, col, vport->style, IPC_GET_METHOD(call) == FB_TRANS_PUTCHAR); |
continue; /* msg already answered */ |
case FB_CLEAR: |
clear_port(vp); |
cursor_print(vp); |
retval = 0; |
break; |
case FB_CURSOR_GOTO: |
row = IPC_GET_ARG1(call); |
col = IPC_GET_ARG2(call); |
if (row >= vport->rows || col >= vport->cols) { |
retval = EINVAL; |
break; |
} |
retval = 0; |
cursor_hide(vp); |
vport->cur_col = col; |
vport->cur_row = row; |
cursor_print(vp); |
break; |
case FB_CURSOR_VISIBILITY: |
cursor_hide(vp); |
vport->cursor_active = IPC_GET_ARG1(call); |
cursor_print(vp); |
retval = 0; |
break; |
case FB_GET_CSIZE: |
ipc_answer_fast(callid, 0, vport->rows, vport->cols); |
continue; |
case FB_SCROLL: |
i = IPC_GET_ARG1(call); |
if (i > vport->rows || i < (- (int)vport->rows)) { |
retval = EINVAL; |
break; |
} |
cursor_hide(vp); |
scroll_port(vp, i); |
cursor_print(vp); |
retval = 0; |
break; |
case FB_VIEWPORT_SWITCH: |
i = IPC_GET_ARG1(call); |
if (i < 0 || i >= MAX_VIEWPORTS) { |
retval = EINVAL; |
break; |
} |
if (! viewports[i].initialized ) { |
retval = EADDRNOTAVAIL; |
break; |
} |
cursor_hide(vp); |
vp = i; |
vport = &viewports[vp]; |
cursor_print(vp); |
retval = 0; |
break; |
case FB_VIEWPORT_CREATE: |
retval = viewport_create(IPC_GET_ARG1(call) >> 16, |
IPC_GET_ARG1(call) & 0xffff, |
IPC_GET_ARG2(call) >> 16, |
IPC_GET_ARG2(call) & 0xffff); |
break; |
case FB_VIEWPORT_DELETE: |
i = IPC_GET_ARG1(call); |
if (i < 0 || i >= MAX_VIEWPORTS) { |
retval = EINVAL; |
break; |
} |
if (! viewports[i].initialized ) { |
retval = EADDRNOTAVAIL; |
break; |
} |
viewports[i].initialized = 0; |
retval = 0; |
break; |
case FB_SET_STYLE: |
vport->style.fg_color = IPC_GET_ARG1(call); |
vport->style.bg_color = IPC_GET_ARG2(call); |
retval = 0; |
break; |
case FB_GET_RESOLUTION: |
ipc_answer_fast(callid, 0, screen.xres,screen.yres); |
continue; |
default: |
retval = ENOENT; |
} |
ipc_answer_fast(callid,retval,0,0); |
} |
} |
/** Initialization of framebuffer */ |
int fb_init(void) |
{ |
void *fb_ph_addr; |
unsigned int fb_width; |
unsigned int fb_height; |
unsigned int fb_bpp; |
unsigned int fb_scanline; |
void *fb_addr; |
size_t asz; |
async_set_client_connection(fb_client_connection); |
fb_ph_addr=(void *)sysinfo_value("fb.address.physical"); |
fb_width=sysinfo_value("fb.width"); |
fb_height=sysinfo_value("fb.height"); |
fb_bpp=sysinfo_value("fb.bpp"); |
fb_scanline=sysinfo_value("fb.scanline"); |
asz = fb_scanline*fb_height; |
fb_addr = as_get_mappable_page(asz); |
map_physmem(fb_ph_addr, fb_addr, ALIGN_UP(asz,PAGE_SIZE) >>PAGE_WIDTH, |
AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE); |
screen_init(fb_addr, fb_width, fb_height, fb_bpp, fb_scanline); |
return 0; |
} |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/fb/sysio.h |
---|
0,0 → 1,46 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup sysio |
* @brief HelenOS framebuffer emulation via kernel. |
* @ingroup fbs |
* @{ |
*/ |
/** @file |
*/ |
#ifndef _SYSIO_H_ |
#define _SYSIO_H_ |
void sysio_init(void); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/fb/ega.c |
---|
0,0 → 1,368 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @defgroup egafb EGA framebuffer |
* @brief HelenOS EGA framebuffer. |
* @ingroup fbs |
* @{ |
*/ |
/** @file |
*/ |
#include <stdlib.h> |
#include <unistd.h> |
#include <align.h> |
#include <async.h> |
#include <ipc/ipc.h> |
#include <errno.h> |
#include <stdio.h> |
#include <ddi.h> |
#include <sysinfo.h> |
#include <as.h> |
#include <ipc/fb.h> |
#include <ipc/ipc.h> |
#include <ipc/ns.h> |
#include <ipc/services.h> |
#include "ega.h" |
#include "../console/screenbuffer.h" |
#include "main.h" |
#define MAX_SAVED_SCREENS 256 |
typedef struct saved_screen { |
short *data; |
} saved_screen; |
saved_screen saved_screens[MAX_SAVED_SCREENS]; |
#define EGA_IO_ADDRESS 0x3d4 |
#define EGA_IO_SIZE 2 |
#define NORMAL_COLOR 0x0f |
#define INVERTED_COLOR 0xf0 |
#define EGA_STYLE(fg,bg) ((fg) > (bg) ? NORMAL_COLOR : INVERTED_COLOR) |
typedef unsigned char u8; |
typedef unsigned short u16; |
typedef unsigned int u32; |
/* Allow only 1 connection */ |
static int client_connected = 0; |
static unsigned int scr_width; |
static unsigned int scr_height; |
static char *scr_addr; |
static unsigned int style = NORMAL_COLOR; |
static inline void outb(u16 port, u8 b) |
{ |
asm volatile ("outb %0, %1\n" :: "a" (b), "d" (port)); |
} |
static inline void outw(u16 port, u16 w) |
{ |
asm volatile ("outw %0, %1\n" :: "a" (w), "d" (port)); |
} |
static inline void outl(u16 port, u32 l) |
{ |
asm volatile ("outl %0, %1\n" :: "a" (l), "d" (port)); |
} |
static inline u8 inb(u16 port) |
{ |
u8 val; |
asm volatile ("inb %1, %0 \n" : "=a" (val) : "d"(port)); |
return val; |
} |
static inline u16 inw(u16 port) |
{ |
u16 val; |
asm volatile ("inw %1, %0 \n" : "=a" (val) : "d"(port)); |
return val; |
} |
static inline u32 inl(u16 port) |
{ |
u32 val; |
asm volatile ("inl %1, %0 \n" : "=a" (val) : "d"(port)); |
return val; |
} |
static void clrscr(void) |
{ |
int i; |
for (i=0; i < scr_width*scr_height; i++) { |
scr_addr[i*2] = ' '; |
scr_addr[i*2+1] = style; |
} |
} |
static void cursor_goto(unsigned int row, unsigned int col) |
{ |
int ega_cursor; |
ega_cursor=col+scr_width*row; |
outb(EGA_IO_ADDRESS , 0xe); |
outb(EGA_IO_ADDRESS + 1, (ega_cursor >>8) & 0xff); |
outb(EGA_IO_ADDRESS , 0xf); |
outb(EGA_IO_ADDRESS + 1, ega_cursor & 0xff); |
} |
static void cursor_disable(void) |
{ |
u8 stat; |
outb(EGA_IO_ADDRESS , 0xa); |
stat=inb(EGA_IO_ADDRESS + 1); |
outb(EGA_IO_ADDRESS , 0xa); |
outb(EGA_IO_ADDRESS +1 ,stat | (1<<5) ); |
} |
static void cursor_enable(void) |
{ |
u8 stat; |
outb(EGA_IO_ADDRESS , 0xa); |
stat=inb(EGA_IO_ADDRESS + 1); |
outb(EGA_IO_ADDRESS , 0xa); |
outb(EGA_IO_ADDRESS +1 ,stat & (~(1<<5)) ); |
} |
static void scroll(int rows) |
{ |
int i; |
if (rows > 0) { |
memcpy (scr_addr,((char *)scr_addr) + rows * scr_width * 2, scr_width * scr_height * 2 - rows * scr_width * 2); |
for (i = 0; i < rows * scr_width ; i ++) |
(((short *)scr_addr) + scr_width * scr_height - rows * scr_width) [i] = ((style << 8) + ' '); |
} else if (rows < 0) { |
memcpy (((char *)scr_addr) - rows * scr_width * 2 ,scr_addr ,scr_width * scr_height * 2 + rows * scr_width * 2); |
for (i = 0; i < - rows * scr_width ; i++) |
((short *)scr_addr) [i] = ((style << 8 ) + ' '); |
} |
} |
static void printchar(char c, unsigned int row, unsigned int col) |
{ |
scr_addr[(row*scr_width + col)*2] = c; |
scr_addr[(row*scr_width + col)*2+1] = style; |
cursor_goto(row,col+1); |
} |
static void draw_text_data(keyfield_t *data) |
{ |
int i; |
for (i=0; i < scr_width*scr_height; i++) { |
scr_addr[i*2] = data[i].character; |
scr_addr[i*2+1] = EGA_STYLE(data[i].style.fg_color, data[i].style.bg_color); |
} |
} |
static int save_screen(void) |
{ |
int i; |
short *mem; |
for (i=0 ;( i < MAX_SAVED_SCREENS ) && (saved_screens[i].data); i++); |
if (i == MAX_SAVED_SCREENS) |
return EINVAL; |
if (!(saved_screens[i].data=malloc( 2 * scr_width*scr_height ))) |
return ENOMEM; |
memcpy (saved_screens[i].data ,scr_addr ,2 * scr_width * scr_height) |
; |
return i; |
} |
static int print_screen(int i) |
{ |
if (saved_screens[i].data) |
memcpy (scr_addr,saved_screens[i].data, 2 * scr_width * scr_height); |
else return EINVAL; |
return i; |
} |
static void ega_client_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
int retval; |
ipc_callid_t callid; |
ipc_call_t call; |
char c; |
unsigned int row, col; |
int bgcolor,fgcolor; |
keyfield_t *interbuf = NULL; |
size_t intersize = 0; |
int i; |
if (client_connected) { |
ipc_answer_fast(iid, ELIMIT, 0,0); |
return; |
} |
client_connected = 1; |
ipc_answer_fast(iid, 0, 0, 0); /* Accept connection */ |
while (1) { |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
client_connected = 0; |
ipc_answer_fast(callid,0,0,0); |
return; /* Exit thread */ |
case IPC_M_AS_AREA_SEND: |
/* We accept one area for data interchange */ |
intersize = IPC_GET_ARG2(call); |
if (intersize >= scr_width*scr_height*sizeof(*interbuf)) { |
receive_comm_area(callid,&call,(void **)&interbuf); |
continue; |
} |
retval = EINVAL; |
break; |
case FB_DRAW_TEXT_DATA: |
if (!interbuf) { |
retval = EINVAL; |
break; |
} |
draw_text_data(interbuf); |
retval = 0; |
break; |
case FB_GET_CSIZE: |
ipc_answer_fast(callid, 0, scr_height, scr_width); |
continue; |
case FB_CLEAR: |
clrscr(); |
retval = 0; |
break; |
case FB_PUTCHAR: |
c = IPC_GET_ARG1(call); |
row = IPC_GET_ARG2(call); |
col = IPC_GET_ARG3(call); |
if (col >= scr_width || row >= scr_height) { |
retval = EINVAL; |
break; |
} |
printchar(c,row,col); |
retval = 0; |
break; |
case FB_CURSOR_GOTO: |
row = IPC_GET_ARG1(call); |
col = IPC_GET_ARG2(call); |
if (row >= scr_height || col >= scr_width) { |
retval = EINVAL; |
break; |
} |
cursor_goto(row,col); |
retval = 0; |
break; |
case FB_SCROLL: |
i = IPC_GET_ARG1(call); |
if (i > scr_height || i < (- (int)scr_height)) { |
retval = EINVAL; |
break; |
} |
scroll(i); |
retval = 0; |
break; |
case FB_CURSOR_VISIBILITY: |
if(IPC_GET_ARG1(call)) |
cursor_enable(); |
else |
cursor_disable(); |
retval = 0; |
break; |
case FB_SET_STYLE: |
fgcolor = IPC_GET_ARG1(call); |
bgcolor = IPC_GET_ARG2(call); |
style = EGA_STYLE(fgcolor, bgcolor); |
break; |
case FB_VP_DRAW_PIXMAP: |
i = IPC_GET_ARG2(call); |
retval = print_screen(i); |
break; |
case FB_VP2PIXMAP: |
retval = save_screen(); |
break; |
case FB_DROP_PIXMAP: |
i = IPC_GET_ARG1(call); |
if (i >= MAX_SAVED_SCREENS) { |
retval = EINVAL; |
break; |
} |
if (saved_screens[i].data) { |
free(saved_screens[i].data); |
saved_screens[i].data = NULL; |
} |
break; |
default: |
retval = ENOENT; |
} |
ipc_answer_fast(callid,retval,0,0); |
} |
} |
int ega_init(void) |
{ |
void *ega_ph_addr; |
size_t sz; |
ega_ph_addr=(void *)sysinfo_value("fb.address.physical"); |
scr_width=sysinfo_value("fb.width"); |
scr_height=sysinfo_value("fb.height"); |
iospace_enable(task_get_id(),(void *)EGA_IO_ADDRESS,2); |
sz = scr_width*scr_height*2; |
scr_addr = as_get_mappable_page(sz); |
map_physmem(ega_ph_addr, scr_addr, ALIGN_UP(sz,PAGE_SIZE)>>PAGE_WIDTH, |
AS_AREA_READ | AS_AREA_WRITE); |
async_set_client_connection(ega_client_connection); |
return 0; |
} |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/fb/fb.h |
---|
0,0 → 1,45 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup fb |
* @ingroup fbs |
* @{ |
*/ |
/** @file |
*/ |
#ifndef _FB_H_ |
#define _FB_H_ |
int fb_init(void); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/fb/main.c |
---|
0,0 → 1,81 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <sysinfo.h> |
#include <async.h> |
#include <as.h> |
#include <align.h> |
#include <errno.h> |
#include "fb.h" |
#include "sysio.h" |
#include "ega.h" |
#include "main.h" |
void receive_comm_area(ipc_callid_t callid, ipc_call_t *call, void **area) |
{ |
void *dest; |
dest = as_get_mappable_page(IPC_GET_ARG2(*call)); |
if (ipc_answer_fast(callid, 0, (sysarg_t)dest, 0) == 0) { |
if (*area) |
as_area_destroy(*area); |
*area = dest; |
} |
} |
int main(int argc, char *argv[]) |
{ |
ipcarg_t phonead; |
int initialized = 0; |
#ifdef FB_ENABLED |
if (sysinfo_value("fb.kind") == 1) { |
if (fb_init() == 0) |
initialized = 1; |
} |
#endif |
#ifdef EGA_ENABLED |
if (! initialized && sysinfo_value("fb.kind") == 2) { |
if (ega_init() == 0) |
initialized = 1; |
} |
#endif |
if (!initialized) |
sysio_init(); |
if (ipc_connect_to_me(PHONE_NS, SERVICE_VIDEO, 0, &phonead) != 0) |
return -1; |
async_manager(); |
/* Never reached */ |
return 0; |
} |
/tags/0.2.0/uspace/fb/Makefile |
---|
0,0 → 1,97 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../libc |
SOFTINT_PREFIX = ../softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I../libipc/include |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = fb |
SOURCES = \ |
main.c \ |
sysio.c \ |
ppm.c |
ifneq ($(ARCH), ia64) |
SOURCES += fb.c \ |
font-8x16.c |
CFLAGS += -DFB_ENABLED |
endif |
ifeq ($(ARCH), ia32) |
SOURCES += ega.c |
CFLAGS += -DEGA_ENABLED |
endif |
ifeq ($(ARCH), amd64) |
SOURCES += ega.c |
CFLAGS += -DEGA_ENABLED |
endif |
ifeq ($(ARCH), mips32) |
CFLAGS += -DFB_BIG_ENDIAN |
endif |
CFLAGS += -D$(ARCH) |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.2.0/uspace/fb/ppm.h |
---|
0,0 → 1,38 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
#ifndef _PPM_H_ |
#define _PPM_H_ |
int ppm_draw(unsigned char *data, size_t datasz, unsigned int sx, |
unsigned int sy, |
unsigned int maxwidth, unsigned int maxheight, |
void (*putpixel)(int,unsigned int, unsigned int, int),int vp); |
int ppm_get_data(unsigned char *data, size_t dtsz, int *width, int *height); |
#endif |
/tags/0.2.0/uspace/fb/ppm.c |
---|
0,0 → 1,127 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
#include <types.h> |
#include <errno.h> |
#include "ppm.h" |
static void skip_whitespace(unsigned char **data) |
{ |
retry: |
while (**data == ' ' || **data == '\t' || **data == '\n' || **data == '\r') |
(*data)++; |
if (**data == '#') { |
while (1) { |
if (**data == '\n' || **data == '\r') |
break; |
(*data)++; |
} |
goto retry; |
} |
} |
static void read_num(unsigned char **data, unsigned int *num) |
{ |
*num = 0; |
while (**data >= '0' && **data <= '9') { |
*num *= 10; |
*num += **data - '0'; |
(*data)++; |
} |
} |
int ppm_get_data(unsigned char *data, size_t dtsz, int *width, int *height) |
{ |
/* Read magic */ |
if (data[0] != 'P' || data[1] != '6') |
return EINVAL; |
data+=2; |
skip_whitespace(&data); |
read_num(&data, width); |
skip_whitespace(&data); |
read_num(&data,height); |
return 0; |
} |
/** Draw PPM pixmap |
* |
* @param data Pointer to PPM data |
* @param datasz Maximum data size |
* @param x Coordinate of upper left corner |
* @param y Coordinate of upper left corner |
* @param maxwidth Maximum allowed width for picture |
* @param maxheight Maximum allowed height for picture |
* @param putpixel Putpixel function used to print bitmap |
*/ |
int ppm_draw(unsigned char *data, size_t datasz, unsigned int sx, |
unsigned int sy, |
unsigned int maxwidth, unsigned int maxheight, |
void (*putpixel)(int,unsigned int, unsigned int, int),int vp) |
{ |
unsigned int width, height; |
unsigned int maxcolor; |
int i; |
void *maxdatap = data + datasz; |
unsigned int color; |
unsigned int coef; |
/* Read magic */ |
if (data[0] != 'P' || data[1] != '6') |
return EINVAL; |
data+=2; |
skip_whitespace(&data); |
read_num(&data, &width); |
skip_whitespace(&data); |
read_num(&data,&height); |
skip_whitespace(&data); |
read_num(&data,&maxcolor); |
data++; |
if (maxcolor == 0 || maxcolor > 255 || width*height > datasz) { |
return EINVAL; |
} |
coef = 255/maxcolor; |
if (coef*maxcolor > 255) |
coef -= 1; |
for (i=0; i < width*height; i++) { |
/* Crop picture if we don't fit into region */ |
if (i % width > maxwidth || i/width > maxheight) { |
data += 3; |
continue; |
} |
color = ((data[0]*coef) << 16) + ((data[1]*coef) << 8) + data[2]*coef; |
(*putpixel)(vp, sx+(i % width), sy+(i / width), color); |
data += 3; |
} |
} |
/tags/0.2.0/uspace/fb/main.h |
---|
0,0 → 1,34 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
#ifndef __MAIN_H_ |
#define __MAIN_H_ |
void receive_comm_area(ipc_callid_t callid, ipc_call_t *call, void **area); |
#endif |
/tags/0.2.0/uspace/fb/font-8x16.h |
---|
0,0 → 1,37 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
#ifndef __FONT_8X16_H__ |
#define __FONT_8X16_H__ |
#define FONT_GLIPHS 256 |
#define FONT_SCANLINES 16 |
extern unsigned char fb_font[FONT_GLIPHS * FONT_SCANLINES]; |
#endif |
/tags/0.2.0/uspace/fb/font-8x16.c |
---|
0,0 → 1,4641 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
#include "font-8x16.h" |
unsigned char fb_font[FONT_GLIPHS * FONT_SCANLINES] = { |
/* 0 0x00 '^@' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 1 0x01 '^A' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x81, /* 10000001 */ |
0xa5, /* 10100101 */ |
0x81, /* 10000001 */ |
0x81, /* 10000001 */ |
0xbd, /* 10111101 */ |
0x99, /* 10011001 */ |
0x81, /* 10000001 */ |
0x81, /* 10000001 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 2 0x02 '^B' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0xff, /* 11111111 */ |
0xdb, /* 11011011 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xc3, /* 11000011 */ |
0xe7, /* 11100111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 3 0x03 '^C' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 4 0x04 '^D' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x7c, /* 01111100 */ |
0xfe, /* 11111110 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 5 0x05 '^E' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0xe7, /* 11100111 */ |
0xe7, /* 11100111 */ |
0xe7, /* 11100111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 6 0x06 '^F' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 7 0x07 '^G' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 8 0x08 '^H' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xe7, /* 11100111 */ |
0xc3, /* 11000011 */ |
0xc3, /* 11000011 */ |
0xe7, /* 11100111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 9 0x09 '^I' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x42, /* 01000010 */ |
0x42, /* 01000010 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 10 0x0a '^J' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xc3, /* 11000011 */ |
0x99, /* 10011001 */ |
0xbd, /* 10111101 */ |
0xbd, /* 10111101 */ |
0x99, /* 10011001 */ |
0xc3, /* 11000011 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 11 0x0b '^K' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1e, /* 00011110 */ |
0x0e, /* 00001110 */ |
0x1a, /* 00011010 */ |
0x32, /* 00110010 */ |
0x78, /* 01111000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 12 0x0c '^L' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 13 0x0d '^M' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3f, /* 00111111 */ |
0x33, /* 00110011 */ |
0x3f, /* 00111111 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x70, /* 01110000 */ |
0xf0, /* 11110000 */ |
0xe0, /* 11100000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 14 0x0e '^N' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7f, /* 01111111 */ |
0x63, /* 01100011 */ |
0x7f, /* 01111111 */ |
0x63, /* 01100011 */ |
0x63, /* 01100011 */ |
0x63, /* 01100011 */ |
0x63, /* 01100011 */ |
0x67, /* 01100111 */ |
0xe7, /* 11100111 */ |
0xe6, /* 11100110 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 15 0x0f '^O' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xdb, /* 11011011 */ |
0x3c, /* 00111100 */ |
0xe7, /* 11100111 */ |
0x3c, /* 00111100 */ |
0xdb, /* 11011011 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 16 0x10 '^P' */ |
0x00, /* 00000000 */ |
0x80, /* 10000000 */ |
0xc0, /* 11000000 */ |
0xe0, /* 11100000 */ |
0xf0, /* 11110000 */ |
0xf8, /* 11111000 */ |
0xfe, /* 11111110 */ |
0xf8, /* 11111000 */ |
0xf0, /* 11110000 */ |
0xe0, /* 11100000 */ |
0xc0, /* 11000000 */ |
0x80, /* 10000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 17 0x11 '^Q' */ |
0x00, /* 00000000 */ |
0x02, /* 00000010 */ |
0x06, /* 00000110 */ |
0x0e, /* 00001110 */ |
0x1e, /* 00011110 */ |
0x3e, /* 00111110 */ |
0xfe, /* 11111110 */ |
0x3e, /* 00111110 */ |
0x1e, /* 00011110 */ |
0x0e, /* 00001110 */ |
0x06, /* 00000110 */ |
0x02, /* 00000010 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 18 0x12 '^R' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 19 0x13 '^S' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 20 0x14 '^T' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7f, /* 01111111 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0x7b, /* 01111011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 21 0x15 '^U' */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x0c, /* 00001100 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 22 0x16 '^V' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 23 0x17 '^W' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 24 0x18 '^X' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 25 0x19 '^Y' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 26 0x1a '^Z' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0xfe, /* 11111110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 27 0x1b '^[' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xfe, /* 11111110 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 28 0x1c '^\' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 29 0x1d '^]' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x28, /* 00101000 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x28, /* 00101000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 30 0x1e '^^' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x7c, /* 01111100 */ |
0x7c, /* 01111100 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 31 0x1f '^_' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x7c, /* 01111100 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 32 0x20 ' ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 33 0x21 '!' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 34 0x22 '"' */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x24, /* 00100100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 35 0x23 '#' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 36 0x24 '$' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0x7c, /* 01111100 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x86, /* 10000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 37 0x25 '%' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc2, /* 11000010 */ |
0xc6, /* 11000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc6, /* 11000110 */ |
0x86, /* 10000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 38 0x26 '&' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 39 0x27 ''' */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 40 0x28 '(' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 41 0x29 ')' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 42 0x2a '*' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0xff, /* 11111111 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 43 0x2b '+' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 44 0x2c ',' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 45 0x2d '-' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 46 0x2e '.' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 47 0x2f '/' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x02, /* 00000010 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0x80, /* 10000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 48 0x30 '0' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 49 0x31 '1' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x38, /* 00111000 */ |
0x78, /* 01111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 50 0x32 '2' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 51 0x33 '3' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x3c, /* 00111100 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 52 0x34 '4' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x1c, /* 00011100 */ |
0x3c, /* 00111100 */ |
0x6c, /* 01101100 */ |
0xcc, /* 11001100 */ |
0xfe, /* 11111110 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x1e, /* 00011110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 53 0x35 '5' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xfc, /* 11111100 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 54 0x36 '6' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xfc, /* 11111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 55 0x37 '7' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 56 0x38 '8' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 57 0x39 '9' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7e, /* 01111110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 58 0x3a ':' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 59 0x3b ';' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 60 0x3c '<' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 61 0x3d '=' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 62 0x3e '>' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 63 0x3f '?' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 64 0x40 '@' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xde, /* 11011110 */ |
0xde, /* 11011110 */ |
0xde, /* 11011110 */ |
0xdc, /* 11011100 */ |
0xc0, /* 11000000 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 65 0x41 'A' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 66 0x42 'B' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfc, /* 11111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xfc, /* 11111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 67 0x43 'C' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc2, /* 11000010 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 68 0x44 'D' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 69 0x45 'E' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x66, /* 01100110 */ |
0x62, /* 01100010 */ |
0x68, /* 01101000 */ |
0x78, /* 01111000 */ |
0x68, /* 01101000 */ |
0x60, /* 01100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 70 0x46 'F' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x66, /* 01100110 */ |
0x62, /* 01100010 */ |
0x68, /* 01101000 */ |
0x78, /* 01111000 */ |
0x68, /* 01101000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 71 0x47 'G' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xde, /* 11011110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x66, /* 01100110 */ |
0x3a, /* 00111010 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 72 0x48 'H' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 73 0x49 'I' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 74 0x4a 'J' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1e, /* 00011110 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 75 0x4b 'K' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe6, /* 11100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x78, /* 01111000 */ |
0x78, /* 01111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 76 0x4c 'L' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf0, /* 11110000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 77 0x4d 'M' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xee, /* 11101110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xd6, /* 11010110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 78 0x4e 'N' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xe6, /* 11100110 */ |
0xf6, /* 11110110 */ |
0xfe, /* 11111110 */ |
0xde, /* 11011110 */ |
0xce, /* 11001110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 79 0x4f 'O' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 80 0x50 'P' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfc, /* 11111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 81 0x51 'Q' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xde, /* 11011110 */ |
0x7c, /* 01111100 */ |
0x0c, /* 00001100 */ |
0x0e, /* 00001110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 82 0x52 'R' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfc, /* 11111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 83 0x53 'S' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x38, /* 00111000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 84 0x54 'T' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x5a, /* 01011010 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 85 0x55 'U' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 86 0x56 'V' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 87 0x57 'W' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xfe, /* 11111110 */ |
0xee, /* 11101110 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 88 0x58 'X' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x7c, /* 01111100 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 89 0x59 'Y' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 90 0x5a 'Z' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0x86, /* 10000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc2, /* 11000010 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 91 0x5b '[' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 92 0x5c '\' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x80, /* 10000000 */ |
0xc0, /* 11000000 */ |
0xe0, /* 11100000 */ |
0x70, /* 01110000 */ |
0x38, /* 00111000 */ |
0x1c, /* 00011100 */ |
0x0e, /* 00001110 */ |
0x06, /* 00000110 */ |
0x02, /* 00000010 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 93 0x5d ']' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 94 0x5e '^' */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 95 0x5f '_' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 96 0x60 '`' */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 97 0x61 'a' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 98 0x62 'b' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe0, /* 11100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x78, /* 01111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 99 0x63 'c' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 100 0x64 'd' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1c, /* 00011100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x3c, /* 00111100 */ |
0x6c, /* 01101100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 101 0x65 'e' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 102 0x66 'f' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1c, /* 00011100 */ |
0x36, /* 00110110 */ |
0x32, /* 00110010 */ |
0x30, /* 00110000 */ |
0x78, /* 01111000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 103 0x67 'g' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x7c, /* 01111100 */ |
0x0c, /* 00001100 */ |
0xcc, /* 11001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
/* 104 0x68 'h' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe0, /* 11100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x6c, /* 01101100 */ |
0x76, /* 01110110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 105 0x69 'i' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 106 0x6a 'j' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
/* 107 0x6b 'k' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe0, /* 11100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x78, /* 01111000 */ |
0x78, /* 01111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 108 0x6c 'l' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 109 0x6d 'm' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xec, /* 11101100 */ |
0xfe, /* 11111110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 110 0x6e 'n' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 111 0x6f 'o' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 112 0x70 'p' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
/* 113 0x71 'q' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x7c, /* 01111100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x1e, /* 00011110 */ |
0x00, /* 00000000 */ |
/* 114 0x72 'r' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x76, /* 01110110 */ |
0x66, /* 01100110 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 115 0x73 's' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x38, /* 00111000 */ |
0x0c, /* 00001100 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 116 0x74 't' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0xfc, /* 11111100 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x36, /* 00110110 */ |
0x1c, /* 00011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 117 0x75 'u' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 118 0x76 'v' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 119 0x77 'w' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 120 0x78 'x' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 121 0x79 'y' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7e, /* 01111110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
/* 122 0x7a 'z' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xcc, /* 11001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 123 0x7b '{' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x0e, /* 00001110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 124 0x7c '|' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 125 0x7d '}' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x70, /* 01110000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x0e, /* 00001110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 126 0x7e '~' */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 127 0x7f '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 128 0x80 '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc2, /* 11000010 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 129 0x81 '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 130 0x82 '' */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 131 0x83 '' */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 132 0x84 '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 133 0x85 ' ' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 134 0x86 '' */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 135 0x87 '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 136 0x88 '' */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 137 0x89 '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 138 0x8a '' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 139 0x8b '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 140 0x8c '' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 141 0x8d '' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 142 0x8e '' */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 143 0x8f '' */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 144 0x90 '' */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x66, /* 01100110 */ |
0x62, /* 01100010 */ |
0x68, /* 01101000 */ |
0x78, /* 01111000 */ |
0x68, /* 01101000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 145 0x91 '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xec, /* 11101100 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x7e, /* 01111110 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0x6e, /* 01101110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 146 0x92 '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3e, /* 00111110 */ |
0x6c, /* 01101100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xfe, /* 11111110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xce, /* 11001110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 147 0x93 '' */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 148 0x94 '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 149 0x95 '' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 150 0x96 '' */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x78, /* 01111000 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 151 0x97 '' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 152 0x98 '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7e, /* 01111110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
/* 153 0x99 '' */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 154 0x9a '' */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 155 0x9b '' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 156 0x9c '' */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x64, /* 01100100 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xe6, /* 11100110 */ |
0xfc, /* 11111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 157 0x9d '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 158 0x9e '' */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xf8, /* 11111000 */ |
0xc4, /* 11000100 */ |
0xcc, /* 11001100 */ |
0xde, /* 11011110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 159 0x9f '' */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x1b, /* 00011011 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xd8, /* 11011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 160 0xa0 ' ' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 161 0xa1 '¡' */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 162 0xa2 '¢' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 163 0xa3 '£' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 164 0xa4 '¤' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 165 0xa5 '¥' */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xe6, /* 11100110 */ |
0xf6, /* 11110110 */ |
0xfe, /* 11111110 */ |
0xde, /* 11011110 */ |
0xce, /* 11001110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 166 0xa6 '¦' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x3e, /* 00111110 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 167 0xa7 '§' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 168 0xa8 '¨' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 169 0xa9 '©' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 170 0xaa 'ª' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 171 0xab '«' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0xe0, /* 11100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xdc, /* 11011100 */ |
0x86, /* 10000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x3e, /* 00111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 172 0xac '¬' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0xe0, /* 11100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x66, /* 01100110 */ |
0xce, /* 11001110 */ |
0x9a, /* 10011010 */ |
0x3f, /* 00111111 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 173 0xad '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 174 0xae '®' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x36, /* 00110110 */ |
0x6c, /* 01101100 */ |
0xd8, /* 11011000 */ |
0x6c, /* 01101100 */ |
0x36, /* 00110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 175 0xaf '¯' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xd8, /* 11011000 */ |
0x6c, /* 01101100 */ |
0x36, /* 00110110 */ |
0x6c, /* 01101100 */ |
0xd8, /* 11011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 176 0xb0 '°' */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
/* 177 0xb1 '±' */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
/* 178 0xb2 '²' */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
/* 179 0xb3 '³' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 180 0xb4 '´' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 181 0xb5 'µ' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 182 0xb6 '¶' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf6, /* 11110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 183 0xb7 '·' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 184 0xb8 '¸' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 185 0xb9 '¹' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf6, /* 11110110 */ |
0x06, /* 00000110 */ |
0xf6, /* 11110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 186 0xba 'º' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 187 0xbb '»' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x06, /* 00000110 */ |
0xf6, /* 11110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 188 0xbc '¼' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf6, /* 11110110 */ |
0x06, /* 00000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 189 0xbd '½' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 190 0xbe '¾' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 191 0xbf '¿' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 192 0xc0 'À' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 193 0xc1 'Á' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 194 0xc2 'Â' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 195 0xc3 'Ã' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 196 0xc4 'Ä' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 197 0xc5 'Å' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 198 0xc6 'Æ' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 199 0xc7 'Ç' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x37, /* 00110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 200 0xc8 'È' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x37, /* 00110111 */ |
0x30, /* 00110000 */ |
0x3f, /* 00111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 201 0xc9 'É' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3f, /* 00111111 */ |
0x30, /* 00110000 */ |
0x37, /* 00110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 202 0xca 'Ê' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf7, /* 11110111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 203 0xcb 'Ë' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xf7, /* 11110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 204 0xcc 'Ì' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x37, /* 00110111 */ |
0x30, /* 00110000 */ |
0x37, /* 00110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 205 0xcd 'Í' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 206 0xce 'Î' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf7, /* 11110111 */ |
0x00, /* 00000000 */ |
0xf7, /* 11110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 207 0xcf 'Ï' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 208 0xd0 'Ð' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 209 0xd1 'Ñ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 210 0xd2 'Ò' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 211 0xd3 'Ó' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x3f, /* 00111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 212 0xd4 'Ô' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 213 0xd5 'Õ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 214 0xd6 'Ö' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3f, /* 00111111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 215 0xd7 '×' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xff, /* 11111111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 216 0xd8 'Ø' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 217 0xd9 'Ù' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 218 0xda 'Ú' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 219 0xdb 'Û' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 220 0xdc 'Ü' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 221 0xdd 'Ý' */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
/* 222 0xde 'Þ' */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
/* 223 0xdf 'ß' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 224 0xe0 'à' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xdc, /* 11011100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 225 0xe1 'á' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xd8, /* 11011000 */ |
0xcc, /* 11001100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 226 0xe2 'â' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 227 0xe3 'ã' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 228 0xe4 'ä' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 229 0xe5 'å' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 230 0xe6 'æ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
/* 231 0xe7 'ç' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 232 0xe8 'è' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 233 0xe9 'é' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 234 0xea 'ê' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0xee, /* 11101110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 235 0xeb 'ë' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1e, /* 00011110 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x3e, /* 00111110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 236 0xec 'ì' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 237 0xed 'í' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x03, /* 00000011 */ |
0x06, /* 00000110 */ |
0x7e, /* 01111110 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0xf3, /* 11110011 */ |
0x7e, /* 01111110 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 238 0xee 'î' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1c, /* 00011100 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x1c, /* 00011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 239 0xef 'ï' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 240 0xf0 'ð' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 241 0xf1 'ñ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 242 0xf2 'ò' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 243 0xf3 'ó' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 244 0xf4 'ô' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 245 0xf5 'õ' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 246 0xf6 'ö' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 247 0xf7 '÷' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 248 0xf8 'ø' */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 249 0xf9 'ù' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 250 0xfa 'ú' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 251 0xfb 'û' */ |
0x00, /* 00000000 */ |
0x0f, /* 00001111 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0xec, /* 11101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x3c, /* 00111100 */ |
0x1c, /* 00011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 252 0xfc 'ü' */ |
0x00, /* 00000000 */ |
0x6c, /* 01101100 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 253 0xfd 'ý' */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x32, /* 00110010 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 254 0xfe 'þ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 255 0xff 'ÿ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
}; |
/tags/0.2.0/uspace/klog/klog.c |
---|
0,0 → 1,88 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup klog KLog |
* @brief HelenOS KLog |
* @{ |
*/ |
/** |
* @file |
*/ |
#include <stdio.h> |
#include <ipc/ipc.h> |
#include <async.h> |
#include <ipc/services.h> |
#include <as.h> |
#include <kernel/ipc/irq.h> |
/* Pointer to klog area */ |
static char *klog; |
void interrupt_received(ipc_callid_t callid, ipc_call_t *call) |
{ |
int i; |
async_serialize_start(); |
for (i=0; klog[i + IPC_GET_ARG2(*call)] && i < IPC_GET_ARG3(*call); i++) |
putchar(klog[i + IPC_GET_ARG2(*call)]); |
putchar('\n'); |
async_serialize_end(); |
} |
int main(int argc, char *argv[]) |
{ |
int res; |
void *mapping; |
printf("Kernel console output.\n"); |
mapping = as_get_mappable_page(PAGE_SIZE); |
res = ipc_call_sync_3(PHONE_NS, IPC_M_AS_AREA_RECV, |
(sysarg_t)mapping, PAGE_SIZE, SERVICE_MEM_KLOG, |
NULL,NULL,NULL); |
if (res) { |
printf("Failed to initialize klog memarea\n"); |
_exit(1); |
} |
klog = mapping; |
if (ipc_register_irq(IPC_IRQ_KLOG, NULL)) { |
printf("Error registering for klog service.\n"); |
return 0; |
} |
async_set_interrupt_received(interrupt_received); |
async_manager(); |
return 0; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/klog/Makefile |
---|
0,0 → 1,73 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../libc |
SOFTINT_PREFIX = ../softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = klog |
SOURCES = \ |
klog.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.2.0/uspace/tools/config.py |
---|
0,0 → 1,494 |
#!/usr/bin/env python |
""" |
User space configuration script |
""" |
import sys |
import os |
import re |
import commands |
INPUT = 'uspace.config' |
OUTPUT = 'Makefile.config' |
TMPOUTPUT = 'Makefile.config.tmp' |
class DefaultDialog: |
"Wrapper dialog that tries to return default values" |
def __init__(self, dlg): |
self.dlg = dlg |
def set_title(self,text): |
self.dlg.set_title(text) |
def yesno(self, text, default=None): |
if default is not None: |
return default |
return self.dlg.yesno(text, default) |
def noyes(self, text, default=None): |
if default is not None: |
return default |
return self.dlg.noyes(text, default) |
def choice(self, text, choices, defopt=None): |
if defopt is not None: |
return choices[defopt][0] |
return self.dlg.choice(text, choices, defopt) |
class NoDialog: |
def __init__(self): |
self.printed = None |
self.title = 'HelenOS Configuration' |
def print_title(self): |
if not self.printed: |
sys.stdout.write("\n*** %s ***\n" % self.title) |
self.printed = True |
def set_title(self, text): |
self.title = text |
self.printed = False |
def noyes(self, text, default=None): |
if not default: |
default = 'n' |
return self.yesno(text, default) |
def yesno(self, text, default=None): |
self.print_title() |
if default != 'n': |
default = 'y' |
while 1: |
sys.stdout.write("%s (y/n)[%s]: " % (text,default)) |
inp = sys.stdin.readline() |
if not inp: |
raise EOFError |
inp = inp.strip().lower() |
if not inp: |
return default |
if inp == 'y': |
return 'y' |
elif inp == 'n': |
return 'n' |
def _print_choice(self, text, choices, defopt): |
sys.stdout.write('%s:\n' % text) |
for i,(text,descr) in enumerate(choices): |
sys.stdout.write('\t%2d. %s\n' % (i, descr)) |
if defopt is not None: |
sys.stdout.write('Enter choice number[%d]: ' % defopt) |
else: |
sys.stdout.write('Enter choice number: ') |
def menu(self, text, choices, button, defopt=None): |
self.title = 'Main menu' |
menu = [] |
for key, descr in choices: |
txt = key + (45-len(key))*' ' + ': ' + descr |
menu.append((key, txt)) |
return self.choice(text, [button] + menu) |
def choice(self, text, choices, defopt=None): |
self.print_title() |
while 1: |
self._print_choice(text, choices, defopt) |
inp = sys.stdin.readline() |
if not inp: |
raise EOFError |
if not inp.strip(): |
if defopt is not None: |
return choices[defopt][0] |
continue |
try: |
number = int(inp.strip()) |
except ValueError: |
continue |
if number < 0 or number >= len(choices): |
continue |
return choices[number][0] |
def eof_checker(fnc): |
def wrapper(self, *args, **kw): |
try: |
return fnc(self, *args, **kw) |
except EOFError: |
return getattr(self.bckdialog,fnc.func_name)(*args, **kw) |
return wrapper |
class Dialog(NoDialog): |
def __init__(self): |
NoDialog.__init__(self) |
self.dlgcmd = os.environ.get('DIALOG','dialog') |
self.title = '' |
self.backtitle = 'HelenOS Kernel Configuration' |
if os.system('%s --print-maxsize >/dev/null 2>&1' % self.dlgcmd) != 0: |
raise NotImplementedError |
self.bckdialog = NoDialog() |
def set_title(self,text): |
self.title = text |
self.bckdialog.set_title(text) |
def calldlg(self,*args,**kw): |
"Wrapper for calling 'dialog' program" |
indesc, outdesc = os.pipe() |
pid = os.fork() |
if not pid: |
os.close(2) |
os.dup(outdesc) |
os.close(indesc) |
dlgargs = [self.dlgcmd,'--title',self.title, |
'--backtitle', self.backtitle] |
for key,val in kw.items(): |
dlgargs.append('--'+key) |
dlgargs.append(val) |
dlgargs += args |
os.execlp(self.dlgcmd,*dlgargs) |
os.close(outdesc) |
try: |
errout = os.fdopen(indesc,'r') |
data = errout.read() |
errout.close() |
pid,status = os.wait() |
except: |
os.system('reset') # Reset terminal |
raise |
if not os.WIFEXITED(status): |
os.system('reset') # Reset terminal |
raise EOFError |
status = os.WEXITSTATUS(status) |
if status == 255: |
raise EOFError |
return status,data |
def yesno(self, text, default=None): |
if text[-1] not in ('?',':'): |
text = text + ':' |
width = '50' |
height = '5' |
if len(text) < 48: |
text = ' '*int(((48-len(text))/2)) + text |
else: |
width = '0' |
height = '0' |
if default == 'n': |
res,data = self.calldlg('--defaultno','--yesno',text,height,width) |
else: |
res,data = self.calldlg('--yesno',text,height,width) |
if res == 0: |
return 'y' |
return 'n' |
yesno = eof_checker(yesno) |
def menu(self, text, choices, button, defopt=None): |
self.title = 'Main menu' |
text = text + ':' |
width = '70' |
height = str(8 + len(choices)) |
args = [] |
for key,val in choices: |
args.append(key) |
args.append(val) |
kw = {} |
if defopt: |
kw['default-item'] = choices[defopt][0] |
res,data = self.calldlg('--ok-label','Change', |
'--extra-label',button[1], |
'--extra-button', |
'--menu',text,height,width, |
str(len(choices)),*args,**kw) |
if res == 3: |
return button[0] |
if res == 1: # Cancel |
sys.exit(1) |
elif res: |
print data |
raise EOFError |
return data |
menu = eof_checker(menu) |
def choice(self, text, choices, defopt=None): |
text = text + ':' |
width = '50' |
height = str(8 + len(choices)) |
args = [] |
for key,val in choices: |
args.append(key) |
args.append(val) |
kw = {} |
if defopt: |
kw['default-item'] = choices[defopt][0] |
res,data = self.calldlg('--nocancel','--menu',text,height,width, |
str(len(choices)),*args, **kw) |
if res: |
print data |
raise EOFError |
return data |
choice = eof_checker(choice) |
def read_defaults(fname,defaults): |
"Read saved values from last configuration run" |
f = file(fname,'r') |
for line in f: |
res = re.match(r'^(?:#!# )?([^#]\w*)\s*=\s*(.*?)\s*$', line) |
if res: |
defaults[res.group(1)] = res.group(2) |
f.close() |
def check_condition(text, defaults, asked_names): |
seen_vars = [ x[0] for x in asked_names ] |
ctype = 'cnf' |
if ')|' in text or '|(' in text: |
ctype = 'dnf' |
if ctype == 'cnf': |
conds = text.split('&') |
else: |
conds = text.split('|') |
for cond in conds: |
if cond.startswith('(') and cond.endswith(')'): |
cond = cond[1:-1] |
inside = check_inside(cond, defaults, ctype, seen_vars) |
if ctype == 'cnf' and not inside: |
return False |
if ctype == 'dnf' and inside: |
return True |
if ctype == 'cnf': |
return True |
return False |
def check_inside(text, defaults, ctype, seen_vars): |
""" |
Check that the condition specified on input line is True |
only CNF is supported |
""" |
if ctype == 'cnf': |
conds = text.split('|') |
else: |
conds = text.split('&') |
for cond in conds: |
res = re.match(r'^(.*?)(!?=)(.*)$', cond) |
if not res: |
raise RuntimeError("Invalid condition: %s" % cond) |
condname = res.group(1) |
oper = res.group(2) |
condval = res.group(3) |
if condname not in seen_vars: |
varval = '' |
## raise RuntimeError("Variable %s not defined before being asked." %\ |
## condname) |
elif not defaults.has_key(condname): |
raise RuntimeError("Condition var %s does not exist: %s" % \ |
(condname,text)) |
else: |
varval = defaults[condname] |
if ctype == 'cnf': |
if oper == '=' and condval == varval: |
return True |
if oper == '!=' and condval != varval: |
return True |
else: |
if oper== '=' and condval != varval: |
return False |
if oper== '!=' and condval == varval: |
return False |
if ctype=='cnf': |
return False |
return True |
def parse_config(input, output, dlg, defaults={}, askonly=None): |
"Parse configuration file and create Makefile.config on the fly" |
def ask_the_question(dialog): |
"Ask question based on the type of variables to ask" |
# This is quite a hack, this thingy is written just to |
# have access to local variables.. |
if vartype == 'y/n': |
return dialog.yesno(comment, default) |
elif vartype == 'n/y': |
return dialog.noyes(comment, default) |
elif vartype == 'choice': |
defopt = None |
if default is not None: |
for i,(key,val) in enumerate(choices): |
if key == default: |
defopt = i |
break |
return dialog.choice(comment, choices, defopt) |
else: |
raise RuntimeError("Bad method: %s" % vartype) |
f = file(input, 'r') |
outf = file(output, 'w') |
outf.write('#########################################\n') |
outf.write('## AUTO-GENERATED FILE, DO NOT EDIT!!! ##\n') |
outf.write('#########################################\n\n') |
asked_names = [] |
comment = '' |
default = None |
choices = [] |
for line in f: |
if line.startswith('%'): |
res = re.match(r'^%\s*(?:\[(.*?)\])?\s*(.*)$', line) |
if not res: |
raise RuntimeError('Invalid command: %s' % line) |
if res.group(1): |
if not check_condition(res.group(1), defaults, |
asked_names): |
continue |
args = res.group(2).strip().split(' ') |
cmd = args[0].lower() |
args = args[1:] |
if cmd == 'saveas': |
outf.write('%s = %s\n' % (args[1],defaults[args[0]])) |
elif cmd == 'shellcmd': |
varname = args[0] |
args = args[1:] |
for i,arg in enumerate(args): |
if arg.startswith('$'): |
args[i] = defaults[arg[1:]] |
data,status = commands.getstatusoutput(' '.join(args)) |
if status: |
raise RuntimeError('Error running: %s' % ' '.join(args)) |
outf.write('%s = %s\n' % (varname,data.strip())) |
continue |
if line.startswith('!'): |
# Ask a question |
res = re.search(r'!\s*(?:\[(.*?)\])?\s*([^\s]+)\s*\((.*)\)\s*$', line) |
if not res: |
raise RuntimeError("Weird line: %s" % line) |
varname = res.group(2) |
vartype = res.group(3) |
default = defaults.get(varname,None) |
if res.group(1): |
if not check_condition(res.group(1), defaults, |
asked_names): |
if default is not None: |
outf.write('#!# %s = %s\n' % (varname, default)) |
# Clear cumulated values |
comment = '' |
default = None |
choices = [] |
continue |
asked_names.append((varname,comment)) |
if default is None or not askonly or askonly == varname: |
default = ask_the_question(dlg) |
else: |
default = ask_the_question(DefaultDialog(dlg)) |
outf.write('%s = %s\n' % (varname, default)) |
# Remeber the selected value |
defaults[varname] = default |
# Clear cumulated values |
comment = '' |
default = None |
choices = [] |
continue |
if line.startswith('@'): |
# Add new line into the 'choice array' |
res = re.match(r'@\s*(?:\[(.*?)\])?\s*"(.*?)"\s*(.*)$', line) |
if not res: |
raise RuntimeError("Bad line: %s" % line) |
if res.group(1): |
if not check_condition(res.group(1),defaults, |
asked_names): |
continue |
choices.append((res.group(2), res.group(3))) |
continue |
# All other things print to output file |
outf.write(line) |
if re.match(r'^#[^#]', line): |
# Last comment before question will be displayed to the user |
comment = line[1:].strip() |
elif line.startswith('## '): |
# Set title of the dialog window |
dlg.set_title(line[2:].strip()) |
outf.write('\n') |
outf.write('REVISION = %s\n' % commands.getoutput('svnversion . 2> /dev/null')) |
outf.write('TIMESTAMP = %s\n' % commands.getoutput('date "+%Y-%m-%d %H:%M:%S"')) |
outf.close() |
f.close() |
return asked_names |
def main(): |
defaults = {} |
try: |
dlg = Dialog() |
except NotImplementedError: |
dlg = NoDialog() |
if len(sys.argv) >= 2 and sys.argv[1]=='default': |
defmode = True |
else: |
defmode = False |
# Default run will update the configuration file |
# with newest options |
if os.path.exists(OUTPUT): |
read_defaults(OUTPUT, defaults) |
# Get ARCH from command line if specified |
if len(sys.argv) >= 3: |
defaults['ARCH'] = sys.argv[2] |
# Dry run only with defaults |
varnames = parse_config(INPUT, TMPOUTPUT, DefaultDialog(dlg), defaults) |
# If not in default mode, present selection of all possibilities |
if not defmode: |
defopt = 0 |
while 1: |
# varnames contains variable names that were in the |
# last question set |
choices = [ (x[1],defaults[x[0]]) for x in varnames ] |
res = dlg.menu('Configuration',choices,('save','Save'),defopt) |
if res == 'save': |
parse_config(INPUT, TMPOUTPUT, DefaultDialog(dlg), defaults) |
break |
# transfer description back to varname |
for i,(vname,descr) in enumerate(varnames): |
if res == descr: |
defopt = i |
break |
# Ask the user a simple question, produce output |
# as if the user answered all the other questions |
# with default answer |
varnames = parse_config(INPUT, TMPOUTPUT, dlg, defaults, |
askonly=varnames[i][0]) |
if os.path.exists(OUTPUT): |
os.unlink(OUTPUT) |
os.rename(TMPOUTPUT, OUTPUT) |
if not defmode and dlg.yesno('Rebuild user space?') == 'y': |
os.execlp('make','make','clean','build') |
if __name__ == '__main__': |
main() |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/kbd/arch/amd64 |
---|
0,0 → 1,0 |
link ia32 |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/kbd/arch/ia32/include/kbd.h |
---|
0,0 → 1,52 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup kbdamd64 amd64 |
* @brief HelenOS ia32 / amd64 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
* @ingroup kbdia32 |
*/ |
#ifndef __ia32_KBD_H__ |
#define __ia32_KBD_H__ |
#include <key_buffer.h> |
int kbd_arch_init(void); |
int kbd_arch_process(keybuffer_t *keybuffer, int scan_code); |
#endif |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/kbd/arch/ia32/src/kbd.c |
---|
0,0 → 1,379 |
/* |
* Copyright (C) 2001-2004 Jakub Jermar |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup kbdia32 ia32 |
* @brief HelenOS ia32 / amd64 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
* @ingroup kbdamd64 |
*/ |
#include <arch/kbd.h> |
#include <ipc/ipc.h> |
#define SPECIAL 255 |
#define KEY_RELEASE 0x80 |
/** |
* These codes read from i8042 data register are silently ignored. |
*/ |
#define IGNORE_CODE 0x7f |
#define PRESSED_SHIFT (1<<0) |
#define PRESSED_CAPSLOCK (1<<1) |
#define LOCKED_CAPSLOCK (1<<0) |
/** Scancodes. */ |
#define SC_ESC 0x01 |
#define SC_BACKSPACE 0x0e |
#define SC_LSHIFT 0x2a |
#define SC_RSHIFT 0x36 |
#define SC_CAPSLOCK 0x3a |
#define SC_SPEC_ESCAPE 0xe0 |
#define SC_LEFTARR 0x4b |
#define SC_RIGHTARR 0x4d |
#define SC_UPARR 0x48 |
#define SC_DOWNARR 0x50 |
#define SC_DELETE 0x53 |
#define SC_HOME 0x47 |
#define SC_END 0x4f |
#define FUNCTION_KEYS 0x100 |
static volatile int keyflags; /**< Tracking of multiple keypresses. */ |
static volatile int lockflags; /**< Tracking of multiple keys lockings. */ |
/** Primary meaning of scancodes. */ |
static int sc_primary_map[] = { |
SPECIAL, /* 0x00 */ |
SPECIAL, /* 0x01 - Esc */ |
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', |
'\b', /* 0x0e - Backspace */ |
'\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', |
SPECIAL, /* 0x1d - LCtrl */ |
'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', |
'`', |
SPECIAL, /* 0x2a - LShift */ |
'\\', |
'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', |
SPECIAL, /* 0x36 - RShift */ |
'*', |
SPECIAL, /* 0x38 - LAlt */ |
' ', |
SPECIAL, /* 0x3a - CapsLock */ |
(FUNCTION_KEYS | 1), /* 0x3b - F1 */ |
(FUNCTION_KEYS | 2), /* 0x3c - F2 */ |
(FUNCTION_KEYS | 3), /* 0x3d - F3 */ |
(FUNCTION_KEYS | 4), /* 0x3e - F4 */ |
(FUNCTION_KEYS | 5), /* 0x3f - F5 */ |
(FUNCTION_KEYS | 6), /* 0x40 - F6 */ |
(FUNCTION_KEYS | 7), /* 0x41 - F7 */ |
(FUNCTION_KEYS | 8), /* 0x42 - F8 */ |
(FUNCTION_KEYS | 9), /* 0x43 - F9 */ |
(FUNCTION_KEYS | 10), /* 0x44 - F10 */ |
SPECIAL, /* 0x45 - NumLock */ |
SPECIAL, /* 0x46 - ScrollLock */ |
'7', '8', '9', '-', |
'4', '5', '6', '+', |
'1', '2', '3', |
'0', '.', |
SPECIAL, /* 0x54 - Alt-SysRq */ |
SPECIAL, /* 0x55 - F11/F12/PF1/FN */ |
SPECIAL, /* 0x56 - unlabelled key next to LAlt */ |
(FUNCTION_KEYS | 11), /* 0x57 - F11 */ |
(FUNCTION_KEYS | 12), /* 0x58 - F12 */ |
SPECIAL, /* 0x59 */ |
SPECIAL, /* 0x5a */ |
SPECIAL, /* 0x5b */ |
SPECIAL, /* 0x5c */ |
SPECIAL, /* 0x5d */ |
SPECIAL, /* 0x5e */ |
SPECIAL, /* 0x5f */ |
SPECIAL, /* 0x60 */ |
SPECIAL, /* 0x61 */ |
SPECIAL, /* 0x62 */ |
SPECIAL, /* 0x63 */ |
SPECIAL, /* 0x64 */ |
SPECIAL, /* 0x65 */ |
SPECIAL, /* 0x66 */ |
SPECIAL, /* 0x67 */ |
SPECIAL, /* 0x68 */ |
SPECIAL, /* 0x69 */ |
SPECIAL, /* 0x6a */ |
SPECIAL, /* 0x6b */ |
SPECIAL, /* 0x6c */ |
SPECIAL, /* 0x6d */ |
SPECIAL, /* 0x6e */ |
SPECIAL, /* 0x6f */ |
SPECIAL, /* 0x70 */ |
SPECIAL, /* 0x71 */ |
SPECIAL, /* 0x72 */ |
SPECIAL, /* 0x73 */ |
SPECIAL, /* 0x74 */ |
SPECIAL, /* 0x75 */ |
SPECIAL, /* 0x76 */ |
SPECIAL, /* 0x77 */ |
SPECIAL, /* 0x78 */ |
SPECIAL, /* 0x79 */ |
SPECIAL, /* 0x7a */ |
SPECIAL, /* 0x7b */ |
SPECIAL, /* 0x7c */ |
SPECIAL, /* 0x7d */ |
SPECIAL, /* 0x7e */ |
SPECIAL, /* 0x7f */ |
}; |
/** Secondary meaning of scancodes. */ |
static int sc_secondary_map[] = { |
SPECIAL, /* 0x00 */ |
0x1b, /* 0x01 - Esc */ |
'!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', |
SPECIAL, /* 0x0e - Backspace */ |
'\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n', |
SPECIAL, /* 0x1d - LCtrl */ |
'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', |
'~', |
SPECIAL, /* 0x2a - LShift */ |
'|', |
'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', |
SPECIAL, /* 0x36 - RShift */ |
'*', |
SPECIAL, /* 0x38 - LAlt */ |
' ', |
SPECIAL, /* 0x3a - CapsLock */ |
SPECIAL, /* 0x3b - F1 */ |
SPECIAL, /* 0x3c - F2 */ |
SPECIAL, /* 0x3d - F3 */ |
SPECIAL, /* 0x3e - F4 */ |
SPECIAL, /* 0x3f - F5 */ |
SPECIAL, /* 0x40 - F6 */ |
SPECIAL, /* 0x41 - F7 */ |
SPECIAL, /* 0x42 - F8 */ |
SPECIAL, /* 0x43 - F9 */ |
SPECIAL, /* 0x44 - F10 */ |
SPECIAL, /* 0x45 - NumLock */ |
SPECIAL, /* 0x46 - ScrollLock */ |
'7', '8', '9', '-', |
'4', '5', '6', '+', |
'1', '2', '3', |
'0', '.', |
SPECIAL, /* 0x54 - Alt-SysRq */ |
SPECIAL, /* 0x55 - F11/F12/PF1/FN */ |
SPECIAL, /* 0x56 - unlabelled key next to LAlt */ |
SPECIAL, /* 0x57 - F11 */ |
SPECIAL, /* 0x58 - F12 */ |
SPECIAL, /* 0x59 */ |
SPECIAL, /* 0x5a */ |
SPECIAL, /* 0x5b */ |
SPECIAL, /* 0x5c */ |
SPECIAL, /* 0x5d */ |
SPECIAL, /* 0x5e */ |
SPECIAL, /* 0x5f */ |
SPECIAL, /* 0x60 */ |
SPECIAL, /* 0x61 */ |
SPECIAL, /* 0x62 */ |
SPECIAL, /* 0x63 */ |
SPECIAL, /* 0x64 */ |
SPECIAL, /* 0x65 */ |
SPECIAL, /* 0x66 */ |
SPECIAL, /* 0x67 */ |
SPECIAL, /* 0x68 */ |
SPECIAL, /* 0x69 */ |
SPECIAL, /* 0x6a */ |
SPECIAL, /* 0x6b */ |
SPECIAL, /* 0x6c */ |
SPECIAL, /* 0x6d */ |
SPECIAL, /* 0x6e */ |
SPECIAL, /* 0x6f */ |
SPECIAL, /* 0x70 */ |
SPECIAL, /* 0x71 */ |
SPECIAL, /* 0x72 */ |
SPECIAL, /* 0x73 */ |
SPECIAL, /* 0x74 */ |
SPECIAL, /* 0x75 */ |
SPECIAL, /* 0x76 */ |
SPECIAL, /* 0x77 */ |
SPECIAL, /* 0x78 */ |
SPECIAL, /* 0x79 */ |
SPECIAL, /* 0x7a */ |
SPECIAL, /* 0x7b */ |
SPECIAL, /* 0x7c */ |
SPECIAL, /* 0x7d */ |
SPECIAL, /* 0x7e */ |
SPECIAL, /* 0x7f */ |
}; |
irq_cmd_t i8042_cmds[1] = { |
{ CMD_PORT_READ_1, (void *)0x60, 0 } |
}; |
irq_code_t i8042_kbd = { |
1, |
i8042_cmds |
}; |
static int key_released(keybuffer_t *keybuffer, unsigned char key) |
{ |
switch (key) { |
case SC_LSHIFT: |
case SC_RSHIFT: |
keyflags &= ~PRESSED_SHIFT; |
break; |
case SC_CAPSLOCK: |
keyflags &= ~PRESSED_CAPSLOCK; |
if (lockflags & LOCKED_CAPSLOCK) |
lockflags &= ~LOCKED_CAPSLOCK; |
else |
lockflags |= LOCKED_CAPSLOCK; |
break; |
default: |
break; |
} |
} |
static int key_pressed(keybuffer_t *keybuffer, unsigned char key) |
{ |
int *map = sc_primary_map; |
int ascii = sc_primary_map[key]; |
int shift, capslock; |
int letter = 0; |
static int esc_count=0; |
if ( key == SC_ESC ) { |
esc_count++; |
if ( esc_count == 3 ) { |
__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE); |
} |
} else { |
esc_count=0; |
} |
switch (key) { |
case SC_LSHIFT: |
case SC_RSHIFT: |
keyflags |= PRESSED_SHIFT; |
break; |
case SC_CAPSLOCK: |
keyflags |= PRESSED_CAPSLOCK; |
break; |
case SC_SPEC_ESCAPE: |
break; |
/* case SC_LEFTARR: |
if (keybuffer_available(keybuffer) >= 3) { |
keybuffer_push(keybuffer, 0x1b); |
keybuffer_push(keybuffer, 0x5b); |
keybuffer_push(keybuffer, 0x44); |
} |
break; |
case SC_RIGHTARR: |
if (keybuffer_available(keybuffer) >= 3) { |
keybuffer_push(keybuffer, 0x1b); |
keybuffer_push(keybuffer, 0x5b); |
keybuffer_push(keybuffer, 0x43); |
} |
break; |
case SC_UPARR: |
if (keybuffer_available(keybuffer) >= 3) { |
keybuffer_push(keybuffer, 0x1b); |
keybuffer_push(keybuffer, 0x5b); |
keybuffer_push(keybuffer, 0x41); |
} |
break; |
case SC_DOWNARR: |
if (keybuffer_available(keybuffer) >= 3) { |
keybuffer_push(keybuffer, 0x1b); |
keybuffer_push(keybuffer, 0x5b); |
keybuffer_push(keybuffer, 0x42); |
} |
break; |
case SC_HOME: |
if (keybuffer_available(keybuffer) >= 3) { |
keybuffer_push(keybuffer, 0x1b); |
keybuffer_push(keybuffer, 0x4f); |
keybuffer_push(keybuffer, 0x48); |
} |
break; |
case SC_END: |
if (keybuffer_available(keybuffer) >= 3) { |
keybuffer_push(keybuffer, 0x1b); |
keybuffer_push(keybuffer, 0x4f); |
keybuffer_push(keybuffer, 0x46); |
} |
break; |
case SC_DELETE: |
if (keybuffer_available(keybuffer) >= 4) { |
keybuffer_push(keybuffer, 0x1b); |
keybuffer_push(keybuffer, 0x5b); |
keybuffer_push(keybuffer, 0x33); |
keybuffer_push(keybuffer, 0x7e); |
} |
break; |
*/ default: |
letter = ((ascii >= 'a') && (ascii <= 'z')); |
capslock = (keyflags & PRESSED_CAPSLOCK) || (lockflags & LOCKED_CAPSLOCK); |
shift = keyflags & PRESSED_SHIFT; |
if (letter && capslock) |
shift = !shift; |
if (shift) |
map = sc_secondary_map; |
if (map[key] != SPECIAL) |
keybuffer_push(keybuffer, map[key]); |
break; |
} |
} |
/** Register uspace irq handler |
* @return |
*/ |
int kbd_arch_init(void) |
{ |
return !(ipc_register_irq(1, &i8042_kbd)); |
} |
int kbd_arch_process(keybuffer_t *keybuffer, int scan_code) |
{ |
if (scan_code != IGNORE_CODE) { |
if (scan_code & KEY_RELEASE) |
key_released(keybuffer, scan_code ^ KEY_RELEASE); |
else |
key_pressed(keybuffer, scan_code); |
} |
return 1; |
} |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/kbd/arch/ia64/include/kbd.h |
---|
0,0 → 1,50 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup kbdia64 ia64 |
* @brief HelenOS ia64 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ia64_KBD_H__ |
#define __ia64_KBD_H__ |
#include <key_buffer.h> |
int kbd_arch_init(void); |
int kbd_arch_process(keybuffer_t *keybuffer, int scan_code); |
#endif |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/kbd/arch/ia64/src/kbd.c |
---|
0,0 → 1,169 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup kbdia64 ia64 |
* @brief HelenOS ia64 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/kbd.h> |
#include <ipc/ipc.h> |
#include <sysinfo.h> |
#define KEY_F1 0x504f1b |
#define KEY_F2 0x514f1b |
#define KEY_F3 0x524f1b |
#define KEY_F4 0x534f1b |
#define KEY_F5 0x7e35315b1b |
#define KEY_F6 0x7e37315b1b |
#define KEY_F7 0x7e38315b1b |
#define KEY_F8 0x7e39315b1b |
#define KEY_F9 0x7e30325b1b |
#define KEY_F10 0x7e31325b1b |
#define KEY_F11 0x7e33325b1b |
#define KEY_F12 0x7e34325b1b |
#define FUNCTION_KEYS 0x100 |
irq_cmd_t ski_cmds[1] = { |
{ CMD_IA64_GETCHAR, 0, 0 } |
}; |
irq_code_t ski_kbd = { |
1, |
ski_cmds |
}; |
int kbd_arch_init(void) |
{ |
if(sysinfo_value("kbd")) { |
ipc_register_irq(sysinfo_value("kbd.irq"), &ski_kbd); |
return 1; |
} |
} |
/* |
* Please preserve this code (it can be used to determine scancodes) |
* |
int to_hex(int v) |
{ |
return "0123456789ABCDEF"[v]; |
} |
*/ |
int kbd_arch_process(keybuffer_t *keybuffer, int scan_code) |
{ |
static unsigned long long buf=0; |
static int count=0; |
static int esc_count=0; |
/* |
* Please preserve this code (it can be used to determine scancodes) |
*/ |
//keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf)); |
//keybuffer_push(keybuffer, to_hex(scan_code&0xf)); |
//keybuffer_push(keybuffer, ' '); |
//keybuffer_push(keybuffer, ' '); |
//*/ |
if (scan_code){ |
buf|=(unsigned long long) scan_code<<(8*(count++)); |
} else { |
if ( buf == 0x1b ) { |
esc_count++; |
if ( esc_count == 3 ) { |
__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE); |
} |
} else { |
esc_count=0; |
} |
if ( ! ( buf & 0xff00 )) |
keybuffer_push(keybuffer, buf); |
else { |
switch (buf){ |
case KEY_F1: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 1 ); |
break; |
case KEY_F2: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 2 ); |
break; |
case KEY_F3: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 3 ); |
break; |
case KEY_F4: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 4 ); |
break; |
case KEY_F5: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 5 ); |
break; |
case KEY_F6: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 6 ); |
break; |
case KEY_F7: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 7 ); |
break; |
case KEY_F8: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 8 ); |
break; |
case KEY_F9: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 9 ); |
break; |
case KEY_F10: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 10 ); |
break; |
case KEY_F11: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 11 ); |
break; |
case KEY_F12: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 12 ); |
break; |
} |
} |
buf=count=0; |
} |
return 1; |
} |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/kbd/arch/ppc32/include/kbd.h |
---|
0,0 → 1,49 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup kbdppc32 ppc32 |
* @brief HelenOS ppc32 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ppc32_KBD_H__ |
#define __ppc32_KBD_H__ |
#include <key_buffer.h> |
int kbd_arch_init(void); |
int kbd_arch_process(keybuffer_t *keybuffer, int scan_code); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/kbd/arch/ppc32/src/kbd.c |
---|
0,0 → 1,206 |
/* |
* Copyright (C) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup kbdppc32 ppc32 |
* @brief HelenOS ppc32 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/kbd.h> |
#include <ipc/ipc.h> |
#include <sysinfo.h> |
irq_cmd_t cuda_cmds[1] = { |
{ CMD_PPC32_GETCHAR, 0, 0 } |
}; |
irq_code_t cuda_kbd = { |
1, |
cuda_cmds |
}; |
#define SPECIAL 255 |
#define FUNCTION_KEYS 0x100 |
static int lchars[0x80] = { |
'a', |
's', |
'd', |
'f', |
'h', |
'g', |
'z', |
'x', |
'c', |
'v', |
SPECIAL, |
'b', |
'q', |
'w', |
'e', |
'r', |
'y', |
't', |
'1', |
'2', |
'3', |
'4', |
'6', |
'5', |
'=', |
'9', |
'7', |
'-', |
'8', |
'0', |
']', |
'o', |
'u', |
'[', |
'i', |
'p', |
'\n', /* Enter */ |
'l', |
'j', |
'\'', |
'k', |
';', |
'\\', |
',', |
'/', |
'n', |
'm', |
'.', |
'\t', /* Tab */ |
' ', |
'`', |
'\b', /* Backspace */ |
SPECIAL, |
SPECIAL, /* Escape */ |
SPECIAL, /* Ctrl */ |
SPECIAL, /* Alt */ |
SPECIAL, /* Shift */ |
SPECIAL, /* Caps-Lock */ |
SPECIAL, /* RAlt */ |
SPECIAL, /* Left */ |
SPECIAL, /* Right */ |
SPECIAL, /* Down */ |
SPECIAL, /* Up */ |
SPECIAL, |
SPECIAL, |
'.', /* Keypad . */ |
SPECIAL, |
'*', /* Keypad * */ |
SPECIAL, |
'+', /* Keypad + */ |
SPECIAL, |
SPECIAL, /* NumLock */ |
SPECIAL, |
SPECIAL, |
SPECIAL, |
'/', /* Keypad / */ |
'\n', /* Keypad Enter */ |
SPECIAL, |
'-', /* Keypad - */ |
SPECIAL, |
SPECIAL, |
SPECIAL, |
'0', /* Keypad 0 */ |
'1', /* Keypad 1 */ |
'2', /* Keypad 2 */ |
'3', /* Keypad 3 */ |
'4', /* Keypad 4 */ |
'5', /* Keypad 5 */ |
'6', /* Keypad 6 */ |
'7', /* Keypad 7 */ |
SPECIAL, |
'8', /* Keypad 8 */ |
'9', /* Keypad 9 */ |
SPECIAL, |
SPECIAL, |
SPECIAL, |
(FUNCTION_KEYS | 5), /* F5 */ |
(FUNCTION_KEYS | 6), /* F6 */ |
(FUNCTION_KEYS | 7), /* F7 */ |
(FUNCTION_KEYS | 3), /* F3 */ |
(FUNCTION_KEYS | 8), /* F8 */ |
(FUNCTION_KEYS | 9), /* F9 */ |
SPECIAL, |
(FUNCTION_KEYS | 11), /* F11 */ |
SPECIAL, |
(FUNCTION_KEYS | 13), /* F13 */ |
SPECIAL, |
SPECIAL, /* ScrollLock */ |
SPECIAL, |
(FUNCTION_KEYS | 10), /* F10 */ |
SPECIAL, |
(FUNCTION_KEYS | 12), /* F12 */ |
SPECIAL, |
SPECIAL, /* Pause */ |
SPECIAL, /* Insert */ |
SPECIAL, /* Home */ |
SPECIAL, /* PageUp */ |
SPECIAL, /* Delete */ |
(FUNCTION_KEYS | 4), /* F4 */ |
SPECIAL, /* End */ |
(FUNCTION_KEYS | 2), /* F2 */ |
SPECIAL, /* PageDown */ |
(FUNCTION_KEYS | 1) /* F1 */ |
}; |
int kbd_arch_init(void) |
{ |
return (!ipc_register_irq(sysinfo_value("cuda.irq"), &cuda_kbd)); |
} |
int kbd_arch_process(keybuffer_t *keybuffer, int scan_code) |
{ |
if (scan_code != -1) { |
uint8_t scancode = (uint8_t) scan_code; |
if ((scancode & 0x80) != 0x80) { |
int key = lchars[scancode & 0x7f]; |
if (key != SPECIAL) |
keybuffer_push(keybuffer, key); |
} |
} |
return 1; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/kbd/arch/mips32/include/kbd.h |
---|
0,0 → 1,49 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup kbdmips32 mips32 |
* @brief HelenOS mips32 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __mips32_KBD_H__ |
#define __mips32_KBD_H__ |
#include <key_buffer.h> |
int kbd_arch_init(void); |
int kbd_arch_process(keybuffer_t *keybuffer, int scan_code); |
#endif |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/kbd/arch/mips32/src/kbd.c |
---|
0,0 → 1,399 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup kbdmips32 mips32 |
* @brief HelenOS mips32 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/kbd.h> |
#include <ipc/ipc.h> |
#include <sysinfo.h> |
#define MSIM_KEY_F1 0x504f1bL |
#define MSIM_KEY_F2 0x514f1bL |
#define MSIM_KEY_F3 0x524f1bL |
#define MSIM_KEY_F4 0x534f1bL |
#define MSIM_KEY_F5 0x35315b1bL |
#define MSIM_KEY_F6 0x37315b1bL |
#define MSIM_KEY_F7 0x38315b1bL |
#define MSIM_KEY_F8 0x39315b1bL |
#define MSIM_KEY_F9 0x30325b1bL |
#define MSIM_KEY_F10 0x31325b1bL |
#define MSIM_KEY_F11 0x33325b1bL |
#define MSIM_KEY_F12 0x34325b1bL |
#define GXEMUL_KEY_F1 0x504f5b1bL |
#define GXEMUL_KEY_F2 0x514f5b1bL |
#define GXEMUL_KEY_F3 0x524f5b1bL |
#define GXEMUL_KEY_F4 0x534f5b1bL |
#define GXEMUL_KEY_F5 0x35315b1bL |
#define GXEMUL_KEY_F6 0x37315b1bL |
#define GXEMUL_KEY_F7 0x38315b1bL |
#define GXEMUL_KEY_F8 0x39315b1bL |
#define GXEMUL_KEY_F9 0x38325b1bL |
#define GXEMUL_KEY_F10 0x39325b1bL |
#define GXEMUL_KEY_F11 0x33325b1bL |
#define GXEMUL_KEY_F12 0x34325b1bL |
#define FUNCTION_KEYS 0x100 |
irq_cmd_t msim_cmds[1] = { |
{ CMD_MEM_READ_1, (void *)0xB0000000, 0 } |
}; |
irq_code_t msim_kbd = { |
1, |
msim_cmds |
}; |
static int msim,gxemul; |
int kbd_arch_init(void) |
{ |
ipc_register_irq(2, &msim_kbd); |
msim=sysinfo_value("machine.msim"); |
gxemul=sysinfo_value("machine.lgxemul"); |
return 1; |
} |
//* |
//* |
//* Please preserve this code (it can be used to determine scancodes) |
//* |
int to_hex(int v) |
{ |
return "0123456789ABCDEF"[v]; |
} |
//*/ |
static int kbd_arch_process_msim(keybuffer_t *keybuffer, int scan_code) |
{ |
static unsigned long buf=0; |
static int count=0; |
//* Please preserve this code (it can be used to determine scancodes) |
//* |
//keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf)); |
//keybuffer_push(keybuffer, to_hex(scan_code&0xf)); |
//keybuffer_push(keybuffer, ' '); |
//keybuffer_push(keybuffer, ' '); |
//*/ |
//return 1; |
if(scan_code==0x7e) |
{ |
switch (buf){ |
case MSIM_KEY_F5: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 5 ); |
buf=count=0; |
return 1; |
case MSIM_KEY_F6: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 6 ); |
buf=count=0; |
return 1; |
case MSIM_KEY_F7: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 7 ); |
buf=count=0; |
return 1; |
case MSIM_KEY_F8: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 8 ); |
buf=count=0; |
return 1; |
case MSIM_KEY_F9: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 9 ); |
buf=count=0; |
return 1; |
case MSIM_KEY_F10: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 10 ); |
buf=count=0; |
return 1; |
case MSIM_KEY_F11: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 11 ); |
buf=count=0; |
return 1; |
case MSIM_KEY_F12: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 12 ); |
buf=count=0; |
return 1; |
default: |
keybuffer_push(keybuffer, buf & 0xff ); |
keybuffer_push(keybuffer, (buf >> 8) &0xff ); |
keybuffer_push(keybuffer, (buf >> 16) &0xff ); |
keybuffer_push(keybuffer, (buf >> 24) &0xff ); |
keybuffer_push(keybuffer, scan_code ); |
buf=count=0; |
return 1; |
} |
} |
buf|=((unsigned long) scan_code)<<(8*(count++)); |
if((buf & 0xff)!= (MSIM_KEY_F1 & 0xff)) { |
keybuffer_push(keybuffer,buf ); |
buf=count=0; |
return 1; |
} |
if ( count <= 1 ) |
return 1; |
if( (buf & 0xffff) != (MSIM_KEY_F1 & 0xffff) |
&& (buf & 0xffff) != (MSIM_KEY_F5 & 0xffff) ) { |
keybuffer_push(keybuffer, buf & 0xff ); |
keybuffer_push(keybuffer, (buf >> 8) &0xff ); |
buf=count=0; |
return 1; |
} |
if ( count <= 2) |
return 1; |
switch (buf){ |
case MSIM_KEY_F1: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 1 ); |
buf=count=0; |
return 1; |
case MSIM_KEY_F2: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 2 ); |
buf=count=0; |
return 1; |
case MSIM_KEY_F3: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 3 ); |
buf=count=0; |
return 1; |
case MSIM_KEY_F4: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 4 ); |
buf=count=0; |
return 1; |
} |
if( (buf & 0xffffff) != (MSIM_KEY_F5 & 0xffffff) |
&& (buf & 0xffffff) != (MSIM_KEY_F9 & 0xffffff) ) { |
keybuffer_push(keybuffer, buf & 0xff ); |
keybuffer_push(keybuffer, (buf >> 8) &0xff ); |
keybuffer_push(keybuffer, (buf >> 16) &0xff ); |
buf=count=0; |
return 1; |
} |
if ( count <= 3 ) |
return 1; |
switch (buf){ |
case MSIM_KEY_F5: |
case MSIM_KEY_F6: |
case MSIM_KEY_F7: |
case MSIM_KEY_F8: |
case MSIM_KEY_F9: |
case MSIM_KEY_F10: |
case MSIM_KEY_F11: |
case MSIM_KEY_F12: |
return 1; |
default: |
keybuffer_push(keybuffer, buf & 0xff ); |
keybuffer_push(keybuffer, (buf >> 8) &0xff ); |
keybuffer_push(keybuffer, (buf >> 16) &0xff ); |
keybuffer_push(keybuffer, (buf >> 24) &0xff ); |
buf=count=0; |
return 1; |
} |
return 1; |
} |
static int kbd_arch_process_gxemul(keybuffer_t *keybuffer, int scan_code) |
{ |
static unsigned long buf=0; |
static int count=0; |
//* Please preserve this code (it can be used to determine scancodes) |
//* |
//keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf)); |
//keybuffer_push(keybuffer, to_hex(scan_code&0xf)); |
//keybuffer_push(keybuffer, ' '); |
//keybuffer_push(keybuffer, ' '); |
//*/ |
//return 1; |
if ( scan_code == '\r' ) |
scan_code = '\n' ; |
buf|=((unsigned long) scan_code)<<(8*(count++)); |
if((buf & 0xff)!= (GXEMUL_KEY_F1 & 0xff)) { |
keybuffer_push(keybuffer,buf ); |
buf=count=0; |
return 1; |
} |
if ( count <= 1 ) |
return 1; |
if( (buf & 0xffff) != (GXEMUL_KEY_F1 & 0xffff) ) { |
keybuffer_push(keybuffer, buf & 0xff ); |
keybuffer_push(keybuffer, (buf >> 8) &0xff ); |
buf=count=0; |
return 1; |
} |
if ( count <= 2) |
return 1; |
if( (buf & 0xffffff) != (GXEMUL_KEY_F1 & 0xffffff) |
&& (buf & 0xffffff) != (GXEMUL_KEY_F5 & 0xffffff) |
&& (buf & 0xffffff) != (GXEMUL_KEY_F9 & 0xffffff) ) { |
keybuffer_push(keybuffer, buf & 0xff ); |
keybuffer_push(keybuffer, (buf >> 8) &0xff ); |
keybuffer_push(keybuffer, (buf >> 16) &0xff ); |
buf=count=0; |
return 1; |
} |
if ( count <= 3 ) |
return 1; |
switch (buf){ |
case GXEMUL_KEY_F1: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 1 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F2: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 2 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F3: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 3 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F4: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 4 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F5: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 5 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F6: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 6 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F7: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 7 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F8: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 8 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F9: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 9 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F10: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 10 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F11: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 11 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F12: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 12 ); |
buf=count=0; |
return 1; |
default: |
keybuffer_push(keybuffer, buf & 0xff ); |
keybuffer_push(keybuffer, (buf >> 8) &0xff ); |
keybuffer_push(keybuffer, (buf >> 16) &0xff ); |
keybuffer_push(keybuffer, (buf >> 24) &0xff ); |
buf=count=0; |
return 1; |
} |
return 1; |
} |
int kbd_arch_process(keybuffer_t *keybuffer, int scan_code) |
{ |
static int esc_count=0; |
if ( scan_code == 0x1b ) { |
esc_count++; |
if ( esc_count == 3 ) { |
__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE); |
} |
} else { |
esc_count=0; |
} |
if(msim) return kbd_arch_process_msim(keybuffer, scan_code); |
if(gxemul) return kbd_arch_process_gxemul(keybuffer, scan_code); |
return 0; |
} |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/kbd/arch/mips32eb |
---|
0,0 → 1,0 |
link mips32 |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/kbd/include/kbd.h |
---|
0,0 → 1,60 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup kbdgen generic |
* @brief HelenOS generic uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __KBD_H__ |
#define __KBD_H__ |
#define KBD_PUSHCHAR 1024 |
#define KBD_KEY_F1 0x3b |
#define KBD_KEY_F2 0x3c |
#define KBD_KEY_F3 0x3d |
#define KBD_KEY_F4 0x3e |
#define KBD_KEY_F5 0x3f |
#define KBD_KEY_F6 0x40 |
#define KBD_KEY_F7 0x41 |
#define KBD_KEY_F8 0x42 |
#define KBD_KEY_F9 0x43 |
#define KBD_KEY_F10 0x44 |
#define KBD_KEY_F11 0x45 |
#define KBD_KEY_F12 0x46 |
#endif |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/kbd/include/key_buffer.h |
---|
0,0 → 1,64 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup kbdgen |
* @brief HelenOS generic uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __KEY_BUFFER_H__ |
#define __KEY_BUFFER_H__ |
#include <types.h> |
/** Size of buffer for pressed keys */ |
#define KEYBUFFER_SIZE 128 |
typedef struct { |
int fifo[KEYBUFFER_SIZE]; |
unsigned long head; |
unsigned long tail; |
unsigned long items; |
} keybuffer_t; |
void keybuffer_free(keybuffer_t *keybuffer); |
void keybuffer_init(keybuffer_t *keybuffer); |
int keybuffer_available(keybuffer_t *keybuffer); |
int keybuffer_empty(keybuffer_t *keybuffer); |
void keybuffer_push(keybuffer_t *keybuffer, int key); |
int keybuffer_pop(keybuffer_t *keybuffer, int *c); |
#endif |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/kbd/generic/kbd.c |
---|
0,0 → 1,147 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @defgroup kbd Keyboard handler |
* @brief HelenOS uspace keyboard handler. |
* @{ |
* @} |
*/ |
/** @addtogroup kbdgen generic |
* @brief HelenOS generic uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <stdio.h> |
#include <unistd.h> |
#include <stdlib.h> |
#include <stdio.h> |
#include <ipc/ns.h> |
#include <errno.h> |
#include <arch/kbd.h> |
#include <kbd.h> |
#include <libadt/fifo.h> |
#include <key_buffer.h> |
#include <async.h> |
#define NAME "KBD" |
int cons_connected = 0; |
int phone2cons = -1; |
keybuffer_t keybuffer; |
static void irq_handler(ipc_callid_t iid, ipc_call_t *call) |
{ |
int chr; |
if (cons_connected && phone2cons != -1) { |
/* recode to ASCII - one interrupt can produce more than one code so result is stored in fifo */ |
kbd_arch_process(&keybuffer, IPC_GET_ARG2(*call)); |
while (!keybuffer_empty(&keybuffer)) { |
if (!keybuffer_pop(&keybuffer, (int *)&chr)) |
break; |
async_msg(phone2cons, KBD_PUSHCHAR, chr); |
} |
} |
} |
static void console_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
int retval; |
if (cons_connected) { |
ipc_answer_fast(iid, ELIMIT, 0, 0); |
return; |
} |
cons_connected = 1; |
ipc_answer_fast(iid, 0, 0, 0); |
while (1) { |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
cons_connected = 0; |
ipc_hangup(phone2cons); |
phone2cons = -1; |
ipc_answer_fast(callid, 0,0,0); |
return; |
case IPC_M_CONNECT_TO_ME: |
if (phone2cons != -1) { |
retval = ELIMIT; |
break; |
} |
phone2cons = IPC_GET_ARG3(call); |
retval = 0; |
break; |
} |
ipc_answer_fast(callid, retval, 0, 0); |
} |
} |
int main(int argc, char **argv) |
{ |
ipc_call_t call; |
ipc_callid_t callid; |
int res; |
ipcarg_t phonead; |
ipcarg_t phoneid; |
char connected = 0; |
ipcarg_t retval, arg1, arg2; |
/* Initialize arch dependent parts */ |
if (!(res = kbd_arch_init())) { |
return -1; |
}; |
/* Initialize key buffer */ |
keybuffer_init(&keybuffer); |
async_set_client_connection(console_connection); |
async_set_interrupt_received(irq_handler); |
/* Register service at nameserver */ |
if ((res = ipc_connect_to_me(PHONE_NS, SERVICE_KEYBOARD, 0, &phonead)) != 0) { |
return -1; |
} |
async_manager(); |
} |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/kbd/generic/key_buffer.c |
---|
0,0 → 1,114 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup kbdgen |
* @brief HelenOS generic uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#include <key_buffer.h> |
#include <futex.h> |
atomic_t keybuffer_futex = FUTEX_INITIALIZER; |
/** Clear key buffer. |
*/ |
void keybuffer_free(keybuffer_t *keybuffer) |
{ |
futex_down(&keybuffer_futex); |
keybuffer->head = 0; |
keybuffer->tail = 0; |
keybuffer->items = 0; |
futex_up(&keybuffer_futex); |
} |
/** Key buffer initialization. |
* |
*/ |
void keybuffer_init(keybuffer_t *keybuffer) |
{ |
keybuffer_free(keybuffer); |
} |
/** Get free space in buffer. |
* This function is useful for processing some scancodes that are translated |
* to more than one character. |
* @return empty buffer space |
*/ |
int keybuffer_available(keybuffer_t *keybuffer) |
{ |
return KEYBUFFER_SIZE - keybuffer->items; |
} |
/** |
* @return nonzero, if buffer is not empty. |
*/ |
int keybuffer_empty(keybuffer_t *keybuffer) |
{ |
return (keybuffer->items == 0); |
} |
/** Push key to key buffer. |
* If buffer is full, character is ignored. |
* @param key code of stored key |
*/ |
void keybuffer_push(keybuffer_t *keybuffer, int key) |
{ |
futex_down(&keybuffer_futex); |
if (keybuffer->items < KEYBUFFER_SIZE) { |
keybuffer->fifo[keybuffer->tail] = key; |
keybuffer->tail = (keybuffer->tail + 1) % KEYBUFFER_SIZE; |
keybuffer->items++; |
} |
futex_up(&keybuffer_futex); |
} |
/** Pop character from buffer. |
* @param c pointer to space where to store character from buffer. |
* @return zero on empty buffer, nonzero else |
*/ |
int keybuffer_pop(keybuffer_t *keybuffer, int *c) |
{ |
futex_down(&keybuffer_futex); |
if (keybuffer->items > 0) { |
keybuffer->items--; |
*c = (keybuffer->fifo[keybuffer->head]) ; |
keybuffer->head = (keybuffer->head + 1) % KEYBUFFER_SIZE; |
futex_up(&keybuffer_futex); |
return 1; |
} |
futex_up(&keybuffer_futex); |
return 0; |
} |
/** |
* @} |
*/ |
/tags/0.2.0/uspace/kbd/Makefile |
---|
0,0 → 1,82 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../libc |
SOFTINT_PREFIX = ../softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -Iinclude -I../libadt/include |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = kbd |
GENERIC_SOURCES = \ |
generic/kbd.c \ |
generic/key_buffer.c |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/kbd.c |
GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES))) |
ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES))) |
.PHONY: all clean depend disasm links |
all: links $(OUTPUT) disasm |
-include Makefile.depend |
links: |
ln -sfn ../arch/$(ARCH)/include include/arch |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend include/arch |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(ARCH_OBJECTS) $(GENERIC_OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(GENERIC_OBJECTS) $(ARCH_OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.2.0/uspace/softfloat/include/sub.h |
---|
0,0 → 1,47 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SUB_H__ |
#define __SUB_H__ |
float32 subFloat32(float32 a, float32 b); |
float64 subFloat64(float64 a, float64 b); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/include/comparison.h |
---|
0,0 → 1,59 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __COMPARISON_H__ |
#define __COMPARISON_H__ |
inline int isFloat32NaN(float32 f); |
inline int isFloat32SigNaN(float32 f); |
inline int isFloat32Infinity(float32 f); |
inline int isFloat32Zero(float32 f); |
inline int isFloat64NaN(float64 d); |
inline int isFloat64SigNaN(float64 d); |
inline int isFloat64Infinity(float64 d); |
inline int isFloat64Zero(float64 d); |
inline int isFloat32eq(float32 a, float32 b); |
inline int isFloat32lt(float32 a, float32 b); |
inline int isFloat32gt(float32 a, float32 b); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/include/mul.h |
---|
0,0 → 1,49 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __MUL_H__ |
#define __MUL_H__ |
float32 mulFloat32(float32 a, float32 b); |
float64 mulFloat64(float64 a, float64 b); |
void mul64integers(uint64_t a,uint64_t b, uint64_t *lo, uint64_t *hi); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/include/sftypes.h |
---|
0,0 → 1,112 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SFTYPES_H__ |
#define __SFTYPES_H__ |
#include <endian.h> |
#include <stdint.h> |
typedef union { |
float f; |
uint32_t binary; |
struct { |
#if __BYTE_ORDER == __BIG_ENDIAN |
uint32_t sign:1; |
uint32_t exp:8; |
uint32_t fraction:23; |
#elif __BYTE_ORDER == __LITTLE_ENDIAN |
uint32_t fraction:23; |
uint32_t exp:8; |
uint32_t sign:1; |
#else |
#error "Unknown endians." |
#endif |
} parts __attribute__ ((packed)); |
} float32; |
typedef union { |
double d; |
uint64_t binary; |
struct { |
#if __BYTE_ORDER == __BIG_ENDIAN |
uint64_t sign:1; |
uint64_t exp:11; |
uint64_t fraction:52; |
#elif __BYTE_ORDER == __LITTLE_ENDIAN |
uint64_t fraction:52; |
uint64_t exp:11; |
uint64_t sign:1; |
#else |
#error "Unknown endians." |
#endif |
} parts __attribute__ ((packed)); |
} float64; |
#define FLOAT32_MAX 0x7f800000 |
#define FLOAT32_MIN 0xff800000 |
#define FLOAT64_MAX |
#define FLOAT64_MIN |
/* For recognizing NaNs or infinity use isFloat32NaN and is Float32Inf, comparing with this constants is not sufficient */ |
#define FLOAT32_NAN 0x7FC00001 |
#define FLOAT32_SIGNAN 0x7F800001 |
#define FLOAT32_INF 0x7F800000 |
#define FLOAT64_NAN 0x7FF8000000000001ll |
#define FLOAT64_SIGNAN 0x7FF0000000000001ll |
#define FLOAT64_INF 0x7FF0000000000000ll |
#define FLOAT32_FRACTION_SIZE 23 |
#define FLOAT64_FRACTION_SIZE 52 |
#define FLOAT32_HIDDEN_BIT_MASK 0x800000 |
#define FLOAT64_HIDDEN_BIT_MASK 0x10000000000000ll |
#define FLOAT32_MAX_EXPONENT 0xFF |
#define FLOAT64_MAX_EXPONENT 0x7FF |
#define FLOAT32_BIAS 0x7F |
#define FLOAT64_BIAS 0x3FF |
#define FLOAT80_BIAS 0x3FFF |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/include/other.h |
---|
0,0 → 1,43 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __OTHER_H__ |
#define __OTHER_H__ |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/include/softfloat.h |
---|
0,0 → 1,174 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_H__ |
#define __SOFTFLOAT_H__ |
float __addsf3(float a, float b); |
double __adddf3(double a, double b); |
long double __addtf3(long double a, long double b); |
long double __addxf3(long double a, long double b); |
float __subsf3(float a, float b); |
double __subdf3(double a, double b); |
long double __subtf3(long double a, long double b); |
long double __subxf3(long double a, long double b); |
float __mulsf3(float a, float b); |
double __muldf3(double a, double b); |
long double __multf3(long double a, long double b); |
long double __mulxf3(long double a, long double b); |
float __divsf3(float a, float b); |
double __divdf3(double a, double b); |
long double __divtf3(long double a, long double b); |
long double __divxf3(long double a, long double b); |
float __negsf2(float a); |
double __negdf2(double a); |
long double __negtf2(long double a); |
long double __negxf2(long double a); |
double __extendsfdf2(float a); |
long double __extendsftf2(float a); |
long double __extendsfxf2(float a); |
long double __extenddftf2(double a); |
long double __extenddfxf2(double a); |
double __truncxfdf2(long double a); |
double __trunctfdf2(long double a); |
float __truncxfsf2(long double a); |
float __trunctfsf2(long double a); |
float __truncdfsf2(double a); |
int __fixsfsi(float a); |
int __fixdfsi(double a); |
int __fixtfsi(long double a); |
int __fixxfsi(long double a); |
long __fixsfdi(float a); |
long __fixdfdi(double a); |
long __fixtfdi(long double a); |
long __fixxfdi(long double a); |
long long __fixsfti(float a); |
long long __fixdfti(double a); |
long long __fixtfti(long double a); |
long long __fixxfti(long double a); |
unsigned int __fixunssfsi(float a); |
unsigned int __fixunsdfsi(double a); |
unsigned int __fixunstfsi(long double a); |
unsigned int __fixunsxfsi(long double a); |
unsigned long __fixunssfdi(float a); |
unsigned long __fixunsdfdi(double a); |
unsigned long __fixunstfdi(long double a); |
unsigned long __fixunsxfdi(long double a); |
unsigned long long __fixunssfti(float a); |
unsigned long long __fixunsdfti(double a); |
unsigned long long __fixunstfti(long double a); |
unsigned long long __fixunsxfti(long double a); |
float __floatsisf(int i); |
double __floatsidf(int i); |
long double __floatsitf(int i); |
long double __floatsixf(int i); |
float __floatdisf(long i); |
double __floatdidf(long i); |
long double __floatditf(long i); |
long double __floatdixf(long i); |
float __floattisf(long long i); |
double __floattidf(long long i); |
long double __floattitf(long long i); |
long double __floattixf(long long i); |
float __floatunsisf(unsigned int i); |
double __floatunsidf(unsigned int i); |
long double __floatunsitf(unsigned int i); |
long double __floatunsixf(unsigned int i); |
float __floatundisf(unsigned long i); |
double __floatundidf(unsigned long i); |
long double __floatunditf(unsigned long i); |
long double __floatundixf(unsigned long i); |
float __floatuntisf(unsigned long long i); |
double __floatuntidf(unsigned long long i); |
long double __floatuntitf(unsigned long long i); |
long double __floatuntixf(unsigned long long i); |
int __cmpsf2(float a, float b); |
int __cmpdf2(double a, double b); |
int __cmptf2(long double a, long double b); |
int __unordsf2(float a, float b); |
int __unorddf2(double a, double b); |
int __unordtf2(long double a, long double b); |
int __eqsf2(float a, float b); |
int __eqdf2(double a, double b); |
int __eqtf2(long double a, long double b); |
int __nesf2(float a, float b); |
int __nedf2(double a, double b); |
int __netf2(long double a, long double b); |
int __gesf2(float a, float b); |
int __gedf2(double a, double b); |
int __getf2(long double a, long double b); |
int __ltsf2(float a, float b); |
int __ltdf2(double a, double b); |
int __lttf2(long double a, long double b); |
int __lesf2(float a, float b); |
int __ledf2(double a, double b); |
int __letf2(long double a, long double b); |
int __gtsf2(float a, float b); |
int __gtdf2(double a, double b); |
int __gttf2(long double a, long double b); |
/* Not implemented yet*/ |
float __powisf2(float a, int b); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/include/div.h |
---|
0,0 → 1,48 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __DIV_H__ |
#define __DIV_H__ |
float32 divFloat32(float32 a, float32 b); |
float64 divFloat64(float64 a, float64 b); |
uint64_t divFloat64estim(uint64_t a, uint64_t b); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/include/conversion.h |
---|
0,0 → 1,71 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __CONVERSION_H__ |
#define __CONVERSION_H__ |
float64 convertFloat32ToFloat64(float32 a); |
float32 convertFloat64ToFloat32(float64 a); |
uint32_t float32_to_uint32(float32 a); |
int32_t float32_to_int32(float32 a); |
uint64_t float32_to_uint64(float32 a); |
int64_t float32_to_int64(float32 a); |
uint64_t float64_to_uint64(float64 a); |
int64_t float64_to_int64(float64 a); |
uint32_t float64_to_uint32(float64 a); |
int32_t float64_to_int32(float64 a); |
float32 uint32_to_float32(uint32_t i); |
float32 int32_to_float32(int32_t i); |
float32 uint64_to_float32(uint64_t i); |
float32 int64_to_float32(int64_t i); |
float64 uint32_to_float64(uint32_t i); |
float64 int32_to_float64(int32_t i); |
float64 uint64_to_float64(uint64_t i); |
float64 int64_to_float64(int64_t i); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/include/add.h |
---|
0,0 → 1,47 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ADD_H__ |
#define __ADD_H__ |
float32 addFloat32(float32 a, float32 b); |
float64 addFloat64(float64 a, float64 b); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/include/common.h |
---|
0,0 → 1,53 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __COMMON_H__ |
#define __COMMON_H__ |
#include<sftypes.h> |
float64 finishFloat64(int32_t cexp, uint64_t cfrac, char sign); |
int countZeroes64(uint64_t i); |
int countZeroes32(uint32_t i); |
int countZeroes8(uint8_t i); |
void roundFloat32(int32_t *exp, uint32_t *fraction); |
void roundFloat64(int32_t *exp, uint64_t *fraction); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/generic/other.c |
---|
0,0 → 1,39 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/generic/softfloat.c |
---|
0,0 → 1,504 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @defgroup sfl Softfloat |
* @brief Software FPU emulation. |
* @{ |
* @} |
*/ |
/** @addtogroup softfloat generic |
* @ingroup sfl |
* @brief Architecture independent parts of FPU software emulation library. |
* @{ |
*/ |
/** @file |
*/ |
#include<softfloat.h> |
#include<sftypes.h> |
#include<add.h> |
#include<sub.h> |
#include<mul.h> |
#include<div.h> |
#include<conversion.h> |
#include<comparison.h> |
#include<other.h> |
#include<functions.h> |
/* Arithmetic functions */ |
float __addsf3(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if (fa.parts.sign != fb.parts.sign) { |
if (fa.parts.sign) { |
fa.parts.sign = 0; |
return subFloat32(fb, fa).f; |
}; |
fb.parts.sign = 0; |
return subFloat32(fa, fb).f; |
} |
return addFloat32(fa, fb).f; |
} |
double __adddf3(double a, double b) |
{ |
float64 da, db; |
da.d = a; |
db.d = b; |
if (da.parts.sign != db.parts.sign) { |
if (da.parts.sign) { |
da.parts.sign = 0; |
return subFloat64(db, da).d; |
}; |
db.parts.sign = 0; |
return subFloat64(da, db).d; |
} |
return addFloat64(da, db).d; |
} |
float __subsf3(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if (fa.parts.sign != fb.parts.sign) { |
fb.parts.sign = !fb.parts.sign; |
return addFloat32(fa, fb).f; |
} |
return subFloat32(fa, fb).f; |
} |
double __subdf3(double a, double b) |
{ |
float64 da, db; |
da.d = a; |
db.d = b; |
if (da.parts.sign != db.parts.sign) { |
db.parts.sign = !db.parts.sign; |
return addFloat64(da, db).d; |
} |
return subFloat64(da, db).d; |
} |
float __mulsf3(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
return mulFloat32(fa, fb).f; |
} |
double __muldf3(double a, double b) |
{ |
float64 da, db; |
da.d = a; |
db.d = b; |
return mulFloat64(da, db).d; |
} |
float __divsf3(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
return divFloat32(fa, fb).f; |
} |
double __divdf3(double a, double b) |
{ |
float64 da, db; |
da.d = a; |
db.d = b; |
return divFloat64(da, db).d; |
} |
float __negsf2(float a) |
{ |
float32 fa; |
fa.f = a; |
fa.parts.sign = !fa.parts.sign; |
return fa.f; |
} |
double __negdf2(double a) |
{ |
float64 fa; |
fa.d = a; |
fa.parts.sign = !fa.parts.sign; |
return fa.d; |
} |
/* Conversion functions */ |
double __extendsfdf2(float a) |
{ |
float32 fa; |
fa.f = a; |
return convertFloat32ToFloat64(fa).d; |
} |
float __truncdfsf2(double a) |
{ |
float64 da; |
da.d = a; |
return convertFloat64ToFloat32(da).f; |
} |
int __fixsfsi(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_int(fa); |
} |
int __fixdfsi(double a) |
{ |
float64 da; |
da.d = a; |
return float64_to_int(da); |
} |
long __fixsfdi(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_long(fa); |
} |
long __fixdfdi(double a) |
{ |
float64 da; |
da.d = a; |
return float64_to_long(da); |
} |
long long __fixsfti(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_longlong(fa); |
} |
long long __fixdfti(double a) |
{ |
float64 da; |
da.d = a; |
return float64_to_longlong(da); |
} |
unsigned int __fixunssfsi(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_uint(fa); |
} |
unsigned int __fixunsdfsi(double a) |
{ |
float64 da; |
da.d = a; |
return float64_to_uint(da); |
} |
unsigned long __fixunssfdi(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_ulong(fa); |
} |
unsigned long __fixunsdfdi(double a) |
{ |
float64 da; |
da.d = a; |
return float64_to_ulong(da); |
} |
unsigned long long __fixunssfti(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_ulonglong(fa); |
} |
unsigned long long __fixunsdfti(double a) |
{ |
float64 da; |
da.d = a; |
return float64_to_ulonglong(da); |
} |
float __floatsisf(int i) |
{ |
float32 fa; |
fa = int_to_float32(i); |
return fa.f; |
} |
double __floatsidf(int i) |
{ |
float64 da; |
da = int_to_float64(i); |
return da.d; |
} |
float __floatdisf(long i) |
{ |
float32 fa; |
fa = long_to_float32(i); |
return fa.f; |
} |
double __floatdidf(long i) |
{ |
float64 da; |
da = long_to_float64(i); |
return da.d; |
} |
float __floattisf(long long i) |
{ |
float32 fa; |
fa = longlong_to_float32(i); |
return fa.f; |
} |
double __floattidf(long long i) |
{ |
float64 da; |
da = longlong_to_float64(i); |
return da.d; |
} |
float __floatunsisf(unsigned int i) |
{ |
float32 fa; |
fa = uint_to_float32(i); |
return fa.f; |
} |
double __floatunsidf(unsigned int i) |
{ |
float64 da; |
da = uint_to_float64(i); |
return da.d; |
} |
float __floatundisf(unsigned long i) |
{ |
float32 fa; |
fa = ulong_to_float32(i); |
return fa.f; |
} |
double __floatundidf(unsigned long i) |
{ |
float64 da; |
da = ulong_to_float64(i); |
return da.d; |
} |
float __floatuntisf(unsigned long long i) |
{ |
float32 fa; |
fa = ulonglong_to_float32(i); |
return fa.f; |
} |
double __floatuntidf(unsigned long long i) |
{ |
float64 da; |
da = ulonglong_to_float64(i); |
return da.d; |
} |
/* Comparison functions */ |
/* Comparison functions */ |
/* a<b .. -1 |
* a=b .. 0 |
* a>b .. 1 |
* */ |
int __cmpsf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) { |
return 1; /* no special constant for unordered - maybe signaled? */ |
}; |
if (isFloat32eq(fa, fb)) { |
return 0; |
}; |
if (isFloat32lt(fa, fb)) { |
return -1; |
}; |
return 1; |
} |
int __unordsf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
return ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ); |
} |
/** |
* @return zero, if neither argument is a NaN and are equal |
* */ |
int __eqsf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) { |
/* TODO: sigNaNs*/ |
return 1; |
}; |
return isFloat32eq(fa, fb) - 1; |
} |
/* strange behavior, but it was in gcc documentation */ |
int __nesf2(float a, float b) |
{ |
return __eqsf2(a, b); |
} |
/* return value >= 0 if a>=b and neither is NaN */ |
int __gesf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) { |
/* TODO: sigNaNs*/ |
return -1; |
}; |
if (isFloat32eq(fa, fb)) { |
return 0; |
}; |
if (isFloat32gt(fa, fb)) { |
return 1; |
}; |
return -1; |
} |
/** Return negative value, if a<b and neither is NaN*/ |
int __ltsf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) { |
/* TODO: sigNaNs*/ |
return 1; |
}; |
if (isFloat32lt(fa, fb)) { |
return -1; |
}; |
return 0; |
} |
/* return value <= 0 if a<=b and neither is NaN */ |
int __lesf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) { |
/* TODO: sigNaNs*/ |
return 1; |
}; |
if (isFloat32eq(fa, fb)) { |
return 0; |
}; |
if (isFloat32lt(fa, fb)) { |
return -1; |
}; |
return 1; |
} |
/** Return positive value, if a>b and neither is NaN*/ |
int __gtsf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) { |
/* TODO: sigNaNs*/ |
return -1; |
}; |
if (isFloat32gt(fa, fb)) { |
return 1; |
}; |
return 0; |
} |
/* Other functions */ |
float __powisf2(float a, int b) |
{ |
/* TODO: */ |
float32 fa; |
fa.binary = FLOAT32_NAN; |
return fa.f; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/generic/div.c |
---|
0,0 → 1,366 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include<sftypes.h> |
#include<add.h> |
#include<div.h> |
#include<comparison.h> |
#include<mul.h> |
#include<common.h> |
float32 divFloat32(float32 a, float32 b) |
{ |
float32 result; |
int32_t aexp, bexp, cexp; |
uint64_t afrac, bfrac, cfrac; |
result.parts.sign = a.parts.sign ^ b.parts.sign; |
if (isFloat32NaN(a)) { |
if (isFloat32SigNaN(a)) { |
/*FIXME: SigNaN*/ |
} |
/*NaN*/ |
return a; |
} |
if (isFloat32NaN(b)) { |
if (isFloat32SigNaN(b)) { |
/*FIXME: SigNaN*/ |
} |
/*NaN*/ |
return b; |
} |
if (isFloat32Infinity(a)) { |
if (isFloat32Infinity(b)) { |
/*FIXME: inf / inf */ |
result.binary = FLOAT32_NAN; |
return result; |
} |
/* inf / num */ |
result.parts.exp = a.parts.exp; |
result.parts.fraction = a.parts.fraction; |
return result; |
} |
if (isFloat32Infinity(b)) { |
if (isFloat32Zero(a)) { |
/* FIXME 0 / inf */ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
/* FIXME: num / inf*/ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
if (isFloat32Zero(b)) { |
if (isFloat32Zero(a)) { |
/*FIXME: 0 / 0*/ |
result.binary = FLOAT32_NAN; |
return result; |
} |
/* FIXME: division by zero */ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
afrac = a.parts.fraction; |
aexp = a.parts.exp; |
bfrac = b.parts.fraction; |
bexp = b.parts.exp; |
/* denormalized numbers */ |
if (aexp == 0) { |
if (afrac == 0) { |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
/* normalize it*/ |
afrac <<= 1; |
/* afrac is nonzero => it must stop */ |
while (! (afrac & FLOAT32_HIDDEN_BIT_MASK) ) { |
afrac <<= 1; |
aexp--; |
} |
} |
if (bexp == 0) { |
bfrac <<= 1; |
/* bfrac is nonzero => it must stop */ |
while (! (bfrac & FLOAT32_HIDDEN_BIT_MASK) ) { |
bfrac <<= 1; |
bexp--; |
} |
} |
afrac = (afrac | FLOAT32_HIDDEN_BIT_MASK ) << (32 - FLOAT32_FRACTION_SIZE - 1 ); |
bfrac = (bfrac | FLOAT32_HIDDEN_BIT_MASK ) << (32 - FLOAT32_FRACTION_SIZE ); |
if ( bfrac <= (afrac << 1) ) { |
afrac >>= 1; |
aexp++; |
} |
cexp = aexp - bexp + FLOAT32_BIAS - 2; |
cfrac = (afrac << 32) / bfrac; |
if (( cfrac & 0x3F ) == 0) { |
cfrac |= ( bfrac * cfrac != afrac << 32 ); |
} |
/* pack and round */ |
/* find first nonzero digit and shift result and detect possibly underflow */ |
while ((cexp > 0) && (cfrac) && (!(cfrac & (FLOAT32_HIDDEN_BIT_MASK << 7 )))) { |
cexp--; |
cfrac <<= 1; |
/* TODO: fix underflow */ |
}; |
cfrac += (0x1 << 6); /* FIXME: 7 is not sure*/ |
if (cfrac & (FLOAT32_HIDDEN_BIT_MASK << 7)) { |
++cexp; |
cfrac >>= 1; |
} |
/* check overflow */ |
if (cexp >= FLOAT32_MAX_EXPONENT ) { |
/* FIXME: overflow, return infinity */ |
result.parts.exp = FLOAT32_MAX_EXPONENT; |
result.parts.fraction = 0; |
return result; |
} |
if (cexp < 0) { |
/* FIXME: underflow */ |
result.parts.exp = 0; |
if ((cexp + FLOAT32_FRACTION_SIZE) < 0) { |
result.parts.fraction = 0; |
return result; |
} |
cfrac >>= 1; |
while (cexp < 0) { |
cexp ++; |
cfrac >>= 1; |
} |
} else { |
result.parts.exp = (uint32_t)cexp; |
} |
result.parts.fraction = ((cfrac >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)); |
return result; |
} |
float64 divFloat64(float64 a, float64 b) |
{ |
float64 result; |
int64_t aexp, bexp, cexp; |
uint64_t afrac, bfrac, cfrac; |
uint64_t remlo, remhi; |
result.parts.sign = a.parts.sign ^ b.parts.sign; |
if (isFloat64NaN(a)) { |
if (isFloat64SigNaN(b)) { |
/*FIXME: SigNaN*/ |
return b; |
} |
if (isFloat64SigNaN(a)) { |
/*FIXME: SigNaN*/ |
} |
/*NaN*/ |
return a; |
} |
if (isFloat64NaN(b)) { |
if (isFloat64SigNaN(b)) { |
/*FIXME: SigNaN*/ |
} |
/*NaN*/ |
return b; |
} |
if (isFloat64Infinity(a)) { |
if (isFloat64Infinity(b) || isFloat64Zero(b)) { |
/*FIXME: inf / inf */ |
result.binary = FLOAT64_NAN; |
return result; |
} |
/* inf / num */ |
result.parts.exp = a.parts.exp; |
result.parts.fraction = a.parts.fraction; |
return result; |
} |
if (isFloat64Infinity(b)) { |
if (isFloat64Zero(a)) { |
/* FIXME 0 / inf */ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
/* FIXME: num / inf*/ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
if (isFloat64Zero(b)) { |
if (isFloat64Zero(a)) { |
/*FIXME: 0 / 0*/ |
result.binary = FLOAT64_NAN; |
return result; |
} |
/* FIXME: division by zero */ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
afrac = a.parts.fraction; |
aexp = a.parts.exp; |
bfrac = b.parts.fraction; |
bexp = b.parts.exp; |
/* denormalized numbers */ |
if (aexp == 0) { |
if (afrac == 0) { |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
/* normalize it*/ |
aexp++; |
/* afrac is nonzero => it must stop */ |
while (! (afrac & FLOAT64_HIDDEN_BIT_MASK) ) { |
afrac <<= 1; |
aexp--; |
} |
} |
if (bexp == 0) { |
bexp++; |
/* bfrac is nonzero => it must stop */ |
while (! (bfrac & FLOAT64_HIDDEN_BIT_MASK) ) { |
bfrac <<= 1; |
bexp--; |
} |
} |
afrac = (afrac | FLOAT64_HIDDEN_BIT_MASK ) << (64 - FLOAT64_FRACTION_SIZE - 2 ); |
bfrac = (bfrac | FLOAT64_HIDDEN_BIT_MASK ) << (64 - FLOAT64_FRACTION_SIZE - 1); |
if ( bfrac <= (afrac << 1) ) { |
afrac >>= 1; |
aexp++; |
} |
cexp = aexp - bexp + FLOAT64_BIAS - 2; |
cfrac = divFloat64estim(afrac, bfrac); |
if (( cfrac & 0x1FF ) <= 2) { /*FIXME:?? */ |
mul64integers( bfrac, cfrac, &remlo, &remhi); |
/* (__u128)afrac << 64 - ( ((__u128)remhi<<64) + (__u128)remlo )*/ |
remhi = afrac - remhi - ( remlo > 0); |
remlo = - remlo; |
while ((int64_t) remhi < 0) { |
cfrac--; |
remlo += bfrac; |
remhi += ( remlo < bfrac ); |
} |
cfrac |= ( remlo != 0 ); |
} |
/* round and shift */ |
result = finishFloat64(cexp, cfrac, result.parts.sign); |
return result; |
} |
uint64_t divFloat64estim(uint64_t a, uint64_t b) |
{ |
uint64_t bhi; |
uint64_t remhi, remlo; |
uint64_t result; |
if ( b <= a ) { |
return 0xFFFFFFFFFFFFFFFFull; |
} |
bhi = b >> 32; |
result = ((bhi << 32) <= a) ?( 0xFFFFFFFFull << 32) : ( a / bhi) << 32; |
mul64integers(b, result, &remlo, &remhi); |
remhi = a - remhi - (remlo > 0); |
remlo = - remlo; |
b <<= 32; |
while ( (int64_t) remhi < 0 ) { |
result -= 0x1ll << 32; |
remlo += b; |
remhi += bhi + ( remlo < b ); |
} |
remhi = (remhi << 32) | (remlo >> 32); |
if (( bhi << 32) <= remhi) { |
result |= 0xFFFFFFFF; |
} else { |
result |= remhi / bhi; |
} |
return result; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/generic/conversion.c |
---|
0,0 → 1,596 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include "sftypes.h" |
#include "conversion.h" |
#include "comparison.h" |
#include "common.h" |
float64 convertFloat32ToFloat64(float32 a) |
{ |
float64 result; |
uint64_t frac; |
result.parts.sign = a.parts.sign; |
result.parts.fraction = a.parts.fraction; |
result.parts.fraction <<= (FLOAT64_FRACTION_SIZE - FLOAT32_FRACTION_SIZE ); |
if ((isFloat32Infinity(a))||(isFloat32NaN(a))) { |
result.parts.exp = 0x7FF; |
/* TODO; check if its correct for SigNaNs*/ |
return result; |
}; |
result.parts.exp = a.parts.exp + ( (int)FLOAT64_BIAS - FLOAT32_BIAS ); |
if (a.parts.exp == 0) { |
/* normalize denormalized numbers */ |
if (result.parts.fraction == 0ll) { /* fix zero */ |
result.parts.exp = 0ll; |
return result; |
} |
frac = result.parts.fraction; |
while (!(frac & (0x10000000000000ll))) { |
frac <<= 1; |
--result.parts.exp; |
}; |
++result.parts.exp; |
result.parts.fraction = frac; |
}; |
return result; |
} |
float32 convertFloat64ToFloat32(float64 a) |
{ |
float32 result; |
int32_t exp; |
uint64_t frac; |
result.parts.sign = a.parts.sign; |
if (isFloat64NaN(a)) { |
result.parts.exp = 0xFF; |
if (isFloat64SigNaN(a)) { |
result.parts.fraction = 0x400000; /* set first bit of fraction nonzero */ |
return result; |
} |
result.parts.fraction = 0x1; /* fraction nonzero but its first bit is zero */ |
return result; |
}; |
if (isFloat64Infinity(a)) { |
result.parts.fraction = 0; |
result.parts.exp = 0xFF; |
return result; |
}; |
exp = (int)a.parts.exp - FLOAT64_BIAS + FLOAT32_BIAS; |
if (exp >= 0xFF) { |
/*FIXME: overflow*/ |
result.parts.fraction = 0; |
result.parts.exp = 0xFF; |
return result; |
} else if (exp <= 0 ) { |
/* underflow or denormalized */ |
result.parts.exp = 0; |
exp *= -1; |
if (exp > FLOAT32_FRACTION_SIZE ) { |
/* FIXME: underflow */ |
result.parts.fraction = 0; |
return result; |
}; |
/* denormalized */ |
frac = a.parts.fraction; |
frac |= 0x10000000000000ll; /* denormalize and set hidden bit */ |
frac >>= (FLOAT64_FRACTION_SIZE - FLOAT32_FRACTION_SIZE + 1); |
while (exp > 0) { |
--exp; |
frac >>= 1; |
}; |
result.parts.fraction = frac; |
return result; |
}; |
result.parts.exp = exp; |
result.parts.fraction = a.parts.fraction >> (FLOAT64_FRACTION_SIZE - FLOAT32_FRACTION_SIZE); |
return result; |
} |
/** Helping procedure for converting float32 to uint32 |
* @param a floating point number in normalized form (no NaNs or Inf are checked ) |
* @return unsigned integer |
*/ |
static uint32_t _float32_to_uint32_helper(float32 a) |
{ |
uint32_t frac; |
if (a.parts.exp < FLOAT32_BIAS) { |
/*TODO: rounding*/ |
return 0; |
} |
frac = a.parts.fraction; |
frac |= FLOAT32_HIDDEN_BIT_MASK; |
/* shift fraction to left so hidden bit will be the most significant bit */ |
frac <<= 32 - FLOAT32_FRACTION_SIZE - 1; |
frac >>= 32 - (a.parts.exp - FLOAT32_BIAS) - 1; |
if ((a.parts.sign == 1) && (frac != 0)) { |
frac = ~frac; |
++frac; |
} |
return frac; |
} |
/* Convert float to unsigned int32 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
uint32_t float32_to_uint32(float32 a) |
{ |
if (isFloat32NaN(a)) { |
return MAX_UINT32; |
} |
if (isFloat32Infinity(a) || (a.parts.exp >= (32 + FLOAT32_BIAS))) { |
if (a.parts.sign) { |
return MIN_UINT32; |
} |
return MAX_UINT32; |
} |
return _float32_to_uint32_helper(a); |
} |
/* Convert float to signed int32 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
int32_t float32_to_int32(float32 a) |
{ |
if (isFloat32NaN(a)) { |
return MAX_INT32; |
} |
if (isFloat32Infinity(a) || (a.parts.exp >= (32 + FLOAT32_BIAS))) { |
if (a.parts.sign) { |
return MIN_INT32; |
} |
return MAX_INT32; |
} |
return _float32_to_uint32_helper(a); |
} |
/** Helping procedure for converting float64 to uint64 |
* @param a floating point number in normalized form (no NaNs or Inf are checked ) |
* @return unsigned integer |
*/ |
static uint64_t _float64_to_uint64_helper(float64 a) |
{ |
uint64_t frac; |
if (a.parts.exp < FLOAT64_BIAS) { |
/*TODO: rounding*/ |
return 0; |
} |
frac = a.parts.fraction; |
frac |= FLOAT64_HIDDEN_BIT_MASK; |
/* shift fraction to left so hidden bit will be the most significant bit */ |
frac <<= 64 - FLOAT64_FRACTION_SIZE - 1; |
frac >>= 64 - (a.parts.exp - FLOAT64_BIAS) - 1; |
if ((a.parts.sign == 1) && (frac != 0)) { |
frac = ~frac; |
++frac; |
} |
return frac; |
} |
/* Convert float to unsigned int64 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
uint64_t float64_to_uint64(float64 a) |
{ |
if (isFloat64NaN(a)) { |
return MAX_UINT64; |
} |
if (isFloat64Infinity(a) || (a.parts.exp >= (64 + FLOAT64_BIAS))) { |
if (a.parts.sign) { |
return MIN_UINT64; |
} |
return MAX_UINT64; |
} |
return _float64_to_uint64_helper(a); |
} |
/* Convert float to signed int64 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
int64_t float64_to_int64(float64 a) |
{ |
if (isFloat64NaN(a)) { |
return MAX_INT64; |
} |
if (isFloat64Infinity(a) || (a.parts.exp >= (64 + FLOAT64_BIAS))) { |
if (a.parts.sign) { |
return MIN_INT64; |
} |
return MAX_INT64; |
} |
return _float64_to_uint64_helper(a); |
} |
/** Helping procedure for converting float32 to uint64 |
* @param a floating point number in normalized form (no NaNs or Inf are checked ) |
* @return unsigned integer |
*/ |
static uint64_t _float32_to_uint64_helper(float32 a) |
{ |
uint64_t frac; |
if (a.parts.exp < FLOAT32_BIAS) { |
/*TODO: rounding*/ |
return 0; |
} |
frac = a.parts.fraction; |
frac |= FLOAT32_HIDDEN_BIT_MASK; |
/* shift fraction to left so hidden bit will be the most significant bit */ |
frac <<= 64 - FLOAT32_FRACTION_SIZE - 1; |
frac >>= 64 - (a.parts.exp - FLOAT32_BIAS) - 1; |
if ((a.parts.sign == 1) && (frac != 0)) { |
frac = ~frac; |
++frac; |
} |
return frac; |
} |
/* Convert float to unsigned int64 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
uint64_t float32_to_uint64(float32 a) |
{ |
if (isFloat32NaN(a)) { |
return MAX_UINT64; |
} |
if (isFloat32Infinity(a) || (a.parts.exp >= (64 + FLOAT32_BIAS))) { |
if (a.parts.sign) { |
return MIN_UINT64; |
} |
return MAX_UINT64; |
} |
return _float32_to_uint64_helper(a); |
} |
/* Convert float to signed int64 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
int64_t float32_to_int64(float32 a) |
{ |
if (isFloat32NaN(a)) { |
return MAX_INT64; |
} |
if (isFloat32Infinity(a) || (a.parts.exp >= (64 + FLOAT32_BIAS))) { |
if (a.parts.sign) { |
return (MIN_INT64); |
} |
return MAX_INT64; |
} |
return _float32_to_uint64_helper(a); |
} |
/* Convert float64 to unsigned int32 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
uint32_t float64_to_uint32(float64 a) |
{ |
if (isFloat64NaN(a)) { |
return MAX_UINT32; |
} |
if (isFloat64Infinity(a) || (a.parts.exp >= (32 + FLOAT64_BIAS))) { |
if (a.parts.sign) { |
return MIN_UINT32; |
} |
return MAX_UINT32; |
} |
return (uint32_t)_float64_to_uint64_helper(a); |
} |
/* Convert float64 to signed int32 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
int32_t float64_to_int32(float64 a) |
{ |
if (isFloat64NaN(a)) { |
return MAX_INT32; |
} |
if (isFloat64Infinity(a) || (a.parts.exp >= (32 + FLOAT64_BIAS))) { |
if (a.parts.sign) { |
return MIN_INT32; |
} |
return MAX_INT32; |
} |
return (int32_t)_float64_to_uint64_helper(a); |
} |
/** Convert unsigned integer to float32 |
* |
* |
*/ |
float32 uint32_to_float32(uint32_t i) |
{ |
int counter; |
int32_t exp; |
float32 result; |
result.parts.sign = 0; |
result.parts.fraction = 0; |
counter = countZeroes32(i); |
exp = FLOAT32_BIAS + 32 - counter - 1; |
if (counter == 32) { |
result.binary = 0; |
return result; |
} |
if (counter > 0) { |
i <<= counter - 1; |
} else { |
i >>= 1; |
} |
roundFloat32(&exp, &i); |
result.parts.fraction = i >> 7; |
result.parts.exp = exp; |
return result; |
} |
float32 int32_to_float32(int32_t i) |
{ |
float32 result; |
if (i < 0) { |
result = uint32_to_float32((uint32_t)(-i)); |
} else { |
result = uint32_to_float32((uint32_t)i); |
} |
result.parts.sign = i < 0; |
return result; |
} |
float32 uint64_to_float32(uint64_t i) |
{ |
int counter; |
int32_t exp; |
uint32_t j; |
float32 result; |
result.parts.sign = 0; |
result.parts.fraction = 0; |
counter = countZeroes64(i); |
exp = FLOAT32_BIAS + 64 - counter - 1; |
if (counter == 64) { |
result.binary = 0; |
return result; |
} |
/* Shift all to the first 31 bits (31. will be hidden 1)*/ |
if (counter > 33) { |
i <<= counter - 1 - 32; |
} else { |
i >>= 1 + 32 - counter; |
} |
j = (uint32_t)i; |
roundFloat32(&exp, &j); |
result.parts.fraction = j >> 7; |
result.parts.exp = exp; |
return result; |
} |
float32 int64_to_float32(int64_t i) |
{ |
float32 result; |
if (i < 0) { |
result = uint64_to_float32((uint64_t)(-i)); |
} else { |
result = uint64_to_float32((uint64_t)i); |
} |
result.parts.sign = i < 0; |
return result; |
} |
/** Convert unsigned integer to float64 |
* |
* |
*/ |
float64 uint32_to_float64(uint32_t i) |
{ |
int counter; |
int32_t exp; |
float64 result; |
uint64_t frac; |
result.parts.sign = 0; |
result.parts.fraction = 0; |
counter = countZeroes32(i); |
exp = FLOAT64_BIAS + 32 - counter - 1; |
if (counter == 32) { |
result.binary = 0; |
return result; |
} |
frac = i; |
frac <<= counter + 32 - 1; |
roundFloat64(&exp, &frac); |
result.parts.fraction = frac >> 10; |
result.parts.exp = exp; |
return result; |
} |
float64 int32_to_float64(int32_t i) |
{ |
float64 result; |
if (i < 0) { |
result = uint32_to_float64((uint32_t)(-i)); |
} else { |
result = uint32_to_float64((uint32_t)i); |
} |
result.parts.sign = i < 0; |
return result; |
} |
float64 uint64_to_float64(uint64_t i) |
{ |
int counter; |
int32_t exp; |
float64 result; |
result.parts.sign = 0; |
result.parts.fraction = 0; |
counter = countZeroes64(i); |
exp = FLOAT64_BIAS + 64 - counter - 1; |
if (counter == 64) { |
result.binary = 0; |
return result; |
} |
if (counter > 0) { |
i <<= counter - 1; |
} else { |
i >>= 1; |
} |
roundFloat64(&exp, &i); |
result.parts.fraction = i >> 10; |
result.parts.exp = exp; |
return result; |
} |
float64 int64_to_float64(int64_t i) |
{ |
float64 result; |
if (i < 0) { |
result = uint64_to_float64((uint64_t)(-i)); |
} else { |
result = uint64_to_float64((uint64_t)i); |
} |
result.parts.sign = i < 0; |
return result; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/generic/add.c |
---|
0,0 → 1,262 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include<sftypes.h> |
#include<add.h> |
#include<comparison.h> |
/** Add two Float32 numbers with same signs |
*/ |
float32 addFloat32(float32 a, float32 b) |
{ |
int expdiff; |
uint32_t exp1, exp2,frac1, frac2; |
expdiff = a.parts.exp - b.parts.exp; |
if (expdiff < 0) { |
if (isFloat32NaN(b)) { |
/* TODO: fix SigNaN */ |
if (isFloat32SigNaN(b)) { |
}; |
return b; |
}; |
if (b.parts.exp == FLOAT32_MAX_EXPONENT) { |
return b; |
} |
frac1 = b.parts.fraction; |
exp1 = b.parts.exp; |
frac2 = a.parts.fraction; |
exp2 = a.parts.exp; |
expdiff *= -1; |
} else { |
if ((isFloat32NaN(a)) || (isFloat32NaN(b))) { |
/* TODO: fix SigNaN */ |
if (isFloat32SigNaN(a) || isFloat32SigNaN(b)) { |
}; |
return (isFloat32NaN(a)?a:b); |
}; |
if (a.parts.exp == FLOAT32_MAX_EXPONENT) { |
return a; |
} |
frac1 = a.parts.fraction; |
exp1 = a.parts.exp; |
frac2 = b.parts.fraction; |
exp2 = b.parts.exp; |
}; |
if (exp1 == 0) { |
/* both are denormalized */ |
frac1 += frac2; |
if (frac1 & FLOAT32_HIDDEN_BIT_MASK ) { |
/* result is not denormalized */ |
a.parts.exp = 1; |
}; |
a.parts.fraction = frac1; |
return a; |
}; |
frac1 |= FLOAT32_HIDDEN_BIT_MASK; /* add hidden bit */ |
if (exp2 == 0) { |
/* second operand is denormalized */ |
--expdiff; |
} else { |
/* add hidden bit to second operand */ |
frac2 |= FLOAT32_HIDDEN_BIT_MASK; |
}; |
/* create some space for rounding */ |
frac1 <<= 6; |
frac2 <<= 6; |
if (expdiff < (FLOAT32_FRACTION_SIZE + 2) ) { |
frac2 >>= expdiff; |
frac1 += frac2; |
} else { |
a.parts.exp = exp1; |
a.parts.fraction = (frac1 >> 6) & (~(FLOAT32_HIDDEN_BIT_MASK)); |
return a; |
} |
if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7) ) { |
++exp1; |
frac1 >>= 1; |
}; |
/* rounding - if first bit after fraction is set then round up */ |
frac1 += (0x1 << 5); |
if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) { |
/* rounding overflow */ |
++exp1; |
frac1 >>= 1; |
}; |
if ((exp1 == FLOAT32_MAX_EXPONENT ) || (exp2 > exp1)) { |
/* overflow - set infinity as result */ |
a.parts.exp = FLOAT32_MAX_EXPONENT; |
a.parts.fraction = 0; |
return a; |
} |
a.parts.exp = exp1; |
/*Clear hidden bit and shift */ |
a.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)) ; |
return a; |
} |
/** Add two Float64 numbers with same signs |
*/ |
float64 addFloat64(float64 a, float64 b) |
{ |
int expdiff; |
uint32_t exp1, exp2; |
uint64_t frac1, frac2; |
expdiff = ((int )a.parts.exp) - b.parts.exp; |
if (expdiff < 0) { |
if (isFloat64NaN(b)) { |
/* TODO: fix SigNaN */ |
if (isFloat64SigNaN(b)) { |
}; |
return b; |
}; |
/* b is infinity and a not */ |
if (b.parts.exp == FLOAT64_MAX_EXPONENT ) { |
return b; |
} |
frac1 = b.parts.fraction; |
exp1 = b.parts.exp; |
frac2 = a.parts.fraction; |
exp2 = a.parts.exp; |
expdiff *= -1; |
} else { |
if (isFloat64NaN(a)) { |
/* TODO: fix SigNaN */ |
if (isFloat64SigNaN(a) || isFloat64SigNaN(b)) { |
}; |
return a; |
}; |
/* a is infinity and b not */ |
if (a.parts.exp == FLOAT64_MAX_EXPONENT ) { |
return a; |
} |
frac1 = a.parts.fraction; |
exp1 = a.parts.exp; |
frac2 = b.parts.fraction; |
exp2 = b.parts.exp; |
}; |
if (exp1 == 0) { |
/* both are denormalized */ |
frac1 += frac2; |
if (frac1 & FLOAT64_HIDDEN_BIT_MASK) { |
/* result is not denormalized */ |
a.parts.exp = 1; |
}; |
a.parts.fraction = frac1; |
return a; |
}; |
/* add hidden bit - frac1 is sure not denormalized */ |
frac1 |= FLOAT64_HIDDEN_BIT_MASK; |
/* second operand ... */ |
if (exp2 == 0) { |
/* ... is denormalized */ |
--expdiff; |
} else { |
/* is not denormalized */ |
frac2 |= FLOAT64_HIDDEN_BIT_MASK; |
}; |
/* create some space for rounding */ |
frac1 <<= 6; |
frac2 <<= 6; |
if (expdiff < (FLOAT64_FRACTION_SIZE + 2) ) { |
frac2 >>= expdiff; |
frac1 += frac2; |
} else { |
a.parts.exp = exp1; |
a.parts.fraction = (frac1 >> 6) & (~(FLOAT64_HIDDEN_BIT_MASK)); |
return a; |
} |
if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7) ) { |
++exp1; |
frac1 >>= 1; |
}; |
/* rounding - if first bit after fraction is set then round up */ |
frac1 += (0x1 << 5); |
if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) { |
/* rounding overflow */ |
++exp1; |
frac1 >>= 1; |
}; |
if ((exp1 == FLOAT64_MAX_EXPONENT ) || (exp2 > exp1)) { |
/* overflow - set infinity as result */ |
a.parts.exp = FLOAT64_MAX_EXPONENT; |
a.parts.fraction = 0; |
return a; |
} |
a.parts.exp = exp1; |
/*Clear hidden bit and shift */ |
a.parts.fraction = ( (frac1 >> 6 ) & (~FLOAT64_HIDDEN_BIT_MASK)); |
return a; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/generic/common.c |
---|
0,0 → 1,216 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include<sftypes.h> |
#include<common.h> |
/* Table for fast leading zeroes counting */ |
char zeroTable[256] = { |
8, 7, 7, 6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, \ |
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, \ |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \ |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \ |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
}; |
/** Take fraction shifted by 10 bits to left, round it, normalize it and detect exceptions |
* @param cexp exponent with bias |
* @param cfrac fraction shifted 10 places left with added hidden bit |
* @param sign |
* @return valied float64 |
*/ |
float64 finishFloat64(int32_t cexp, uint64_t cfrac, char sign) |
{ |
float64 result; |
result.parts.sign = sign; |
/* find first nonzero digit and shift result and detect possibly underflow */ |
while ((cexp > 0) && (cfrac) && (!(cfrac & (FLOAT64_HIDDEN_BIT_MASK << (64 - FLOAT64_FRACTION_SIZE - 1 ) )))) { |
cexp--; |
cfrac <<= 1; |
/* TODO: fix underflow */ |
}; |
if ((cexp < 0) || ( cexp == 0 && (!(cfrac & (FLOAT64_HIDDEN_BIT_MASK << (64 - FLOAT64_FRACTION_SIZE - 1)))))) { |
/* FIXME: underflow */ |
result.parts.exp = 0; |
if ((cexp + FLOAT64_FRACTION_SIZE + 1) < 0) { /* +1 is place for rounding */ |
result.parts.fraction = 0; |
return result; |
} |
while (cexp < 0) { |
cexp++; |
cfrac >>= 1; |
} |
cfrac += (0x1 << (64 - FLOAT64_FRACTION_SIZE - 3)); |
if (!(cfrac & (FLOAT64_HIDDEN_BIT_MASK << (64 - FLOAT64_FRACTION_SIZE - 1)))) { |
result.parts.fraction = ((cfrac >>(64 - FLOAT64_FRACTION_SIZE - 2) ) & (~FLOAT64_HIDDEN_BIT_MASK)); |
return result; |
} |
} else { |
cfrac += (0x1 << (64 - FLOAT64_FRACTION_SIZE - 3)); |
} |
++cexp; |
if (cfrac & (FLOAT64_HIDDEN_BIT_MASK << (64 - FLOAT64_FRACTION_SIZE - 1 ))) { |
++cexp; |
cfrac >>= 1; |
} |
/* check overflow */ |
if (cexp >= FLOAT64_MAX_EXPONENT ) { |
/* FIXME: overflow, return infinity */ |
result.parts.exp = FLOAT64_MAX_EXPONENT; |
result.parts.fraction = 0; |
return result; |
} |
result.parts.exp = (uint32_t)cexp; |
result.parts.fraction = ((cfrac >>(64 - FLOAT64_FRACTION_SIZE - 2 ) ) & (~FLOAT64_HIDDEN_BIT_MASK)); |
return result; |
} |
/** Counts leading zeroes in 64bit unsigned integer |
* @param i |
*/ |
int countZeroes64(uint64_t i) |
{ |
int j; |
for (j =0; j < 64; j += 8) { |
if ( i & (0xFFll << (56 - j))) { |
return (j + countZeroes8(i >> (56 - j))); |
} |
} |
return 64; |
} |
/** Counts leading zeroes in 32bit unsigned integer |
* @param i |
*/ |
int countZeroes32(uint32_t i) |
{ |
int j; |
for (j =0; j < 32; j += 8) { |
if ( i & (0xFF << (24 - j))) { |
return (j + countZeroes8(i >> (24 - j))); |
} |
} |
return 32; |
} |
/** Counts leading zeroes in byte |
* @param i |
*/ |
int countZeroes8(uint8_t i) |
{ |
return zeroTable[i]; |
} |
/** Round and normalize number expressed by exponent and fraction with first bit (equal to hidden bit) at 30. bit |
* @param exp exponent |
* @param fraction part with hidden bit shifted to 30. bit |
*/ |
void roundFloat32(int32_t *exp, uint32_t *fraction) |
{ |
/* rounding - if first bit after fraction is set then round up */ |
(*fraction) += (0x1 << 6); |
if ((*fraction) & (FLOAT32_HIDDEN_BIT_MASK << 8)) { |
/* rounding overflow */ |
++(*exp); |
(*fraction) >>= 1; |
}; |
if (((*exp) >= FLOAT32_MAX_EXPONENT ) || ((*exp) < 0)) { |
/* overflow - set infinity as result */ |
(*exp) = FLOAT32_MAX_EXPONENT; |
(*fraction) = 0; |
return; |
} |
return; |
} |
/** Round and normalize number expressed by exponent and fraction with first bit (equal to hidden bit) at 62. bit |
* @param exp exponent |
* @param fraction part with hidden bit shifted to 62. bit |
*/ |
void roundFloat64(int32_t *exp, uint64_t *fraction) |
{ |
/* rounding - if first bit after fraction is set then round up */ |
(*fraction) += (0x1 << 9); |
if ((*fraction) & (FLOAT64_HIDDEN_BIT_MASK << 11)) { |
/* rounding overflow */ |
++(*exp); |
(*fraction) >>= 1; |
}; |
if (((*exp) >= FLOAT64_MAX_EXPONENT ) || ((*exp) < 0)) { |
/* overflow - set infinity as result */ |
(*exp) = FLOAT64_MAX_EXPONENT; |
(*fraction) = 0; |
return; |
} |
return; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/generic/sub.c |
---|
0,0 → 1,265 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include<sftypes.h> |
#include<sub.h> |
#include<comparison.h> |
/** Subtract two float32 numbers with same signs |
*/ |
float32 subFloat32(float32 a, float32 b) |
{ |
int expdiff; |
uint32_t exp1, exp2, frac1, frac2; |
float32 result; |
result.f = 0; |
expdiff = a.parts.exp - b.parts.exp; |
if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts.fraction < b.parts.fraction))) { |
if (isFloat32NaN(b)) { |
/* TODO: fix SigNaN */ |
if (isFloat32SigNaN(b)) { |
}; |
return b; |
}; |
if (b.parts.exp == FLOAT32_MAX_EXPONENT) { |
b.parts.sign = !b.parts.sign; /* num -(+-inf) = -+inf */ |
return b; |
} |
result.parts.sign = !a.parts.sign; |
frac1 = b.parts.fraction; |
exp1 = b.parts.exp; |
frac2 = a.parts.fraction; |
exp2 = a.parts.exp; |
expdiff *= -1; |
} else { |
if (isFloat32NaN(a)) { |
/* TODO: fix SigNaN */ |
if (isFloat32SigNaN(a) || isFloat32SigNaN(b)) { |
}; |
return a; |
}; |
if (a.parts.exp == FLOAT32_MAX_EXPONENT) { |
if (b.parts.exp == FLOAT32_MAX_EXPONENT) { |
/* inf - inf => nan */ |
/* TODO: fix exception */ |
result.binary = FLOAT32_NAN; |
return result; |
}; |
return a; |
} |
result.parts.sign = a.parts.sign; |
frac1 = a.parts.fraction; |
exp1 = a.parts.exp; |
frac2 = b.parts.fraction; |
exp2 = b.parts.exp; |
}; |
if (exp1 == 0) { |
/* both are denormalized */ |
result.parts.fraction = frac1-frac2; |
if (result.parts.fraction > frac1) { |
/* TODO: underflow exception */ |
return result; |
}; |
result.parts.exp = 0; |
return result; |
}; |
/* add hidden bit */ |
frac1 |= FLOAT32_HIDDEN_BIT_MASK; |
if (exp2 == 0) { |
/* denormalized */ |
--expdiff; |
} else { |
/* normalized */ |
frac2 |= FLOAT32_HIDDEN_BIT_MASK; |
}; |
/* create some space for rounding */ |
frac1 <<= 6; |
frac2 <<= 6; |
if (expdiff > FLOAT32_FRACTION_SIZE + 1) { |
goto done; |
}; |
frac1 = frac1 - (frac2 >> expdiff); |
done: |
/* TODO: find first nonzero digit and shift result and detect possibly underflow */ |
while ((exp1 > 0) && (!(frac1 & (FLOAT32_HIDDEN_BIT_MASK << 6 )))) { |
--exp1; |
frac1 <<= 1; |
/* TODO: fix underflow - frac1 == 0 does not necessary means underflow... */ |
}; |
/* rounding - if first bit after fraction is set then round up */ |
frac1 += 0x20; |
if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) { |
++exp1; |
frac1 >>= 1; |
}; |
/*Clear hidden bit and shift */ |
result.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)); |
result.parts.exp = exp1; |
return result; |
} |
/** Subtract two float64 numbers with same signs |
*/ |
float64 subFloat64(float64 a, float64 b) |
{ |
int expdiff; |
uint32_t exp1, exp2; |
uint64_t frac1, frac2; |
float64 result; |
result.d = 0; |
expdiff = a.parts.exp - b.parts.exp; |
if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts.fraction < b.parts.fraction))) { |
if (isFloat64NaN(b)) { |
/* TODO: fix SigNaN */ |
if (isFloat64SigNaN(b)) { |
}; |
return b; |
}; |
if (b.parts.exp == FLOAT64_MAX_EXPONENT) { |
b.parts.sign = !b.parts.sign; /* num -(+-inf) = -+inf */ |
return b; |
} |
result.parts.sign = !a.parts.sign; |
frac1 = b.parts.fraction; |
exp1 = b.parts.exp; |
frac2 = a.parts.fraction; |
exp2 = a.parts.exp; |
expdiff *= -1; |
} else { |
if (isFloat64NaN(a)) { |
/* TODO: fix SigNaN */ |
if (isFloat64SigNaN(a) || isFloat64SigNaN(b)) { |
}; |
return a; |
}; |
if (a.parts.exp == FLOAT64_MAX_EXPONENT) { |
if (b.parts.exp == FLOAT64_MAX_EXPONENT) { |
/* inf - inf => nan */ |
/* TODO: fix exception */ |
result.binary = FLOAT64_NAN; |
return result; |
}; |
return a; |
} |
result.parts.sign = a.parts.sign; |
frac1 = a.parts.fraction; |
exp1 = a.parts.exp; |
frac2 = b.parts.fraction; |
exp2 = b.parts.exp; |
}; |
if (exp1 == 0) { |
/* both are denormalized */ |
result.parts.fraction = frac1 - frac2; |
if (result.parts.fraction > frac1) { |
/* TODO: underflow exception */ |
return result; |
}; |
result.parts.exp = 0; |
return result; |
}; |
/* add hidden bit */ |
frac1 |= FLOAT64_HIDDEN_BIT_MASK; |
if (exp2 == 0) { |
/* denormalized */ |
--expdiff; |
} else { |
/* normalized */ |
frac2 |= FLOAT64_HIDDEN_BIT_MASK; |
}; |
/* create some space for rounding */ |
frac1 <<= 6; |
frac2 <<= 6; |
if (expdiff > FLOAT64_FRACTION_SIZE + 1) { |
goto done; |
}; |
frac1 = frac1 - (frac2 >> expdiff); |
done: |
/* TODO: find first nonzero digit and shift result and detect possibly underflow */ |
while ((exp1 > 0) && (!(frac1 & (FLOAT64_HIDDEN_BIT_MASK << 6 )))) { |
--exp1; |
frac1 <<= 1; |
/* TODO: fix underflow - frac1 == 0 does not necessary means underflow... */ |
}; |
/* rounding - if first bit after fraction is set then round up */ |
frac1 += 0x20; |
if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) { |
++exp1; |
frac1 >>= 1; |
}; |
/*Clear hidden bit and shift */ |
result.parts.fraction = ((frac1 >> 6) & (~FLOAT64_HIDDEN_BIT_MASK)); |
result.parts.exp = exp1; |
return result; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/generic/comparison.c |
---|
0,0 → 1,133 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include<sftypes.h> |
#include<comparison.h> |
inline int isFloat32NaN(float32 f) |
{ /* NaN : exp = 0xff and nonzero fraction */ |
return ((f.parts.exp==0xFF)&&(f.parts.fraction)); |
} |
inline int isFloat64NaN(float64 d) |
{ /* NaN : exp = 0x7ff and nonzero fraction */ |
return ((d.parts.exp==0x7FF)&&(d.parts.fraction)); |
} |
inline int isFloat32SigNaN(float32 f) |
{ /* SigNaN : exp = 0xff fraction = 0xxxxx..x (binary), where at least one x is nonzero */ |
return ((f.parts.exp==0xFF)&&(f.parts.fraction<0x400000)&&(f.parts.fraction)); |
} |
inline int isFloat64SigNaN(float64 d) |
{ /* SigNaN : exp = 0x7ff fraction = 0xxxxx..x (binary), where at least one x is nonzero */ |
return ((d.parts.exp==0x7FF)&&(d.parts.fraction)&&(d.parts.fraction<0x8000000000000ll)); |
} |
inline int isFloat32Infinity(float32 f) |
{ |
return ((f.parts.exp==0xFF)&&(f.parts.fraction==0x0)); |
} |
inline int isFloat64Infinity(float64 d) |
{ |
return ((d.parts.exp==0x7FF)&&(d.parts.fraction==0x0)); |
} |
inline int isFloat32Zero(float32 f) |
{ |
return (((f.binary) & 0x7FFFFFFF) == 0); |
} |
inline int isFloat64Zero(float64 d) |
{ |
return (((d.binary) & 0x7FFFFFFFFFFFFFFFll) == 0); |
} |
/** |
* @return 1, if both floats are equal - but NaNs are not recognized |
*/ |
inline int isFloat32eq(float32 a, float32 b) |
{ |
return ((a.binary==b.binary)||(((a.binary| b.binary)&0x7FFFFFFF)==0)); /* a equals to b or both are zeros (with any sign) */ |
} |
/** |
* @return 1, if a<b - but NaNs are not recognized |
*/ |
inline int isFloat32lt(float32 a, float32 b) |
{ |
if (((a.binary| b.binary)&0x7FFFFFFF)==0) { |
return 0; /* +- zeroes */ |
}; |
if ((a.parts.sign)&&(b.parts.sign)) { |
/*if both are negative, smaller is that with greater binary value*/ |
return (a.binary>b.binary); |
}; |
/* lets negate signs - now will be positive numbers allways bigger than negative (first bit will be set for unsigned integer comparison)*/ |
a.parts.sign=!a.parts.sign; |
b.parts.sign=!b.parts.sign; |
return (a.binary<b.binary); |
} |
/** |
* @return 1, if a>b - but NaNs are not recognized |
*/ |
inline int isFloat32gt(float32 a, float32 b) |
{ |
if (((a.binary| b.binary)&0x7FFFFFFF)==0) { |
return 0; /* zeroes are equal with any sign */ |
}; |
if ((a.parts.sign)&&(b.parts.sign)) { |
/*if both are negative, greater is that with smaller binary value*/ |
return (a.binary<b.binary); |
}; |
/* lets negate signs - now will be positive numbers allways bigger than negative (first bit will be set for unsigned integer comparison)*/ |
a.parts.sign=!a.parts.sign; |
b.parts.sign=!b.parts.sign; |
return (a.binary>b.binary); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/generic/mul.c |
---|
0,0 → 1,297 |
/* |
* Copyright (C) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include<sftypes.h> |
#include<mul.h> |
#include<comparison.h> |
#include<common.h> |
/** Multiply two 32 bit float numbers |
* |
*/ |
float32 mulFloat32(float32 a, float32 b) |
{ |
float32 result; |
uint64_t frac1, frac2; |
int32_t exp; |
result.parts.sign = a.parts.sign ^ b.parts.sign; |
if (isFloat32NaN(a) || isFloat32NaN(b) ) { |
/* TODO: fix SigNaNs */ |
if (isFloat32SigNaN(a)) { |
result.parts.fraction = a.parts.fraction; |
result.parts.exp = a.parts.exp; |
return result; |
}; |
if (isFloat32SigNaN(b)) { /* TODO: fix SigNaN */ |
result.parts.fraction = b.parts.fraction; |
result.parts.exp = b.parts.exp; |
return result; |
}; |
/* set NaN as result */ |
result.binary = FLOAT32_NAN; |
return result; |
}; |
if (isFloat32Infinity(a)) { |
if (isFloat32Zero(b)) { |
/* FIXME: zero * infinity */ |
result.binary = FLOAT32_NAN; |
return result; |
} |
result.parts.fraction = a.parts.fraction; |
result.parts.exp = a.parts.exp; |
return result; |
} |
if (isFloat32Infinity(b)) { |
if (isFloat32Zero(a)) { |
/* FIXME: zero * infinity */ |
result.binary = FLOAT32_NAN; |
return result; |
} |
result.parts.fraction = b.parts.fraction; |
result.parts.exp = b.parts.exp; |
return result; |
} |
/* exp is signed so we can easy detect underflow */ |
exp = a.parts.exp + b.parts.exp; |
exp -= FLOAT32_BIAS; |
if (exp >= FLOAT32_MAX_EXPONENT) { |
/* FIXME: overflow */ |
/* set infinity as result */ |
result.binary = FLOAT32_INF; |
result.parts.sign = a.parts.sign ^ b.parts.sign; |
return result; |
}; |
if (exp < 0) { |
/* FIXME: underflow */ |
/* return signed zero */ |
result.parts.fraction = 0x0; |
result.parts.exp = 0x0; |
return result; |
}; |
frac1 = a.parts.fraction; |
if (a.parts.exp > 0) { |
frac1 |= FLOAT32_HIDDEN_BIT_MASK; |
} else { |
++exp; |
}; |
frac2 = b.parts.fraction; |
if (b.parts.exp > 0) { |
frac2 |= FLOAT32_HIDDEN_BIT_MASK; |
} else { |
++exp; |
}; |
frac1 <<= 1; /* one bit space for rounding */ |
frac1 = frac1 * frac2; |
/* round and return */ |
while ((exp < FLOAT32_MAX_EXPONENT) && (frac1 >= ( 1 << (FLOAT32_FRACTION_SIZE + 2)))) { |
/* 23 bits of fraction + one more for hidden bit (all shifted 1 bit left)*/ |
++exp; |
frac1 >>= 1; |
}; |
/* rounding */ |
/* ++frac1; FIXME: not works - without it is ok */ |
frac1 >>= 1; /* shift off rounding space */ |
if ((exp < FLOAT32_MAX_EXPONENT) && (frac1 >= (1 << (FLOAT32_FRACTION_SIZE + 1)))) { |
++exp; |
frac1 >>= 1; |
}; |
if (exp >= FLOAT32_MAX_EXPONENT ) { |
/* TODO: fix overflow */ |
/* return infinity*/ |
result.parts.exp = FLOAT32_MAX_EXPONENT; |
result.parts.fraction = 0x0; |
return result; |
} |
exp -= FLOAT32_FRACTION_SIZE; |
if (exp <= FLOAT32_FRACTION_SIZE) { |
/* denormalized number */ |
frac1 >>= 1; /* denormalize */ |
while ((frac1 > 0) && (exp < 0)) { |
frac1 >>= 1; |
++exp; |
}; |
if (frac1 == 0) { |
/* FIXME : underflow */ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
}; |
}; |
result.parts.exp = exp; |
result.parts.fraction = frac1 & ( (1 << FLOAT32_FRACTION_SIZE) - 1); |
return result; |
} |
/** Multiply two 64 bit float numbers |
* |
*/ |
float64 mulFloat64(float64 a, float64 b) |
{ |
float64 result; |
uint64_t frac1, frac2; |
int32_t exp; |
result.parts.sign = a.parts.sign ^ b.parts.sign; |
if (isFloat64NaN(a) || isFloat64NaN(b) ) { |
/* TODO: fix SigNaNs */ |
if (isFloat64SigNaN(a)) { |
result.parts.fraction = a.parts.fraction; |
result.parts.exp = a.parts.exp; |
return result; |
}; |
if (isFloat64SigNaN(b)) { /* TODO: fix SigNaN */ |
result.parts.fraction = b.parts.fraction; |
result.parts.exp = b.parts.exp; |
return result; |
}; |
/* set NaN as result */ |
result.binary = FLOAT64_NAN; |
return result; |
}; |
if (isFloat64Infinity(a)) { |
if (isFloat64Zero(b)) { |
/* FIXME: zero * infinity */ |
result.binary = FLOAT64_NAN; |
return result; |
} |
result.parts.fraction = a.parts.fraction; |
result.parts.exp = a.parts.exp; |
return result; |
} |
if (isFloat64Infinity(b)) { |
if (isFloat64Zero(a)) { |
/* FIXME: zero * infinity */ |
result.binary = FLOAT64_NAN; |
return result; |
} |
result.parts.fraction = b.parts.fraction; |
result.parts.exp = b.parts.exp; |
return result; |
} |
/* exp is signed so we can easy detect underflow */ |
exp = a.parts.exp + b.parts.exp - FLOAT64_BIAS; |
frac1 = a.parts.fraction; |
if (a.parts.exp > 0) { |
frac1 |= FLOAT64_HIDDEN_BIT_MASK; |
} else { |
++exp; |
}; |
frac2 = b.parts.fraction; |
if (b.parts.exp > 0) { |
frac2 |= FLOAT64_HIDDEN_BIT_MASK; |
} else { |
++exp; |
}; |
frac1 <<= (64 - FLOAT64_FRACTION_SIZE - 1); |
frac2 <<= (64 - FLOAT64_FRACTION_SIZE - 2); |
mul64integers(frac1, frac2, &frac1, &frac2); |
frac2 |= (frac1 != 0); |
if (frac2 & (0x1ll << 62)) { |
frac2 <<= 1; |
exp--; |
} |
result = finishFloat64(exp, frac2, result.parts.sign); |
return result; |
} |
/** Multiply two 64 bit numbers and return result in two parts |
* @param a first operand |
* @param b second operand |
* @param lo lower part from result |
* @param hi higher part of result |
*/ |
void mul64integers(uint64_t a,uint64_t b, uint64_t *lo, uint64_t *hi) |
{ |
uint64_t low, high, middle1, middle2; |
uint32_t alow, blow; |
alow = a & 0xFFFFFFFF; |
blow = b & 0xFFFFFFFF; |
a >>= 32; |
b >>= 32; |
low = ((uint64_t)alow) * blow; |
middle1 = a * blow; |
middle2 = alow * b; |
high = a * b; |
middle1 += middle2; |
high += (((uint64_t)(middle1 < middle2)) << 32) + (middle1 >> 32); |
middle1 <<= 32; |
low += middle1; |
high += (low < middle1); |
*lo = low; |
*hi = high; |
return; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/arch/sparc64/include/functions.h |
---|
0,0 → 1,77 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloatsparc64 sparc64 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int64(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int64(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint64(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint64(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int64_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int64_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint64_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint64_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/arch/ia64/include/functions.h |
---|
0,0 → 1,77 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloatia64 ia64 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int64(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int64(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint64(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint64(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int64_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int64_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint64_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint64_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/arch/mips32eb/include/functions.h |
---|
0,0 → 1,77 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloatmipseb32 mipseb32 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* * @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int32(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int32(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint32(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint32(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int32_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int32_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint32_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint32_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/arch/ppc32/include/functions.h |
---|
0,0 → 1,77 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloatppc32 ppc32 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int32(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int32(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint32(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint32(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int32_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int32_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint32_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint32_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/arch/amd64/include/functions.h |
---|
0,0 → 1,77 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloatamd64 amd64 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int64(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int64(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint64(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint64(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int64_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int64_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint64_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint64_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/arch/ppc64/include/functions.h |
---|
0,0 → 1,76 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloatppc64 ppc64 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int64(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int64(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint64(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint64(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int64_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int64_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint64_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint64_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/arch/mips32/include/functions.h |
---|
0,0 → 1,77 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloatmips32 mips32 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int32(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int32(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint32(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint32(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int32_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int32_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint32_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint32_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/arch/ia32/include/functions.h |
---|
0,0 → 1,77 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup softfloatia32 ia32 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int32(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int32(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint32(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint32(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int32_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int32_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint32_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint32_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/softfloat/Makefile |
---|
0,0 → 1,81 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Common compiler flags |
# |
LIBC_PREFIX = ../libc |
## Setup toolchain |
# |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS +=-Iinclude -Iarch/$(ARCH)/include/ |
## Sources |
# |
GENERIC_SOURCES = \ |
generic/add.c \ |
generic/common.c \ |
generic/comparison.c \ |
generic/conversion.c \ |
generic/div.c \ |
generic/mul.c \ |
generic/other.c \ |
generic/softfloat.c \ |
generic/sub.c |
ARCH_SOURCES = |
GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES))) |
.PHONY: all clean depend |
all: libsoftfloat.a |
-include Makefile.depend |
clean: |
-rm -f libsoftfloat.a Makefile.depend |
find generic/ -name '*.o' -follow -exec rm \{\} \; |
depend: |
-makedepend $(DEFS) $(CFLAGS) -f - $(GENERIC_SOURCES) > Makefile.depend 2> /dev/null |
libsoftfloat.a: depend $(ARCH_OBJECTS) $(GENERIC_OBJECTS) |
$(AR) rc libsoftfloat.a $(ARCH_OBJECTS) $(GENERIC_OBJECTS) |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.2.0/uspace/console/console.c |
---|
0,0 → 1,521 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @defgroup console Console |
* @brief HelenOS console. |
* @{ |
*/ |
/** @file |
*/ |
/* TODO: remove */ |
#include <stdio.h> |
#include <kbd.h> |
#include <fb.h> |
#include <ipc/ipc.h> |
#include <ipc/fb.h> |
#include <ipc/services.h> |
#include <errno.h> |
#include <key_buffer.h> |
#include <console.h> |
#include <unistd.h> |
#include <async.h> |
#include <libadt/fifo.h> |
#include <screenbuffer.h> |
#include <sys/mman.h> |
#include "gcons.h" |
#define MAX_KEYREQUESTS_BUFFERED 32 |
#define NAME "CONSOLE" |
/** Index of currently used virtual console. |
*/ |
int active_console = 0; |
/** Information about framebuffer |
*/ |
struct { |
int phone; /**< Framebuffer phone */ |
ipcarg_t rows; /**< Framebuffer rows */ |
ipcarg_t cols; /**< Framebuffer columns */ |
} fb_info; |
typedef struct { |
keybuffer_t keybuffer; /**< Buffer for incoming keys. */ |
FIFO_CREATE_STATIC(keyrequests, ipc_callid_t , MAX_KEYREQUESTS_BUFFERED); /**< Buffer for unsatisfied request for keys. */ |
int keyrequest_counter; /**< Number of requests in buffer. */ |
int client_phone; /**< Phone to connected client. */ |
int used; /**< 1 if this virtual console is connected to some client.*/ |
screenbuffer_t screenbuffer; /**< Screenbuffer for saving screen contents and related settings. */ |
} connection_t; |
static connection_t connections[CONSOLE_COUNT]; /**< Array of data for virtual consoles */ |
static keyfield_t *interbuffer = NULL; /**< Pointer to memory shared with framebufer used for faster virt. console switching */ |
static int kernel_pixmap = -1; /**< Number of fb pixmap, where kernel console is stored */ |
/** Find unused virtual console. |
* |
*/ |
static int find_free_connection(void) |
{ |
int i = 0; |
for (i=0; i < CONSOLE_COUNT; i++) { |
if (!connections[i].used) |
return i; |
} |
return -1; |
} |
static void clrscr(void) |
{ |
async_msg(fb_info.phone, FB_CLEAR, 0); |
} |
static void curs_visibility(int v) |
{ |
async_msg(fb_info.phone, FB_CURSOR_VISIBILITY, v); |
} |
static void curs_goto(int row, int col) |
{ |
async_msg_2(fb_info.phone, FB_CURSOR_GOTO, row, col); |
} |
static void set_style(style_t *style) |
{ |
async_msg_2(fb_info.phone, FB_SET_STYLE, style->fg_color, style->bg_color); |
} |
static void set_style_col(int fgcolor, int bgcolor) |
{ |
async_msg_2(fb_info.phone, FB_SET_STYLE, fgcolor, bgcolor); |
} |
static void prtchr(char c, int row, int col) |
{ |
async_msg_3(fb_info.phone, FB_PUTCHAR, c, row, col); |
} |
/** Check key and process special keys. |
* |
* */ |
static void write_char(int console, char key) |
{ |
screenbuffer_t *scr = &(connections[console].screenbuffer); |
switch (key) { |
case '\n': |
scr->position_y += 1; |
scr->position_x = 0; |
break; |
case '\r': |
break; |
case '\t': |
scr->position_x += 8; |
scr->position_x -= scr->position_x % 8; |
break; |
case '\b': |
if (scr->position_x == 0) |
break; |
scr->position_x--; |
if (console == active_console) |
prtchr(' ', scr->position_y, scr->position_x); |
screenbuffer_putchar(scr, ' '); |
break; |
default: |
if (console == active_console) |
prtchr(key, scr->position_y, scr->position_x); |
screenbuffer_putchar(scr, key); |
scr->position_x++; |
} |
scr->position_y += (scr->position_x >= scr->size_x); |
if (scr->position_y >= scr->size_y) { |
scr->position_y = scr->size_y - 1; |
screenbuffer_clear_line(scr, scr->top_line++); |
if (console == active_console) |
async_msg(fb_info.phone, FB_SCROLL, 1); |
} |
scr->position_x = scr->position_x % scr->size_x; |
if (console == active_console) |
curs_goto(scr->position_y, scr->position_x); |
} |
/** Save current screen to pixmap, draw old pixmap |
* |
* @param oldpixmap Old pixmap |
* @return ID of pixmap of current screen |
*/ |
static int switch_screens(int oldpixmap) |
{ |
int newpmap; |
/* Save screen */ |
newpmap = async_req(fb_info.phone, FB_VP2PIXMAP, 0, NULL); |
if (newpmap < 0) |
return -1; |
if (oldpixmap != -1) { |
/* Show old screen */ |
async_msg_2(fb_info.phone, FB_VP_DRAW_PIXMAP, 0, oldpixmap); |
/* Drop old pixmap */ |
async_msg(fb_info.phone, FB_DROP_PIXMAP, oldpixmap); |
} |
return newpmap; |
} |
/** Switch to new console */ |
static void change_console(int newcons) |
{ |
connection_t *conn; |
static int console_pixmap = -1; |
int i, j; |
keyfield_t *field; |
style_t *style; |
char c; |
if (newcons == active_console) |
return; |
if (newcons == KERNEL_CONSOLE) { |
if (active_console == KERNEL_CONSOLE) |
return; |
active_console = KERNEL_CONSOLE; |
curs_visibility(0); |
if (kernel_pixmap == -1) { |
/* store/restore unsupported */ |
set_style_col(DEFAULT_FOREGROUND, DEFAULT_BACKGROUND); |
clrscr(); |
} else { |
gcons_in_kernel(); |
console_pixmap = switch_screens(kernel_pixmap); |
kernel_pixmap = -1; |
} |
__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE); |
return; |
} |
if (console_pixmap != -1) { |
kernel_pixmap = switch_screens(console_pixmap); |
console_pixmap = -1; |
} |
active_console = newcons; |
gcons_change_console(newcons); |
conn = &connections[active_console]; |
set_style(&conn->screenbuffer.style); |
curs_visibility(0); |
if (interbuffer) { |
for (i = 0; i < conn->screenbuffer.size_x; i++) |
for (j = 0; j < conn->screenbuffer.size_y; j++) |
interbuffer[i + j*conn->screenbuffer.size_x] = *get_field_at(&(conn->screenbuffer),i, j); |
/* This call can preempt, but we are already at the end */ |
j = async_req_2(fb_info.phone, FB_DRAW_TEXT_DATA, 0, 0, NULL, NULL); |
}; |
if ((!interbuffer) || (j != 0)){ |
set_style(&conn->screenbuffer.style); |
clrscr(); |
style = &conn->screenbuffer.style; |
for (j = 0; j < conn->screenbuffer.size_y; j++) |
for (i = 0; i < conn->screenbuffer.size_x; i++) { |
field = get_field_at(&(conn->screenbuffer),i, j); |
if (!style_same(*style, field->style)) |
set_style(&field->style); |
style = &field->style; |
if ((field->character == ' ') && (style_same(field->style, conn->screenbuffer.style))) |
continue; |
prtchr(field->character, j, i); |
} |
} |
curs_goto(conn->screenbuffer.position_y, conn->screenbuffer.position_x); |
curs_visibility(conn->screenbuffer.is_cursor_visible); |
} |
/** Handler for keyboard */ |
static void keyboard_events(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
int retval; |
int c; |
connection_t *conn; |
/* Ignore parameters, the connection is alread opened */ |
while (1) { |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
/* TODO: Handle hangup */ |
return; |
case KBD_PUSHCHAR: |
/* got key from keyboard driver */ |
retval = 0; |
c = IPC_GET_ARG1(call); |
/* switch to another virtual console */ |
conn = &connections[active_console]; |
// if ((c >= KBD_KEY_F1) && (c < KBD_KEY_F1 + CONSOLE_COUNT)) { |
if ((c >= 0x101) && (c < 0x101 + CONSOLE_COUNT)) { |
async_serialize_start(); |
if (c == 0x112) |
change_console(KERNEL_CONSOLE); |
else |
change_console(c - 0x101); |
async_serialize_end(); |
break; |
} |
/* if client is awaiting key, send it */ |
if (conn->keyrequest_counter > 0) { |
conn->keyrequest_counter--; |
ipc_answer_fast(fifo_pop(conn->keyrequests), 0, c, 0); |
break; |
} |
/*FIXME: else store key to its buffer */ |
keybuffer_push(&conn->keybuffer, c); |
break; |
default: |
retval = ENOENT; |
} |
ipc_answer_fast(callid, retval, 0, 0); |
} |
} |
/** Default thread for new connections */ |
static void client_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
int consnum; |
ipcarg_t arg1, arg2; |
connection_t *conn; |
if ((consnum = find_free_connection()) == -1) { |
ipc_answer_fast(iid,ELIMIT,0,0); |
return; |
} |
conn = &connections[consnum]; |
conn->used = 1; |
async_serialize_start(); |
gcons_notify_connect(consnum); |
conn->client_phone = IPC_GET_ARG3(call); |
screenbuffer_clear(&conn->screenbuffer); |
/* Accept the connection */ |
ipc_answer_fast(iid,0,0,0); |
while (1) { |
async_serialize_end(); |
callid = async_get_call(&call); |
async_serialize_start(); |
arg1 = arg2 = 0; |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
gcons_notify_disconnect(consnum); |
/* Answer all pending requests */ |
while (conn->keyrequest_counter > 0) { |
conn->keyrequest_counter--; |
ipc_answer_fast(fifo_pop(conn->keyrequests), ENOENT, 0, 0); |
break; |
} |
conn->used = 0; |
return; |
case CONSOLE_PUTCHAR: |
write_char(consnum, IPC_GET_ARG1(call)); |
gcons_notify_char(consnum); |
break; |
case CONSOLE_CLEAR: |
/* Send message to fb */ |
if (consnum == active_console) { |
async_msg(fb_info.phone, FB_CLEAR, 0); |
} |
screenbuffer_clear(&conn->screenbuffer); |
break; |
case CONSOLE_GOTO: |
screenbuffer_goto(&conn->screenbuffer, IPC_GET_ARG2(call), IPC_GET_ARG1(call)); |
if (consnum == active_console) |
curs_goto(IPC_GET_ARG1(call),IPC_GET_ARG2(call)); |
break; |
case CONSOLE_GETSIZE: |
arg1 = fb_info.rows; |
arg2 = fb_info.cols; |
break; |
case CONSOLE_FLUSH: |
async_req_2(fb_info.phone, FB_FLUSH, 0, 0, NULL, NULL); |
break; |
case CONSOLE_SET_STYLE: |
arg1 = IPC_GET_ARG1(call); |
arg2 = IPC_GET_ARG2(call); |
screenbuffer_set_style(&conn->screenbuffer,arg1, arg2); |
if (consnum == active_console) |
set_style_col(arg1, arg2); |
break; |
case CONSOLE_CURSOR_VISIBILITY: |
arg1 = IPC_GET_ARG1(call); |
conn->screenbuffer.is_cursor_visible = arg1; |
if (consnum == active_console) |
curs_visibility(arg1); |
break; |
case CONSOLE_GETCHAR: |
if (keybuffer_empty(&conn->keybuffer)) { |
/* buffer is empty -> store request */ |
if (conn->keyrequest_counter < MAX_KEYREQUESTS_BUFFERED) { |
fifo_push(conn->keyrequests, callid); |
conn->keyrequest_counter++; |
} else { |
/* no key available and too many requests => fail */ |
ipc_answer_fast(callid, ELIMIT, 0, 0); |
} |
continue; |
}; |
keybuffer_pop(&conn->keybuffer, (int *)&arg1); |
break; |
} |
ipc_answer_fast(callid, 0, arg1, arg2); |
} |
} |
int main(int argc, char *argv[]) |
{ |
ipcarg_t phonehash; |
int kbd_phone, fb_phone; |
ipcarg_t retval, arg1 = 0xdead, arg2 = 0xbeef; |
int i; |
async_set_client_connection(client_connection); |
/* Connect to keyboard driver */ |
while ((kbd_phone = ipc_connect_me_to(PHONE_NS, SERVICE_KEYBOARD, 0)) < 0) { |
usleep(10000); |
}; |
if (ipc_connect_to_me(kbd_phone, SERVICE_CONSOLE, 0, &phonehash) != 0) { |
return -1; |
}; |
/* Connect to framebuffer driver */ |
while ((fb_info.phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0)) < 0) { |
usleep(10000); |
} |
/* Save old kernel screen */ |
kernel_pixmap = switch_screens(-1); |
/* Initialize gcons */ |
gcons_init(fb_info.phone); |
/* Synchronize, the gcons can have something in queue */ |
async_req(fb_info.phone, FB_FLUSH, 0, NULL); |
async_req_2(fb_info.phone, FB_GET_CSIZE, 0, 0, &(fb_info.rows), &(fb_info.cols)); |
set_style_col(DEFAULT_FOREGROUND, DEFAULT_BACKGROUND); |
clrscr(); |
/* Init virtual consoles */ |
for (i = 0; i < CONSOLE_COUNT; i++) { |
connections[i].used = 0; |
keybuffer_init(&(connections[i].keybuffer)); |
connections[i].keyrequests.head = connections[i].keyrequests.tail = 0; |
connections[i].keyrequests.items = MAX_KEYREQUESTS_BUFFERED; |
connections[i].keyrequest_counter = 0; |
if (screenbuffer_init(&(connections[i].screenbuffer), fb_info.cols, fb_info.rows ) == NULL) { |
/*FIXME: handle error */ |
return -1; |
} |
} |
connections[KERNEL_CONSOLE].used = 1; |
if ((interbuffer = mmap(NULL, sizeof(keyfield_t) * fb_info.cols * fb_info.rows , PROTO_READ|PROTO_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, 0 ,0 )) != NULL) { |
if (async_req_3(fb_info.phone, IPC_M_AS_AREA_SEND, (ipcarg_t)interbuffer, 0, AS_AREA_READ, NULL, NULL, NULL) != 0) { |
munmap(interbuffer, sizeof(keyfield_t) * fb_info.cols * fb_info.rows); |
interbuffer = NULL; |
} |
} |
async_new_connection(phonehash, 0, NULL, keyboard_events); |
curs_goto(0,0); |
curs_visibility(connections[active_console].screenbuffer.is_cursor_visible); |
/* Register at NS */ |
if (ipc_connect_to_me(PHONE_NS, SERVICE_CONSOLE, 0, &phonehash) != 0) { |
return -1; |
}; |
async_manager(); |
return 0; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/console/console.h |
---|
0,0 → 1,56 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup console |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __CONSOLE_H__ |
#define __CONSOLE_H__ |
#define KERNEL_CONSOLE 11 |
#define CONSOLE_COUNT 12 |
#define CONSOLE_GETCHAR 1026 |
#define CONSOLE_PUTCHAR 1027 |
#define CONSOLE_CLEAR 1028 |
#define CONSOLE_GOTO 1029 |
#define CONSOLE_GETSIZE 1030 |
#define CONSOLE_FLUSH 1031 |
#define CONSOLE_SET_STYLE 1032 |
#define CONSOLE_CURSOR_VISIBILITY 1033 |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/console/screenbuffer.c |
---|
0,0 → 1,145 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup console |
* @{ |
*/ |
/** @file |
*/ |
#include <screenbuffer.h> |
#include <malloc.h> |
#include <unistd.h> |
/** Store one character to screenbuffer. Its position is determined by scr->position_x and scr->position_y. |
* @param scr screenbuffer |
* @param c stored character |
*/ |
void screenbuffer_putchar(screenbuffer_t *scr, char c) |
{ |
keyfield_t *field; |
field = get_field_at(scr, scr->position_x, scr->position_y); |
field->character = c; |
field->style = scr->style; |
} |
/** Initilize screenbuffer. Allocate space for screen content in accordance to given size. |
* @param scr initialized screenbuffer |
* @param size_x width in characters |
* @param size_y height in characters |
* @return pointer to screenbuffer (same as scr parameter) or NULL |
*/ |
screenbuffer_t *screenbuffer_init(screenbuffer_t *scr, int size_x, int size_y) |
{ |
if ((scr->buffer = (keyfield_t *)malloc(sizeof(keyfield_t) * size_x * size_y)) == NULL) { |
return NULL; |
} |
scr->size_x = size_x; |
scr->size_y = size_y; |
scr->style.fg_color = DEFAULT_FOREGROUND; |
scr->style.bg_color = DEFAULT_BACKGROUND; |
scr->is_cursor_visible = 1; |
screenbuffer_clear(scr); |
return scr; |
} |
/** Clear screenbuffer. |
* @param scr screenbuffer |
*/ |
void screenbuffer_clear(screenbuffer_t *scr) |
{ |
unsigned int i; |
for (i = 0; i < (scr->size_x * scr->size_y); i++) { |
scr->buffer[i].character = ' '; |
scr->buffer[i].style = scr->style; |
} |
scr->top_line = 0; |
scr->position_y = 0; |
scr->position_x = 0; |
} |
/** Clear one buffer line. |
* @param scr |
* @param line One buffer line (not a screen line!) |
*/ |
void screenbuffer_clear_line(screenbuffer_t *scr, unsigned int line) |
{ |
unsigned int i; |
for (i = 0; i < scr->size_x; i++) { |
scr->buffer[i + line*scr->size_x].character = ' '; |
scr->buffer[i + line*scr->size_x].style = scr->style; |
} |
} |
/** Copy content buffer from screenbuffer to given memory. |
* @param scr source screenbuffer |
* @param dest destination |
*/ |
void screenbuffer_copy_buffer(screenbuffer_t *scr, keyfield_t *dest) |
{ |
unsigned int i; |
for (i = 0; i < scr->size_x * scr->size_y; i++) { |
dest[i] = scr->buffer[i]; |
} |
} |
/** Set new cursor position in screenbuffer. |
* @param scr |
* @param x |
* @param y |
*/ |
void screenbuffer_goto(screenbuffer_t *scr, unsigned int x, unsigned int y) |
{ |
scr->position_x = x % scr->size_x; |
scr->position_y = y % scr->size_y; |
} |
/** Set new style. |
* @param scr |
* @param fg_color |
* @param bg_color |
*/ |
void screenbuffer_set_style(screenbuffer_t *scr, unsigned int fg_color, unsigned int bg_color) |
{ |
scr->style.fg_color = fg_color; |
scr->style.bg_color = bg_color; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/console/gcons.c |
---|
0,0 → 1,434 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup console |
* @{ |
*/ |
/** @file |
*/ |
#include <ipc/fb.h> |
#include <ipc/ipc.h> |
#include <async.h> |
#include <stdio.h> |
#include <sys/mman.h> |
#include <string.h> |
#include <align.h> |
#include "console.h" |
#include "gcons.h" |
#define CONSOLE_TOP 65 |
#define CONSOLE_MARGIN 6 |
#define STATUS_START 110 |
#define STATUS_TOP 8 |
#define STATUS_SPACE 3 |
#define STATUS_WIDTH 48 |
#define STATUS_HEIGHT 48 |
#define MAIN_COLOR 0xffffff |
static int use_gcons = 0; |
static ipcarg_t xres,yres; |
enum butstate { |
CONS_DISCONNECTED = 0, |
CONS_SELECTED, |
CONS_IDLE, |
CONS_HAS_DATA, |
CONS_KERNEL, |
CONS_DISCONNECTED_SEL, |
CONS_LAST |
}; |
static int console_vp; |
static int cstatus_vp[CONSOLE_COUNT]; |
static int cstat_row, cstat_col; /* Size of cstatus buttons */ |
static enum butstate console_state[CONSOLE_COUNT]; |
static int fbphone; |
/** List of pixmaps identifying these icons */ |
static int ic_pixmaps[CONS_LAST] = {-1,-1,-1,-1,-1,-1}; |
static int animation = -1; |
static int active_console = 0; |
static void vp_switch(int vp) |
{ |
async_msg(fbphone,FB_VIEWPORT_SWITCH, vp); |
} |
/** Create view port */ |
static int vp_create(unsigned int x, unsigned int y, |
unsigned int width, unsigned int height) |
{ |
/* Init function, use ipc_call_sync */ |
return ipc_call_sync_2(fbphone, FB_VIEWPORT_CREATE, |
(x << 16) | y, (width << 16) | height, |
NULL, NULL); |
} |
static void clear(void) |
{ |
async_msg(fbphone, FB_CLEAR, 0); |
} |
static void set_style(int fgcolor, int bgcolor) |
{ |
async_msg_2(fbphone, FB_SET_STYLE, fgcolor, bgcolor); |
} |
/** Transparent putchar */ |
static void tran_putch(char c, int row, int col) |
{ |
async_msg_3(fbphone, FB_TRANS_PUTCHAR, c, row, col); |
} |
/** Redraw the button showing state of a given console */ |
static void redraw_state(int consnum) |
{ |
char data[5]; |
int i; |
enum butstate state = console_state[consnum]; |
vp_switch(cstatus_vp[consnum]); |
if (ic_pixmaps[state] != -1) |
async_msg_2(fbphone, FB_VP_DRAW_PIXMAP, cstatus_vp[consnum], ic_pixmaps[state]); |
if (state != CONS_DISCONNECTED && state != CONS_KERNEL && state != CONS_DISCONNECTED_SEL) { |
snprintf(data, 5, "%d", consnum+1); |
for (i=0;data[i];i++) |
tran_putch(data[i], 1, 2+i); |
} |
} |
/** Notification run on changing console (except kernel console) */ |
void gcons_change_console(int consnum) |
{ |
int i; |
if (!use_gcons) |
return; |
if (active_console == KERNEL_CONSOLE) { |
for (i=0; i < CONSOLE_COUNT; i++) |
redraw_state(i); |
if (animation != -1) |
async_msg(fbphone, FB_ANIM_START, animation); |
} else { |
if (console_state[active_console] == CONS_DISCONNECTED_SEL) |
console_state[active_console] = CONS_DISCONNECTED; |
else |
console_state[active_console] = CONS_IDLE; |
redraw_state(active_console); |
} |
active_console = consnum; |
if (console_state[consnum] == CONS_DISCONNECTED) { |
console_state[consnum] = CONS_DISCONNECTED_SEL; |
redraw_state(consnum); |
} else |
console_state[consnum] = CONS_SELECTED; |
redraw_state(consnum); |
vp_switch(console_vp); |
} |
/** Notification function that gets called on new output to virtual console */ |
void gcons_notify_char(int consnum) |
{ |
if (!use_gcons) |
return; |
if (consnum == active_console || console_state[consnum] == CONS_HAS_DATA) |
return; |
console_state[consnum] = CONS_HAS_DATA; |
if (active_console == KERNEL_CONSOLE) |
return; |
redraw_state(consnum); |
vp_switch(console_vp); |
} |
/** Notification function called on service disconnect from console */ |
void gcons_notify_disconnect(int consnum) |
{ |
if (!use_gcons) |
return; |
if (active_console == consnum) |
console_state[consnum] = CONS_DISCONNECTED_SEL; |
else |
console_state[consnum] = CONS_DISCONNECTED; |
if (active_console == KERNEL_CONSOLE) |
return; |
redraw_state(consnum); |
vp_switch(console_vp); |
} |
/** Notification function called on console connect */ |
void gcons_notify_connect(int consnum) |
{ |
if (!use_gcons) |
return; |
if (active_console == consnum) |
console_state[consnum] = CONS_SELECTED; |
else |
console_state[consnum] = CONS_IDLE; |
if (active_console == KERNEL_CONSOLE) |
return; |
redraw_state(consnum); |
vp_switch(console_vp); |
} |
/** Change to kernel console */ |
void gcons_in_kernel(void) |
{ |
if (console_state[active_console] == CONS_DISCONNECTED_SEL) |
console_state[active_console] = CONS_DISCONNECTED; |
else |
console_state[active_console] = CONS_IDLE; |
redraw_state(active_console); |
if (animation != -1) |
async_msg(fbphone, FB_ANIM_STOP, animation); |
active_console = KERNEL_CONSOLE; /* Set to kernel console */ |
vp_switch(0); |
} |
/** Draw a PPM pixmap to framebuffer |
* |
* @param logo Pointer to PPM data |
* @param size Size of PPM data |
* @param x Coordinate of upper left corner |
* @param y Coordinate of upper left corner |
*/ |
static void draw_pixmap(char *logo, size_t size, int x, int y) |
{ |
char *shm; |
int rc; |
/* Create area */ |
shm = mmap(NULL, size, PROTO_READ | PROTO_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0); |
if (shm == MAP_FAILED) |
return; |
memcpy(shm, logo, size); |
/* Send area */ |
rc = async_req_2(fbphone, FB_PREPARE_SHM, (ipcarg_t)shm, 0, NULL, NULL); |
if (rc) |
goto exit; |
rc = async_req_3(fbphone, IPC_M_AS_AREA_SEND, (ipcarg_t)shm, 0, PROTO_READ, NULL, NULL, NULL); |
if (rc) |
goto drop; |
/* Draw logo */ |
async_msg_2(fbphone, FB_DRAW_PPM, x, y); |
drop: |
/* Drop area */ |
async_msg(fbphone, FB_DROP_SHM, 0); |
exit: |
/* Remove area */ |
munmap(shm, size); |
} |
extern char _binary_helenos_ppm_start[0]; |
extern int _binary_helenos_ppm_size; |
extern char _binary_nameic_ppm_start[0]; |
extern int _binary_nameic_ppm_size; |
/** Redraws console graphics */ |
static void gcons_redraw_console(void) |
{ |
int i; |
size_t hsize = (size_t)&_binary_helenos_ppm_size; |
if (!use_gcons) |
return; |
vp_switch(0); |
set_style(MAIN_COLOR, MAIN_COLOR); |
clear(); |
draw_pixmap(_binary_helenos_ppm_start, (size_t)&_binary_helenos_ppm_size, xres-66, 2); |
draw_pixmap(_binary_nameic_ppm_start, (size_t)&_binary_nameic_ppm_size, 5, 17); |
for (i=0;i < CONSOLE_COUNT; i++) |
redraw_state(i); |
vp_switch(console_vp); |
} |
/** Creates a pixmap on framebuffer |
* |
* @param data PPM data |
* @param size PPM data size |
* @return Pixmap identification |
*/ |
static int make_pixmap(char *data, int size) |
{ |
char *shm; |
int rc; |
int pxid = -1; |
/* Create area */ |
shm = mmap(NULL, size, PROTO_READ | PROTO_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0); |
if (shm == MAP_FAILED) |
return -1; |
memcpy(shm, data, size); |
/* Send area */ |
rc = async_req_2(fbphone, FB_PREPARE_SHM, (ipcarg_t)shm, 0, NULL, NULL); |
if (rc) |
goto exit; |
rc = async_req_3(fbphone, IPC_M_AS_AREA_SEND, (ipcarg_t)shm, 0, PROTO_READ, NULL, NULL, NULL); |
if (rc) |
goto drop; |
/* Obtain pixmap */ |
rc = async_req(fbphone, FB_SHM2PIXMAP, 0, NULL); |
if (rc < 0) |
goto drop; |
pxid = rc; |
drop: |
/* Drop area */ |
async_msg(fbphone, FB_DROP_SHM, 0); |
exit: |
/* Remove area */ |
munmap(shm, size); |
return pxid; |
} |
extern char _binary_anim_1_ppm_start[0]; |
extern int _binary_anim_1_ppm_size; |
extern char _binary_anim_2_ppm_start[0]; |
extern int _binary_anim_2_ppm_size; |
extern char _binary_anim_3_ppm_start[0]; |
extern int _binary_anim_3_ppm_size; |
extern char _binary_anim_4_ppm_start[0]; |
extern int _binary_anim_4_ppm_size; |
static void make_anim(void) |
{ |
int an; |
int pm; |
an = async_req(fbphone, FB_ANIM_CREATE, cstatus_vp[KERNEL_CONSOLE], NULL); |
if (an < 0) |
return; |
pm = make_pixmap(_binary_anim_1_ppm_start, (int)&_binary_anim_1_ppm_size); |
async_msg_2(fbphone, FB_ANIM_ADDPIXMAP, an, pm); |
pm = make_pixmap(_binary_anim_2_ppm_start, (int)&_binary_anim_2_ppm_size); |
async_msg_2(fbphone, FB_ANIM_ADDPIXMAP, an, pm); |
pm = make_pixmap(_binary_anim_3_ppm_start, (int)&_binary_anim_3_ppm_size); |
async_msg_2(fbphone, FB_ANIM_ADDPIXMAP, an, pm); |
pm = make_pixmap(_binary_anim_4_ppm_start, (int)&_binary_anim_4_ppm_size); |
async_msg_2(fbphone, FB_ANIM_ADDPIXMAP, an, pm); |
async_msg(fbphone, FB_ANIM_START, an); |
animation = an; |
} |
extern char _binary_cons_selected_ppm_start[0]; |
extern int _binary_cons_selected_ppm_size; |
extern char _binary_cons_idle_ppm_start[0]; |
extern int _binary_cons_idle_ppm_size; |
extern char _binary_cons_has_data_ppm_start[0]; |
extern int _binary_cons_has_data_ppm_size; |
extern char _binary_cons_kernel_ppm_start[0]; |
extern int _binary_cons_kernel_ppm_size; |
/** Initialize nice graphical console environment */ |
void gcons_init(int phone) |
{ |
int rc; |
int i; |
int status_start = STATUS_START; |
fbphone = phone; |
rc = ipc_call_sync_2(phone, FB_GET_RESOLUTION, 0, 0, &xres, &yres); |
if (rc) |
return; |
if (xres < 800 || yres < 600) |
return; |
/* create console viewport */ |
/* Align width & height to character size */ |
console_vp = vp_create(CONSOLE_MARGIN, CONSOLE_TOP, |
ALIGN_DOWN(xres-2*CONSOLE_MARGIN, 8), |
ALIGN_DOWN(yres-(CONSOLE_TOP+CONSOLE_MARGIN),16)); |
if (console_vp < 0) |
return; |
/* Create status buttons */ |
status_start += (xres-800) / 2; |
for (i=0; i < CONSOLE_COUNT; i++) { |
cstatus_vp[i] = vp_create(status_start+CONSOLE_MARGIN+i*(STATUS_WIDTH+STATUS_SPACE), |
STATUS_TOP, STATUS_WIDTH, STATUS_HEIGHT); |
if (cstatus_vp[i] < 0) |
return; |
vp_switch(cstatus_vp[i]); |
set_style(0x202020, 0xffffff); |
} |
/* Initialize icons */ |
ic_pixmaps[CONS_SELECTED] = make_pixmap(_binary_cons_selected_ppm_start, |
(int)&_binary_cons_selected_ppm_size); |
ic_pixmaps[CONS_IDLE] = make_pixmap(_binary_cons_idle_ppm_start, |
(int)&_binary_cons_idle_ppm_size); |
ic_pixmaps[CONS_HAS_DATA] = make_pixmap(_binary_cons_has_data_ppm_start, |
(int)&_binary_cons_has_data_ppm_size); |
ic_pixmaps[CONS_DISCONNECTED] = make_pixmap(_binary_cons_idle_ppm_start, |
(int)&_binary_cons_idle_ppm_size); |
ic_pixmaps[CONS_KERNEL] = make_pixmap(_binary_cons_kernel_ppm_start, |
(int)&_binary_cons_kernel_ppm_size); |
ic_pixmaps[CONS_DISCONNECTED_SEL] = ic_pixmaps[CONS_SELECTED]; |
make_anim(); |
use_gcons = 1; |
console_state[0] = CONS_DISCONNECTED_SEL; |
console_state[KERNEL_CONSOLE] = CONS_KERNEL; |
gcons_redraw_console(); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/console/gcons.h |
---|
0,0 → 1,49 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup console |
* @{ |
*/ |
/** @file |
*/ |
#ifndef _GCONS_H_ |
#define _GCONS_H_ |
void gcons_init(int phone); |
void gcons_change_console(int consnum); |
void gcons_notify_char(int consnum); |
void gcons_in_kernel(void); |
void gcons_notify_connect(int consnum); |
void gcons_notify_disconnect(int consnum); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/console/screenbuffer.h |
---|
0,0 → 1,100 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup console |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SCREENBUFFER_H__ |
#define __SCREENBUFFER_H__ |
#define DEFAULT_FOREGROUND 0x0 /**< default console foreground color */ |
#define DEFAULT_BACKGROUND 0xf0f0f0 /**< default console background color */ |
typedef struct { |
unsigned int bg_color; /**< background color */ |
unsigned int fg_color; /**< foreground color */ |
} style_t; |
/** One field on screen. It contain one character and its attributes. */ |
typedef struct { |
char character; /**< Character itself */ |
style_t style; /**< Character`s attributes */ |
} keyfield_t; |
/** Structure for buffering state of one virtual console. |
*/ |
typedef struct { |
keyfield_t *buffer; /**< Screen content - characters and its style. Used as cyclyc buffer. */ |
unsigned int size_x, size_y; /**< Number of columns and rows */ |
unsigned int position_x, position_y; /**< Coordinates of last printed character for determining cursor position */ |
style_t style; /**< Current style */ |
unsigned int top_line; /**< Points to buffer[][] line that will be printed at screen as the first line */ |
unsigned char is_cursor_visible; /**< Cursor state - default is visible */ |
} screenbuffer_t; |
/** Returns keyfield for position on screen. Screenbuffer->buffer is cyclic buffer so we must couted in index of the topmost line. |
* @param scr screenbuffer |
* @param x position on screen |
* @param y position on screen |
* @return keyfield structure with character and its attributes on x,y |
*/ |
static inline keyfield_t *get_field_at(screenbuffer_t *scr, unsigned int x, unsigned int y) |
{ |
return scr->buffer + x + ((y + scr->top_line) % scr->size_y) * scr->size_x; |
} |
/** Compares two styles. |
* @param s1 first style |
* @param s2 second style |
* @return nonzero on equality |
*/ |
static inline int style_same(style_t s1, style_t s2) |
{ |
return s1.fg_color == s2.fg_color && s1.bg_color == s2.bg_color; |
} |
void screenbuffer_putchar(screenbuffer_t *scr, char c); |
screenbuffer_t *screenbuffer_init(screenbuffer_t *scr, int size_x, int size_y); |
void screenbuffer_clear(screenbuffer_t *scr); |
void screenbuffer_clear_line(screenbuffer_t *scr, unsigned int line); |
void screenbuffer_copy_buffer(screenbuffer_t *scr, keyfield_t *dest); |
void screenbuffer_goto(screenbuffer_t *scr, unsigned int x, unsigned int y); |
void screenbuffer_set_style(screenbuffer_t *scr, unsigned int fg_color, unsigned int bg_color); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/console/cons_kernel.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/console/anim_1.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/console/anim_2.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/console/anim_3.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/console/anim_4.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/console/Makefile |
---|
0,0 → 1,88 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../libc |
SOFTINT_PREFIX = ../softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I. -I../kbd/include -I../fb |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = console |
GENERIC_SOURCES = \ |
console.c \ |
screenbuffer.c \ |
../kbd/generic/key_buffer.c \ |
gcons.c |
IMAGES = helenos.ppm nameic.ppm cons_selected.ppm cons_idle.ppm \ |
cons_has_data.ppm cons_kernel.ppm anim_1.ppm anim_2.ppm anim_3.ppm \ |
anim_4.ppm |
ARCH_SOURCES = |
GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES))) \ |
$(addsuffix .o,$(basename $(IMAGES))) |
ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(ARCH_OBJECTS) $(GENERIC_OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(GENERIC_OBJECTS) $(ARCH_OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
%.o: %.ppm |
$(OBJCOPY) -I binary -O $(BFD_NAME) -B $(BFD_ARCH) $< $@ |
/tags/0.2.0/uspace/console/cons_has_data.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/console/cons_selected.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/console/cons_idle.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/console/nameic.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/console/helenos.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.2.0/uspace/init/init.c |
---|
0,0 → 1,63 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup init Init |
* @brief Init process for testing purposes. |
* @{ |
*/ |
/** |
* @file |
*/ |
#include "version.h" |
#include <stdio.h> |
static void test_console(void) |
{ |
int c; |
while ((c = getchar()) != EOF) |
putchar(c); |
} |
int main(int argc, char *argv[]) |
{ |
version_print(); |
printf("Hello\nThis is Init\n"); |
test_console(); |
printf("\nBye.\n"); |
return 0; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/init/version.c |
---|
0,0 → 1,49 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup init |
* @{ |
*/ |
/** |
* @file |
*/ |
#include <unistd.h> |
#include <stdio.h> |
#include "version.h" |
/** Print version information. */ |
void version_print(void) |
{ |
puts("HelenOS init"); |
puts("Copyright (C) 2006 HelenOS project"); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/init/init.h |
---|
0,0 → 1,45 |
/* |
* Copyright (C) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup init |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef __INIT_H__ |
#define __INIT_H__ |
#include "version.h" |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/init/version.h |
---|
0,0 → 1,45 |
/* |
* Copyright (C) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup init |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef __VERSION_H__ |
#define __VERSION_H__ |
extern void version_print(void); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/init/Makefile |
---|
0,0 → 1,75 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../libc |
SOFTINT_PREFIX = ../softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I../kbd/include |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = init |
SOURCES = \ |
init.c \ |
version.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.2.0/uspace/libc/arch/ia64/Makefile.inc |
---|
0,0 → 1,43 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Toolchain configuration |
# |
TARGET = ia64-pc-linux-gnu |
TOOLCHAIN_DIR = /usr/local/ia64/bin |
CFLAGS += -fno-unwind-tables -DMALLOC_ALIGNMENT_16 |
LFLAGS += -N ../softint/softint.a |
AFLAGS += |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.S \ |
arch/$(ARCH)/src/psthread.S \ |
arch/$(ARCH)/src/thread.c |
BFD_NAME = elf64-little |
BFD_ARCH = ia64-elf64 |
/tags/0.2.0/uspace/libc/arch/ia64/include/psthread.h |
---|
0,0 → 1,140 |
/* |
* Copyright (C) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__ia64PSTHREAD_H__ |
#define __LIBC__ia64PSTHREAD_H__ |
#include <types.h> |
#include <align.h> |
#include <libarch/stack.h> |
#include <arch/types.h> |
/* |
* context_save() and context_restore() are both leaf procedures. |
* No need to allocate scratch area. |
*/ |
#define SP_DELTA (0+ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT)) |
#define PFM_MASK (~0x3fffffffff) |
#define PSTHREAD_INITIAL_STACK_PAGES_NO 2 |
/* Stack is divided into two equal parts (for memory stack and register stack). */ |
#define PSTHREAD_INITIAL_STACK_DIVISION 2 |
#ifdef context_set |
#undef context_set |
#endif |
#define context_set(c, _pc, stack, size, tls) \ |
do { \ |
(c)->pc = (uint64_t) _pc; \ |
(c)->bsp = ((uint64_t) stack) + size / PSTHREAD_INITIAL_STACK_DIVISION; \ |
(c)->ar_pfs &= PFM_MASK; \ |
(c)->sp = ((uint64_t) stack) + ALIGN_UP((size / PSTHREAD_INITIAL_STACK_DIVISION), STACK_ALIGNMENT) - SP_DELTA; \ |
(c)->tp = (uint64_t) tls; \ |
} while (0); |
/* |
* Only save registers that must be preserved across |
* function calls. |
*/ |
typedef struct context { |
/* |
* Application registers |
*/ |
uint64_t ar_pfs; |
uint64_t ar_unat_caller; |
uint64_t ar_unat_callee; |
uint64_t ar_rsc; |
uint64_t bsp; /* ar_bsp */ |
uint64_t ar_rnat; |
uint64_t ar_lc; |
/* |
* General registers |
*/ |
uint64_t r1; |
uint64_t r4; |
uint64_t r5; |
uint64_t r6; |
uint64_t r7; |
uint64_t sp; /* r12 */ |
uint64_t tp; /* r13 */ |
/* |
* Branch registers |
*/ |
uint64_t pc; /* b0 */ |
uint64_t b1; |
uint64_t b2; |
uint64_t b3; |
uint64_t b4; |
uint64_t b5; |
/* |
* Predicate registers |
*/ |
uint64_t pr; |
__r128 f2 __attribute__ ((aligned(16))); |
__r128 f3; |
__r128 f4; |
__r128 f5; |
__r128 f16; |
__r128 f17; |
__r128 f18; |
__r128 f19; |
__r128 f20; |
__r128 f21; |
__r128 f22; |
__r128 f23; |
__r128 f24; |
__r128 f25; |
__r128 f26; |
__r128 f27; |
__r128 f28; |
__r128 f29; |
__r128 f30; |
__r128 f31; |
} context_t; |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia64/include/atomic.h |
---|
0,0 → 1,67 |
/* |
* Copyright (C) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ia64_ATOMIC_H__ |
#define __ia64_ATOMIC_H__ |
/** Atomic addition. |
* |
* @param val Atomic value. |
* @param imm Value to add. |
* |
* @return Value before addition. |
*/ |
static inline long atomic_add(atomic_t *val, int imm) |
{ |
long v; |
__asm__ volatile ("fetchadd8.rel %0 = %1, %2\n" : "=r" (v), "+m" (val->count) : "i" (imm)); |
return v; |
} |
static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); } |
static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); } |
static inline long atomic_preinc(atomic_t *val) { return atomic_add(val, 1) + 1; } |
static inline long atomic_predec(atomic_t *val) { return atomic_add(val, -1) - 1; } |
static inline long atomic_postinc(atomic_t *val) { return atomic_add(val, 1); } |
static inline long atomic_postdec(atomic_t *val) { return atomic_add(val, -1); } |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia64/include/endian.h |
---|
0,0 → 1,50 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ia64_ENDIAN_H__ |
#define __ia64_ENDIAN_H__ |
#ifndef __LIBC__ENDIAN_H__ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __LITTLE_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia64/include/stackarg.h |
---|
0,0 → 1,43 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__STACKARG_H__ |
#define __LIBC__STACKARG_H__ |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia64/include/limits.h |
---|
0,0 → 1,50 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ia64__LIMITS_H__ |
#define __ia64__LIMITS_H__ |
# define LONG_MIN MIN_INT64 |
# define LONG_MAX MAX_INT64 |
# define ULONG_MIN MIN_UINT64 |
# define ULONG_MAX MAX_UINT64 |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia64/include/types.h |
---|
0,0 → 1,57 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__TYPES_H__ |
#define __LIBC__TYPES_H__ |
typedef unsigned long long sysarg_t; |
typedef unsigned long size_t; |
typedef signed long ssize_t; |
typedef ssize_t off_t; |
typedef char int8_t; |
typedef short int int16_t; |
typedef int int32_t; |
typedef long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long int uint64_t; |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia64/include/stack.h |
---|
0,0 → 1,47 |
/* |
* Copyright (C) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ia64_STACK_H__ |
#define __ia64_STACK_H__ |
#define STACK_ITEM_SIZE 8 |
#define STACK_ALIGNMENT 16 |
#define STACK_SCRATCH_AREA_SIZE 16 |
#define REGISTER_STACK_ALIGNMENT 8 |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia64/include/thread.h |
---|
0,0 → 1,64 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__ia64THREAD_H__ |
#define __LIBC__ia64THREAD_H__ |
#define THREAD_INITIAL_STACK_PAGES_NO 2 |
/* This structure must be exactly 16 bytes long */ |
typedef struct { |
void *dtv; /* unused in static linking*/ |
void *pst_data; |
} tcb_t; |
static inline void __tcb_set(tcb_t *tcb) |
{ |
__asm__ volatile ("mov r13 = %0\n" : : "r" (tcb) : "r13"); |
} |
static inline tcb_t *__tcb_get(void) |
{ |
void *retval; |
__asm__ volatile ("mov %0 = r13\n" : "=r" (retval)); |
return retval; |
} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia64/src/psthread.S |
---|
0,0 → 1,246 |
# |
# Copyright (C) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.global context_save |
.global context_restore |
context_save: |
alloc loc0 = ar.pfs, 1, 8, 0, 0 |
mov loc1 = ar.unat ;; |
/* loc2 */ |
mov loc3 = ar.rsc |
.auto |
/* |
* Flush dirty registers to backing store. |
* After this ar.bsp and ar.bspstore are equal. |
*/ |
flushrs |
mov loc4 = ar.bsp |
/* |
* Put RSE to enforced lazy mode. |
* So that ar.rnat can be read. |
*/ |
and loc5 = ~3, loc3 |
mov ar.rsc = loc5 |
mov loc5 = ar.rnat |
.explicit |
mov loc6 = ar.lc |
/* |
* Save application registers |
*/ |
st8 [in0] = loc0, 8 ;; /* save ar.pfs */ |
st8 [in0] = loc1, 8 ;; /* save ar.unat (caller) */ |
mov loc2 = in0 ;; |
add in0 = 8, in0 ;; /* skip ar.unat (callee) */ |
st8 [in0] = loc3, 8 ;; /* save ar.rsc */ |
st8 [in0] = loc4, 8 ;; /* save ar.bsp */ |
st8 [in0] = loc5, 8 ;; /* save ar.rnat */ |
st8 [in0] = loc6, 8 ;; /* save ar.lc */ |
/* |
* Save general registers including NaT bits |
*/ |
st8.spill [in0] = r1, 8 ;; |
st8.spill [in0] = r4, 8 ;; |
st8.spill [in0] = r5, 8 ;; |
st8.spill [in0] = r6, 8 ;; |
st8.spill [in0] = r7, 8 ;; |
st8.spill [in0] = r12, 8 ;; /* save sp */ |
st8.spill [in0] = r13, 8 ;; /* save tp */ |
mov loc3 = ar.unat ;; |
st8 [loc2] = loc3 /* save ar.unat (callee) */ |
/* |
* Save branch registers |
*/ |
mov loc2 = b0 ;; |
st8 [in0] = loc2, 8 /* save pc */ |
mov loc3 = b1 ;; |
st8 [in0] = loc3, 8 |
mov loc4 = b2 ;; |
st8 [in0] = loc4, 8 |
mov loc5 = b3 ;; |
st8 [in0] = loc5, 8 |
mov loc6 = b4 ;; |
st8 [in0] = loc6, 8 |
mov loc7 = b5 ;; |
st8 [in0] = loc7, 8 |
/* |
* Save predicate registers |
*/ |
mov loc2 = pr ;; |
st8 [in0] = loc2, 16;; /* Next fpu registers should be spilled to 16B aligned address */ |
/* |
* Save floating-point registers. |
*/ |
stf.spill [in0] = f2, 16 ;; |
stf.spill [in0] = f3, 16 ;; |
stf.spill [in0] = f4, 16 ;; |
stf.spill [in0] = f5, 16 ;; |
stf.spill [in0] = f16, 16 ;; |
stf.spill [in0] = f17, 16 ;; |
stf.spill [in0] = f18, 16 ;; |
stf.spill [in0] = f19, 16 ;; |
stf.spill [in0] = f20, 16 ;; |
stf.spill [in0] = f21, 16 ;; |
stf.spill [in0] = f22, 16 ;; |
stf.spill [in0] = f23, 16 ;; |
stf.spill [in0] = f24, 16 ;; |
stf.spill [in0] = f25, 16 ;; |
stf.spill [in0] = f26, 16 ;; |
stf.spill [in0] = f27, 16 ;; |
stf.spill [in0] = f28, 16 ;; |
stf.spill [in0] = f29, 16 ;; |
stf.spill [in0] = f30, 16 ;; |
stf.spill [in0] = f31, 16 ;; |
mov ar.unat = loc1 |
add r8 = r0, r0, 1 /* context_save returns 1 */ |
br.ret.sptk.many b0 |
context_restore: |
alloc loc0 = ar.pfs, 1, 9, 0, 0 ;; |
ld8 loc0 = [in0], 8 ;; /* load ar.pfs */ |
ld8 loc1 = [in0], 8 ;; /* load ar.unat (caller) */ |
ld8 loc2 = [in0], 8 ;; /* load ar.unat (callee) */ |
ld8 loc3 = [in0], 8 ;; /* load ar.rsc */ |
ld8 loc4 = [in0], 8 ;; /* load ar.bsp */ |
ld8 loc5 = [in0], 8 ;; /* load ar.rnat */ |
ld8 loc6 = [in0], 8 ;; /* load ar.lc */ |
.auto |
/* |
* Invalidate the ALAT |
*/ |
invala |
/* |
* Put RSE to enforced lazy mode. |
* So that ar.bspstore and ar.rnat can be written. |
*/ |
movl loc8 = ~3 |
and loc8 = loc3, loc8 |
mov ar.rsc = loc8 |
/* |
* Flush dirty registers to backing store. |
* We do this because we want the following move |
* to ar.bspstore to assign the same value to ar.bsp. |
*/ |
flushrs |
/* |
* Restore application registers |
*/ |
mov ar.bspstore = loc4 /* rse.bspload = ar.bsp = ar.bspstore = loc4 */ |
mov ar.rnat = loc5 |
mov ar.pfs = loc0 |
mov ar.rsc = loc3 |
.explicit |
mov ar.unat = loc2 ;; |
mov ar.lc = loc6 |
/* |
* Restore general registers including NaT bits |
*/ |
ld8.fill r1 = [in0], 8 ;; |
ld8.fill r4 = [in0], 8 ;; |
ld8.fill r5 = [in0], 8 ;; |
ld8.fill r6 = [in0], 8 ;; |
ld8.fill r7 = [in0], 8 ;; |
ld8.fill r12 = [in0], 8 ;; /* restore sp */ |
ld8.fill r13 = [in0], 8 ;; |
/* |
* Restore branch registers |
*/ |
ld8 loc2 = [in0], 8 ;; /* restore pc */ |
mov b0 = loc2 |
ld8 loc3 = [in0], 8 ;; |
mov b1 = loc3 |
ld8 loc4 = [in0], 8 ;; |
mov b2 = loc4 |
ld8 loc5 = [in0], 8 ;; |
mov b3 = loc5 |
ld8 loc6 = [in0], 8 ;; |
mov b4 = loc6 |
ld8 loc7 = [in0], 8 ;; |
mov b5 = loc7 |
/* |
* Restore predicate registers |
*/ |
ld8 loc2 = [in0], 16 ;; |
mov pr = loc2, ~0 |
/* |
* Restore floating-point registers. |
*/ |
ldf.fill f2 = [in0], 16 ;; |
ldf.fill f3 = [in0], 16 ;; |
ldf.fill f4 = [in0], 16 ;; |
ldf.fill f5 = [in0], 16 ;; |
ldf.fill f16 = [in0], 16 ;; |
ldf.fill f17 = [in0], 16 ;; |
ldf.fill f18 = [in0], 16 ;; |
ldf.fill f19 = [in0], 16 ;; |
ldf.fill f20 = [in0], 16 ;; |
ldf.fill f21 = [in0], 16 ;; |
ldf.fill f22 = [in0], 16 ;; |
ldf.fill f23 = [in0], 16 ;; |
ldf.fill f24 = [in0], 16 ;; |
ldf.fill f25 = [in0], 16 ;; |
ldf.fill f26 = [in0], 16 ;; |
ldf.fill f27 = [in0], 16 ;; |
ldf.fill f28 = [in0], 16 ;; |
ldf.fill f29 = [in0], 16 ;; |
ldf.fill f30 = [in0], 16 ;; |
ldf.fill f31 = [in0], 16 ;; |
mov ar.unat = loc1 |
mov r8 = r0 /* context_restore returns 0 */ |
br.ret.sptk.many b0 |
/tags/0.2.0/uspace/libc/arch/ia64/src/thread.c |
---|
0,0 → 1,66 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia64 ia64 |
* @brief ia64 architecture dependent parts of libc |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#include <thread.h> |
#include <malloc.h> |
/** Allocate TLS & TCB for initial module threads |
* |
* @param data Start of data section |
* @return pointer to tcb_t structure |
*/ |
extern char _tdata_start; |
extern char _tbss_end; |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
tcb_t *tcb; |
/* ASSERT(sizeof(tcb_t) == 16); */ |
tcb = malloc(sizeof(tcb_t) + size); |
*data = ((void *) tcb) + 16; |
return tcb; |
} |
void __free_tls_arch(tcb_t *tcb, size_t size) |
{ |
free(tcb); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia64/src/entry.s |
---|
0,0 → 1,57 |
# |
# Copyright (C) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.section .init, "ax" |
.org 0 |
.globl __entry |
.globl __entry_driver |
## User-space task entry point |
# |
# |
__entry: |
alloc loc0 = ar.pfs, 0, 1, 2, 0 |
mov r1 = _gp |
br.call.sptk.many b0 = __main |
0: |
br.call.sptk.many b0 = __io_init |
1: |
br.call.sptk.many b0 = main |
2: |
br.call.sptk.many b0 = __exit |
__entry_driver: |
alloc loc0 = ar.pfs, 0, 1, 2, 0 |
mov r1 = _gp |
br.call.sptk.many b0 = __main |
0: |
br.call.sptk.many b0 = main |
1: |
br.call.sptk.many b0 = __exit |
/tags/0.2.0/uspace/libc/arch/ia64/src/thread_entry.s |
---|
0,0 → 1,52 |
# |
# Copyright (C) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.globl __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
__thread_entry: |
alloc loc0 = ar.pfs, 0, 1, 1, 0 |
mov r1 = _gp |
# |
# r8 contains address of uarg structure. |
# |
mov out0 = r8 |
br.call.sptk.many b0 = __thread_main |
# |
# Not reached. |
# |
.end __thread_entry |
/tags/0.2.0/uspace/libc/arch/ia64/src/syscall.S |
---|
0,0 → 1,44 |
# |
# Copyright (C) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
/** |
* Immediate operand for break instruction. |
* Be carefull about the value as Ski simulator |
* is somewhat sensitive to its value. |
* |
* 0 will be confused with Ski breakpoint. |
* And higher values will be confused with SSC's. |
*/ |
#define SYSCALL_IMM 1 |
.global __syscall |
__syscall: |
alloc r14 = ar.pfs, 5, 0, 0, 0 ;; |
break SYSCALL_IMM |
mov ar.pfs = r14 ;; |
br.ret.sptk.many b0 |
/tags/0.2.0/uspace/libc/arch/ia64/_link.ld.in |
---|
0,0 → 1,52 |
STARTUP(../libc/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x4000; |
.init ALIGN(0x4000): SUBALIGN(0x4000) { |
*(.init); |
} : text |
.text : { |
*(.text); |
*(.rodata*); |
} :text |
.got ALIGN(0x4000) : SUBALIGN(0x4000) { |
_gp = .; |
*(.got*); |
} :data |
.data : { |
*(.opd); |
*(.data .data.*); |
*(.sdata); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
.bss : { |
*(.sbss); |
*(.scommon); |
*(COMMON); |
*(.bss); |
} :data |
. = ALIGN(0x4000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.2.0/uspace/libc/arch/mips32/include/context_offset.h |
---|
0,0 → 1,31 |
/* This file is automatically generated by gencontext.c. */ |
/* struct context */ |
#define OFFSET_SP 0x0 |
#define OFFSET_PC 0x4 |
#define OFFSET_S0 0x8 |
#define OFFSET_S1 0xc |
#define OFFSET_S2 0x10 |
#define OFFSET_S3 0x14 |
#define OFFSET_S4 0x18 |
#define OFFSET_S5 0x1c |
#define OFFSET_S6 0x20 |
#define OFFSET_S7 0x24 |
#define OFFSET_S8 0x28 |
#define OFFSET_GP 0x2c |
#define OFFSET_TLS 0x30 |
#define OFFSET_F20 0x34 |
#define OFFSET_F21 0x38 |
#define OFFSET_F22 0x3c |
#define OFFSET_F23 0x40 |
#define OFFSET_F24 0x44 |
#define OFFSET_F25 0x48 |
#define OFFSET_F26 0x4c |
#define OFFSET_F27 0x50 |
#define OFFSET_F28 0x54 |
#define OFFSET_F29 0x58 |
#define OFFSET_F30 0x5c |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/mips32/include/psthread.h |
---|
0,0 → 1,91 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#ifndef __LIBC__mips32PSTHREAD_H__ |
#define __LIBC__mips32PSTHREAD_H__ |
#include <types.h> |
/* We define our own context_set, because we need to set |
* the TLS pointer to the tcb+0x7000 |
* |
* See tls_set in thread.h |
*/ |
#define context_set(c, _pc, stack, size, ptls) \ |
(c)->pc = (sysarg_t) (_pc); \ |
(c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ |
(c)->tls = ((sysarg_t)(ptls)) + 0x7000 + sizeof(tcb_t); |
/* +16 is just for sure that the called function |
* have space to store it's arguments |
*/ |
#define SP_DELTA (8+16) |
typedef struct { |
uint32_t sp; |
uint32_t pc; |
uint32_t s0; |
uint32_t s1; |
uint32_t s2; |
uint32_t s3; |
uint32_t s4; |
uint32_t s5; |
uint32_t s6; |
uint32_t s7; |
uint32_t s8; |
uint32_t gp; |
uint32_t tls; /* Thread local storage(=k1) */ |
uint32_t f20; |
uint32_t f21; |
uint32_t f22; |
uint32_t f23; |
uint32_t f24; |
uint32_t f25; |
uint32_t f26; |
uint32_t f27; |
uint32_t f28; |
uint32_t f29; |
uint32_t f30; |
} context_t; |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/mips32/include/atomic.h |
---|
0,0 → 1,78 |
/* |
* Copyright (C) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#ifndef __mips32_ATOMIC_H__ |
#define __mips32_ATOMIC_H__ |
#define atomic_inc(x) ((void) atomic_add(x, 1)) |
#define atomic_dec(x) ((void) atomic_add(x, -1)) |
#define atomic_postinc(x) (atomic_add(x, 1) - 1) |
#define atomic_postdec(x) (atomic_add(x, -1) + 1) |
#define atomic_preinc(x) atomic_add(x, 1) |
#define atomic_predec(x) atomic_add(x, -1) |
/* Atomic addition of immediate value. |
* |
* @param val Memory location to which will be the immediate value added. |
* @param i Signed immediate that will be added to *val. |
* |
* @return Value after addition. |
*/ |
static inline long atomic_add(atomic_t *val, int i) |
{ |
long tmp, v; |
__asm__ volatile ( |
"1:\n" |
" ll %0, %1\n" |
" addiu %0, %0, %3\n" /* same as addi, but never traps on overflow */ |
" move %2, %0\n" |
" sc %0, %1\n" |
" beq %0, %4, 1b\n" /* if the atomic operation failed, try again */ |
/* nop */ /* nop is inserted automatically by compiler */ |
: "=r" (tmp), "=m" (val->count), "=r" (v) |
: "i" (i), "i" (0) |
); |
return v; |
} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/mips32/include/endian.h |
---|
0,0 → 1,51 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcmips32 mips32 |
* @brief mips32 architecture dependent parts of libc |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __mips32_ENDIAN_H__ |
#define __mips32_ENDIAN_H__ |
#ifndef __LIBC__ENDIAN_H__ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __LITTLE_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/mips32/include/stackarg.h |
---|
0,0 → 1,63 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#ifndef __LIBC_mips32_STACKARG_H__ |
#define __LIBC_mips32_STACKARG_H__ |
/* dont allow to define it second time in stdarg.h */ |
#define __VARARGS_DEFINED |
#include <types.h> |
/** |
* va_arg macro for MIPS32 - problem is that 64 bit values must be aligned on an 8-byte boundary (32bit values not) |
* To satisfy this, paddings must be sometimes inserted. |
*/ |
typedef uint8_t* va_list; |
#define va_start(ap, lst) \ |
((ap) = (va_list)&(lst) + sizeof(lst)) |
#define va_arg(ap, type) \ |
(((type *)((ap) = (va_list)( (sizeof(type) <= 4) ? ((uint32_t)((ap) + 2*4 - 1) & (~3)) : ((uint32_t)((ap) + 2*8 -1) & (~7)) )))[-1]) |
#define va_end(ap) |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/mips32/include/limits.h |
---|
0,0 → 1,50 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#ifndef __mips32__LIMITS_H__ |
#define __mips32__LIMITS_H__ |
# define LONG_MIN MIN_INT32 |
# define LONG_MAX MAX_INT32 |
# define ULONG_MIN MIN_UINT32 |
# define ULONG_MAX MAX_UINT32 |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/mips32/include/types.h |
---|
0,0 → 1,58 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#ifndef __LIBC__TYPES_H__ |
#define __LIBC__TYPES_H__ |
typedef unsigned int sysarg_t; |
typedef unsigned int size_t; |
typedef signed int ssize_t; |
typedef ssize_t off_t; |
typedef char int8_t; |
typedef short int int16_t; |
typedef long int int32_t; |
typedef long long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned long int uint32_t; |
typedef unsigned long long int uint64_t; |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/mips32/include/thread.h |
---|
0,0 → 1,80 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
/* TLS for MIPS is described in http://www.linux-mips.org/wiki/NPTL */ |
#ifndef __LIBC__mips32THREAD_H__ |
#define __LIBC__mips32THREAD_H__ |
/* I did not find any specification (neither MIPS nor PowerPC), but |
* as I found it |
* - it uses Variant II |
* - TCB is at Address(First TLS Block)+0x7000. |
* - DTV is at Address(First TLS Block)+0x8000 |
* - What would happen if the TLS data was larger then 0x7000? |
* - The linker never accesses DTV directly, has the second definition any |
* sense? |
* We will make it this way: |
* - TCB is at TP-0x7000-sizeof(tcb) |
* - No assumption about DTV etc., but it will not have a fixed address |
*/ |
#define MIPS_TP_OFFSET 0x7000 |
typedef struct { |
void *pst_data; |
} tcb_t; |
static inline void __tcb_set(tcb_t *tcb) |
{ |
void *tp = tcb; |
tp += MIPS_TP_OFFSET + sizeof(tcb_t); |
__asm__ volatile ("add $27, %0, $0" : : "r"(tp)); /* Move tls to K1 */ |
} |
static inline tcb_t * __tcb_get(void) |
{ |
void * retval; |
__asm__ volatile("add %0, $27, $0" : "=r"(retval)); |
return (tcb_t *)(retval - MIPS_TP_OFFSET - sizeof(tcb_t)); |
} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/mips32/Makefile.inc |
---|
0,0 → 1,47 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Toolchain configuration |
# |
TARGET = mipsel-linux-gnu |
TOOLCHAIN_DIR = /usr/local/mipsel/bin |
CFLAGS += -mips3 |
-include ../Makefile.config |
ifeq ($(CONFIG_MIPS_FPU),y) |
CFLAGS += -DCONFIG_MIPS_FPU |
endif |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ |
arch/$(ARCH)/src/psthread.S \ |
arch/$(ARCH)/src/thread.c |
BFD_ARCH = mips |
BFD_NAME = elf32-little |
/tags/0.2.0/uspace/libc/arch/mips32/src/entry.s |
---|
0,0 → 1,89 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.section .init, "ax" |
.global __entry |
.global __entry_driver |
.set noreorder |
.option pic2 |
## User-space task entry point |
# |
# |
.ent __entry |
__entry: |
.frame $sp, 32, $31 |
.cpload $25 |
# Mips o32 may store its arguments on stack, make space (16 bytes), |
# so that it could work with -O0 |
# Make space additional 16 bytes for the stack frame |
addiu $sp, -32 |
.cprestore 16 # Allow PIC code |
jal __main |
nop |
jal __io_init |
nop |
jal main |
nop |
jal __exit |
nop |
.end |
.ent __entry_driver |
__entry_driver: |
.frame $sp, 32, $31 |
.cpload $25 |
# Mips o32 may store its arguments on stack, make space (16 bytes), |
# so that it could work with -O0 |
# Make space additional 16 bytes for the stack frame |
addiu $sp, -32 |
.cprestore 16 # Allow PIC code |
jal __main |
nop |
jal main |
nop |
jal __exit |
nop |
.end |
# Alignment of output section data to 0x4000 |
.section .data |
.align 14 |
/tags/0.2.0/uspace/libc/arch/mips32/src/psthread.S |
---|
0,0 → 1,161 |
# |
# Copyright (C) 2003-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.set noat |
.set noreorder |
#include <arch/asm/regname.h> |
#include <libarch/context_offset.h> |
.global context_save |
.global context_restore |
.macro CONTEXT_STORE r |
sw $s0,OFFSET_S0(\r) |
sw $s1,OFFSET_S1(\r) |
sw $s2,OFFSET_S2(\r) |
sw $s3,OFFSET_S3(\r) |
sw $s4,OFFSET_S4(\r) |
sw $s5,OFFSET_S5(\r) |
sw $s6,OFFSET_S6(\r) |
sw $s7,OFFSET_S7(\r) |
sw $s8,OFFSET_S8(\r) |
sw $gp,OFFSET_GP(\r) |
sw $k1,OFFSET_TLS(\r) |
#ifdef CONFIG_MIPS_FPU |
mfc1 $t0,$20 |
sw $t0, OFFSET_F20(\r) |
mfc1 $t0,$21 |
sw $t0, OFFSET_F21(\r) |
mfc1 $t0,$22 |
sw $t0, OFFSET_F22(\r) |
mfc1 $t0,$23 |
sw $t0, OFFSET_F23(\r) |
mfc1 $t0,$24 |
sw $t0, OFFSET_F24(\r) |
mfc1 $t0,$25 |
sw $t0, OFFSET_F25(\r) |
mfc1 $t0,$26 |
sw $t0, OFFSET_F26(\r) |
mfc1 $t0,$27 |
sw $t0, OFFSET_F27(\r) |
mfc1 $t0,$28 |
sw $t0, OFFSET_F28(\r) |
mfc1 $t0,$29 |
sw $t0, OFFSET_F29(\r) |
mfc1 $t0,$30 |
sw $t0, OFFSET_F30(\r) |
#endif |
sw $ra,OFFSET_PC(\r) |
sw $sp,OFFSET_SP(\r) |
.endm |
.macro CONTEXT_LOAD r |
lw $s0,OFFSET_S0(\r) |
lw $s1,OFFSET_S1(\r) |
lw $s2,OFFSET_S2(\r) |
lw $s3,OFFSET_S3(\r) |
lw $s4,OFFSET_S4(\r) |
lw $s5,OFFSET_S5(\r) |
lw $s6,OFFSET_S6(\r) |
lw $s7,OFFSET_S7(\r) |
lw $s8,OFFSET_S8(\r) |
lw $gp,OFFSET_GP(\r) |
lw $k1,OFFSET_TLS(\r) |
#ifdef CONFIG_MIPS_FPU |
lw $t0, OFFSET_F20(\r) |
mtc1 $t0,$20 |
lw $t0, OFFSET_F21(\r) |
mtc1 $t0,$21 |
lw $t0, OFFSET_F22(\r) |
mtc1 $t0,$22 |
lw $t0, OFFSET_F23(\r) |
mtc1 $t0,$23 |
lw $t0, OFFSET_F24(\r) |
mtc1 $t0,$24 |
lw $t0, OFFSET_F25(\r) |
mtc1 $t0,$25 |
lw $t0, OFFSET_F26(\r) |
mtc1 $t0,$26 |
lw $t0, OFFSET_F27(\r) |
mtc1 $t0,$27 |
lw $t0, OFFSET_F28(\r) |
mtc1 $t0,$28 |
lw $t0, OFFSET_F29(\r) |
mtc1 $t0,$29 |
lw $t0, OFFSET_F30(\r) |
mtc1 $t0,$30 |
#endif |
lw $ra,OFFSET_PC(\r) |
lw $sp,OFFSET_SP(\r) |
.endm |
context_save: |
CONTEXT_STORE $a0 |
# context_save returns 1 |
j $ra |
li $v0, 1 |
context_restore: |
CONTEXT_LOAD $a0 |
# Just for the jump into first function, but one instruction |
# should not bother us |
move $t9, $ra |
# context_restore returns 0 |
j $ra |
xor $v0, $v0 |
/tags/0.2.0/uspace/libc/arch/mips32/src/thread.c |
---|
0,0 → 1,61 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#include <thread.h> |
#include <malloc.h> |
/** Allocate TLS & TCB for initial module threads |
* |
* @param data (out) Start of TLS section |
* @param size Size of tdata+tbss section |
* @return pointer to tcb_t structure |
*/ |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
tcb_t *result; |
result = malloc(sizeof(tcb_t) + size); |
*data = ((void *)result) + sizeof(tcb_t); |
return result; |
} |
void __free_tls_arch(tcb_t *tcb, size_t size) |
{ |
free(tcb); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/mips32/src/syscall.c |
---|
0,0 → 1,65 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#include <libc.h> |
sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, |
const sysarg_t p3, const sysarg_t p4, |
const syscall_t id) |
{ |
register sysarg_t __mips_reg_a0 asm("$4") = p1; |
register sysarg_t __mips_reg_a1 asm("$5") = p2; |
register sysarg_t __mips_reg_a2 asm("$6") = p3; |
register sysarg_t __mips_reg_a3 asm("$7") = p4; |
register sysarg_t __mips_reg_v0 asm("$2") = id; |
asm volatile ( |
"syscall\n" |
: "=r" (__mips_reg_v0) |
: "r" (__mips_reg_a0), |
"r" (__mips_reg_a1), |
"r" (__mips_reg_a2), |
"r" (__mips_reg_a3), |
"r" (__mips_reg_v0) |
: "%ra" /* We are a function call, although C does not |
* know it */ |
); |
return __mips_reg_v0; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/mips32/src/thread_entry.s |
---|
0,0 → 1,59 |
# |
# Copyright (C) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.set noat |
.set noreorder |
.option pic2 |
.globl __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
.ent __thread_entry |
__thread_entry: |
.frame $sp, 32, $31 |
.cpload $25 |
# |
# v0 contains address of uarg. |
# |
add $4, $2, 0 |
# Mips o32 may store its arguments on stack, make space |
addiu $sp, -32 |
.cprestore 16 |
jal __thread_main |
nop |
# |
# Not reached. |
# |
.end __thread_entry |
/tags/0.2.0/uspace/libc/arch/mips32/_link.ld.in |
---|
0,0 → 1,56 |
STARTUP(../libc/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x4000; |
.init ALIGN(0x4000) : SUBALIGN(0x4000) { |
*(.init); |
} :text |
.text : { |
*(.text); |
*(.rodata*); |
} :text |
.data : { |
*(.data); |
*(.data.rel*); |
} :data |
.got : { |
_gp = .; |
*(.got); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
.sbss : { |
*(.scommon); |
*(.sbss); |
} |
.bss : { |
*(.bss); |
*(COMMON); |
} :data |
. = ALIGN(0x4000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.2.0/uspace/libc/arch/mips32eb/include/endian.h |
---|
0,0 → 1,51 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcmips32eb mipseb32 |
* @brief mipseb32 architecture dependent parts of libc |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __mips32eb_ENDIAN_H__ |
#define __mips32eb_ENDIAN_H__ |
#ifndef __LIBC__ENDIAN_H__ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __BIG_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/mips32eb/include/limits.h |
---|
0,0 → 1,0 |
link ../../mips32/include/limits.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/libc/arch/mips32eb/include/context_offset.h |
---|
0,0 → 1,0 |
link ../../mips32/include/context_offset.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/libc/arch/mips32eb/include/psthread.h |
---|
0,0 → 1,0 |
link ../../mips32/include/psthread.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/libc/arch/mips32eb/include/atomic.h |
---|
0,0 → 1,0 |
link ../../mips32/include/atomic.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/libc/arch/mips32eb/include/stackarg.h |
---|
0,0 → 1,0 |
link ../../mips32/include/stackarg.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/libc/arch/mips32eb/include/types.h |
---|
0,0 → 1,0 |
link ../../mips32/include/types.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/libc/arch/mips32eb/include/thread.h |
---|
0,0 → 1,0 |
link ../../mips32/include/thread.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/libc/arch/mips32eb/Makefile.inc |
---|
0,0 → 1,43 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Toolchain configuration |
# |
TARGET = mips-sgi-irix5 |
TOOLCHAIN_DIR = /usr/local/mips/bin |
CFLAGS += -mips3 |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ |
arch/$(ARCH)/src/psthread.S \ |
arch/$(ARCH)/src/thread.c |
LFLAGS += -N |
BFD_ARCH = mips |
BFD_NAME = elf32-big |
/tags/0.2.0/uspace/libc/arch/mips32eb/_link.ld.in |
---|
0,0 → 1,0 |
link ../mips32/_link.ld.in |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/libc/arch/mips32eb/src |
---|
0,0 → 1,0 |
link ../mips32/src |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/libc/arch/amd64/src/thread.c |
---|
0,0 → 1,67 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcamd64 amd64 |
* @ingroup lc |
* @{ |
*/ |
/** @file |
* @ingroup libcia32 |
*/ |
#include <thread.h> |
#include <malloc.h> |
/** Allocate TLS & TCB for initial module threads |
* |
* @param data Start of data section |
* @return pointer to tcb_t structure |
*/ |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
tcb_t *tcb; |
*data = malloc(sizeof(tcb_t) + size); |
tcb = (tcb_t *) (*data + size); |
tcb->self = tcb; |
return tcb; |
} |
void __free_tls_arch(tcb_t *tcb, size_t size) |
{ |
void *start = ((void *)tcb) - size; |
free(start); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/amd64/src/entry.s |
---|
0,0 → 1,48 |
# |
# Copyright (C) 2006 Ondrej Palkovsky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.section .init, "ax" |
.org 0 |
.globl __entry |
.globl __entry_driver |
## User-space task entry point |
# |
# |
__entry: |
call __main |
call __io_init |
call main |
call __exit |
__entry_driver: |
call __main |
call main |
call __exit |
/tags/0.2.0/uspace/libc/arch/amd64/src/thread_entry.s |
---|
0,0 → 1,43 |
# |
# Copyright (C) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.globl __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
__thread_entry: |
# |
# RAX contains address of uarg |
# |
movq %rax, %rdi |
call __thread_main |
.end __thread_entry |
/tags/0.2.0/uspace/libc/arch/amd64/src/psthread.S |
---|
0,0 → 1,87 |
# |
# Copyright (C) 2001-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.global context_save |
.global context_restore |
#include <libarch/context_offset.h> |
## Save current CPU context |
# |
# Save CPU context to context_t variable |
# pointed by the 1st argument. Returns 1 in EAX. |
# |
context_save: |
movq (%rsp), %rdx # the caller's return %eip |
# In %edi is passed 1st argument |
movq %rdx, OFFSET_PC(%rdi) |
movq %rsp, OFFSET_SP(%rdi) |
movq %rbx, OFFSET_RBX(%rdi) |
movq %rbp, OFFSET_RBP(%rdi) |
movq %r12, OFFSET_R12(%rdi) |
movq %r13, OFFSET_R13(%rdi) |
movq %r14, OFFSET_R14(%rdi) |
movq %r15, OFFSET_R15(%rdi) |
# Save TLS |
movq %fs:0, %rax |
movq %rax, OFFSET_TLS(%rdi) |
xorq %rax,%rax # context_save returns 1 |
incq %rax |
ret |
## Restore current CPU context |
# |
# Restore CPU context from context_t variable |
# pointed by the 1st argument. Returns 0 in EAX. |
# |
context_restore: |
movq OFFSET_R15(%rdi), %r15 |
movq OFFSET_R14(%rdi), %r14 |
movq OFFSET_R13(%rdi), %r13 |
movq OFFSET_R12(%rdi), %r12 |
movq OFFSET_RBP(%rdi), %rbp |
movq OFFSET_RBX(%rdi), %rbx |
movq OFFSET_SP(%rdi), %rsp # ctx->sp -> %rsp |
movq OFFSET_PC(%rdi), %rdx |
movq %rdx,(%rsp) |
# Set thread local storage |
movq OFFSET_TLS(%rdi), %rdi # Set arg1 to TLS addr |
movq $1, %r8 |
syscall |
xorq %rax,%rax # context_restore returns 0 |
ret |
/tags/0.2.0/uspace/libc/arch/amd64/src/syscall.S |
---|
0,0 → 1,40 |
# |
# Copyright (C) 2006 Ondrej Palkovsky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.globl __syscall |
__syscall: |
# rcx gets rewritten on syscall |
movq %rcx, %r9 |
syscall |
ret |
.end __syscall |
/tags/0.2.0/uspace/libc/arch/amd64/include/context_offset.h |
---|
0,0 → 1,16 |
/* This file is automatically generated by gencontext.c. */ |
#define OFFSET_SP 0x0 |
#define OFFSET_PC 0x8 |
#define OFFSET_RBX 0x10 |
#define OFFSET_RBP 0x18 |
#define OFFSET_R12 0x20 |
#define OFFSET_R13 0x28 |
#define OFFSET_R14 0x30 |
#define OFFSET_R15 0x38 |
#define OFFSET_TLS 0x40 |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/amd64/include/psthread.h |
---|
0,0 → 1,70 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__amd64PSTHREAD_H__ |
#define __LIBC__amd64PSTHREAD_H__ |
#include <types.h> |
/* According to ABI the stack MUST be aligned on |
* 16-byte boundary. If it is not, the va_arg calling will |
* panic sooner or later |
*/ |
#define SP_DELTA 16 |
/* We include only registers that must be preserved |
* during function call |
*/ |
typedef struct { |
uint64_t sp; |
uint64_t pc; |
uint64_t rbx; |
uint64_t rbp; |
uint64_t r12; |
uint64_t r13; |
uint64_t r14; |
uint64_t r15; |
uint64_t tls; |
} context_t; |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/amd64/include/atomic.h |
---|
0,0 → 1,83 |
/* |
* Copyright (C) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcamd64 amd64 |
* @ingroup lc |
* @brief amd64 architecture dependent parts of libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __amd64_ATOMIC_H__ |
#define __amd64_ATOMIC_H__ |
static inline void atomic_inc(atomic_t *val) { |
__asm__ volatile ("lock incq %0\n" : "=m" (val->count)); |
} |
static inline void atomic_dec(atomic_t *val) { |
__asm__ volatile ("lock decq %0\n" : "=m" (val->count)); |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
long r; |
__asm__ volatile ( |
"movq $1, %0\n" |
"lock xaddq %0, %1\n" |
: "=r" (r), "=m" (val->count) |
); |
return r; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
long r; |
__asm__ volatile ( |
"movq $-1, %0\n" |
"lock xaddq %0, %1\n" |
: "=r" (r), "=m" (val->count) |
); |
return r; |
} |
#define atomic_preinc(val) (atomic_postinc(val)+1) |
#define atomic_predec(val) (atomic_postdec(val)-1) |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/amd64/include/endian.h |
---|
0,0 → 1,51 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __amd64_ENDIAN_H__ |
#define __amd64_ENDIAN_H__ |
#ifndef __LIBC__ENDIAN_H__ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __LITTLE_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/amd64/include/stackarg.h |
---|
0,0 → 1,44 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__STACKARG_H__ |
#define __LIBC__STACKARG_H__ |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/amd64/include/limits.h |
---|
0,0 → 1,51 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __amd64__LIMITS_H__ |
#define __amd64__LIMITS_H__ |
# define LONG_MIN MIN_INT64 |
# define LONG_MAX MAX_INT64 |
# define ULONG_MIN MIN_UINT64 |
# define ULONG_MAX MAX_UINT64 |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/amd64/include/types.h |
---|
0,0 → 1,59 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__TYPES_H__ |
#define __LIBC__TYPES_H__ |
typedef unsigned long long sysarg_t; |
typedef unsigned long size_t; |
typedef signed long ssize_t; |
typedef ssize_t off_t; |
typedef char int8_t; |
typedef short int int16_t; |
typedef int int32_t; |
typedef long long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long long int uint64_t; |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/amd64/include/thread.h |
---|
0,0 → 1,64 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__amd64THREAD_H__ |
#define __LIBC__amd64THREAD_H__ |
#include <libc.h> |
typedef struct { |
void *self; |
void *pst_data; |
} tcb_t; |
static inline void __tcb_set(tcb_t *tcb) |
{ |
__SYSCALL1(SYS_TLS_SET, (sysarg_t) tcb); |
} |
static inline tcb_t * __tcb_get(void) |
{ |
void * retval; |
__asm__ ("movq %%fs:0, %0" : "=r"(retval)); |
return retval; |
} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/amd64/Makefile.inc |
---|
0,0 → 1,42 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Toolchain configuration |
# |
TARGET = amd64-linux-gnu |
TOOLCHAIN_DIR = /usr/local/amd64/bin |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.S \ |
arch/$(ARCH)/src/psthread.S \ |
arch/$(ARCH)/src/thread.c |
LFLAGS += -N |
BFD_NAME = elf64-x86-64 |
BFD_ARCH = i386:x86-64 |
/tags/0.2.0/uspace/libc/arch/amd64/_link.ld.in |
---|
0,0 → 1,46 |
STARTUP(../libc/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x1000; |
.init ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.init); |
} :text |
.text : { |
*(.text); |
*(.rodata*); |
} :text |
.data ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.data); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
.bss : { |
*(COMMON); |
*(.bss); |
} :data |
. = ALIGN(0x1000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.2.0/uspace/libc/arch/ppc32/include/context_offset.h |
---|
0,0 → 1,29 |
/* struct context */ |
#define OFFSET_SP 0x0 |
#define OFFSET_PC 0x4 |
#define OFFSET_R2 0x8 |
#define OFFSET_R13 0xc |
#define OFFSET_R14 0x10 |
#define OFFSET_R15 0x14 |
#define OFFSET_R16 0x18 |
#define OFFSET_R17 0x1c |
#define OFFSET_R18 0x20 |
#define OFFSET_R19 0x24 |
#define OFFSET_R20 0x28 |
#define OFFSET_R21 0x2c |
#define OFFSET_R22 0x30 |
#define OFFSET_R23 0x34 |
#define OFFSET_R24 0x38 |
#define OFFSET_R25 0x3c |
#define OFFSET_R26 0x40 |
#define OFFSET_R27 0x44 |
#define OFFSET_R28 0x48 |
#define OFFSET_R29 0x4c |
#define OFFSET_R30 0x50 |
#define OFFSET_R31 0x54 |
#define OFFSET_CR 0x58 |
#define OFFSET_CR 0x58 |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc32/include/psthread.h |
---|
0,0 → 1,84 |
/* |
* Copyright (C) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__ppc32__PSTHREAD_H__ |
#define __LIBC__ppc32__PSTHREAD_H__ |
#include <types.h> |
/* We define our own context_set, because we need to set |
* the TLS pointer to the tcb+0x7000 |
* |
* See tls_set in thread.h |
*/ |
#define context_set(c, _pc, stack, size, ptls) \ |
(c)->pc = (sysarg_t) (_pc); \ |
(c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ |
(c)->tls = ((sysarg_t) (ptls)) + 0x7000 + sizeof(tcb_t); |
#define SP_DELTA 16 |
typedef struct { |
uint32_t sp; |
uint32_t pc; |
uint32_t tls; |
uint32_t r13; |
uint32_t r14; |
uint32_t r15; |
uint32_t r16; |
uint32_t r17; |
uint32_t r18; |
uint32_t r19; |
uint32_t r20; |
uint32_t r21; |
uint32_t r22; |
uint32_t r23; |
uint32_t r24; |
uint32_t r25; |
uint32_t r26; |
uint32_t r27; |
uint32_t r28; |
uint32_t r29; |
uint32_t r30; |
uint32_t r31; |
uint32_t cr; |
} __attribute__ ((packed)) context_t; |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc32/include/atomic.h |
---|
0,0 → 1,96 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ppc32_ATOMIC_H__ |
#define __ppc32_ATOMIC_H__ |
static inline void atomic_inc(atomic_t *val) |
{ |
long tmp; |
asm __volatile__ ( |
"1:\n" |
"lwarx %0, 0, %2\n" |
"addic %0, %0, 1\n" |
"stwcx. %0, 0, %2\n" |
"bne- 1b" |
: "=&r" (tmp), "=m" (val->count) |
: "r" (&val->count), "m" (val->count) |
: "cc"); |
} |
static inline void atomic_dec(atomic_t *val) |
{ |
long tmp; |
asm __volatile__( |
"1:\n" |
"lwarx %0, 0, %2\n" |
"addic %0, %0, -1\n" |
"stwcx. %0, 0, %2\n" |
"bne- 1b" |
: "=&r" (tmp), "=m" (val->count) |
: "r" (&val->count), "m" (val->count) |
: "cc"); |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
atomic_inc(val); |
return val->count - 1; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
atomic_dec(val); |
return val->count + 1; |
} |
static inline long atomic_preinc(atomic_t *val) |
{ |
atomic_inc(val); |
return val->count; |
} |
static inline long atomic_predec(atomic_t *val) |
{ |
atomic_dec(val); |
return val->count; |
} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc32/include/endian.h |
---|
0,0 → 1,48 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ppc32_ENDIAN_H__ |
#define __ppc32_ENDIAN_H__ |
#ifndef __LIBC__ENDIAN_H__ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __BIG_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc32/include/regname.h |
---|
0,0 → 1,189 |
/* |
* Copyright (C) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ppc32_REGNAME_H__ |
#define __ppc32_REGNAME_H__ |
/* Condition Register Bit Fields */ |
#define cr0 0 |
#define cr1 1 |
#define cr2 2 |
#define cr3 3 |
#define cr4 4 |
#define cr5 5 |
#define cr6 6 |
#define cr7 7 |
/* General Purpose Registers (GPRs) */ |
#define r0 0 |
#define r1 1 |
#define r2 2 |
#define r3 3 |
#define r4 4 |
#define r5 5 |
#define r6 6 |
#define r7 7 |
#define r8 8 |
#define r9 9 |
#define r10 10 |
#define r11 11 |
#define r12 12 |
#define r13 13 |
#define r14 14 |
#define r15 15 |
#define r16 16 |
#define r17 17 |
#define r18 18 |
#define r19 19 |
#define r20 20 |
#define r21 21 |
#define r22 22 |
#define r23 23 |
#define r24 24 |
#define r25 25 |
#define r26 26 |
#define r27 27 |
#define r28 28 |
#define r29 29 |
#define r30 30 |
#define r31 31 |
/* GPR Aliases */ |
#define sp 1 |
/* Floating Point Registers (FPRs) */ |
#define fr0 0 |
#define fr1 1 |
#define fr2 2 |
#define fr3 3 |
#define fr4 4 |
#define fr5 5 |
#define fr6 6 |
#define fr7 7 |
#define fr8 8 |
#define fr9 9 |
#define fr10 10 |
#define fr11 11 |
#define fr12 12 |
#define fr13 13 |
#define fr14 14 |
#define fr15 15 |
#define fr16 16 |
#define fr17 17 |
#define fr18 18 |
#define fr19 19 |
#define fr20 20 |
#define fr21 21 |
#define fr22 22 |
#define fr23 23 |
#define fr24 24 |
#define fr25 25 |
#define fr26 26 |
#define fr27 27 |
#define fr28 28 |
#define fr29 29 |
#define fr30 30 |
#define fr31 31 |
#define vr0 0 |
#define vr1 1 |
#define vr2 2 |
#define vr3 3 |
#define vr4 4 |
#define vr5 5 |
#define vr6 6 |
#define vr7 7 |
#define vr8 8 |
#define vr9 9 |
#define vr10 10 |
#define vr11 11 |
#define vr12 12 |
#define vr13 13 |
#define vr14 14 |
#define vr15 15 |
#define vr16 16 |
#define vr17 17 |
#define vr18 18 |
#define vr19 19 |
#define vr20 20 |
#define vr21 21 |
#define vr22 22 |
#define vr23 23 |
#define vr24 24 |
#define vr25 25 |
#define vr26 26 |
#define vr27 27 |
#define vr28 28 |
#define vr29 29 |
#define vr30 30 |
#define vr31 31 |
#define evr0 0 |
#define evr1 1 |
#define evr2 2 |
#define evr3 3 |
#define evr4 4 |
#define evr5 5 |
#define evr6 6 |
#define evr7 7 |
#define evr8 8 |
#define evr9 9 |
#define evr10 10 |
#define evr11 11 |
#define evr12 12 |
#define evr13 13 |
#define evr14 14 |
#define evr15 15 |
#define evr16 16 |
#define evr17 17 |
#define evr18 18 |
#define evr19 19 |
#define evr20 20 |
#define evr21 21 |
#define evr22 22 |
#define evr23 23 |
#define evr24 24 |
#define evr25 25 |
#define evr26 26 |
#define evr27 27 |
#define evr28 28 |
#define evr29 29 |
#define evr30 30 |
#define evr31 31 |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc32/include/stackarg.h |
---|
0,0 → 1,43 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__STACKARG_H__ |
#define __LIBC__STACKARG_H__ |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc32/include/limits.h |
---|
0,0 → 1,47 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ppc32__LIMITS_H__ |
#define __ppc32__LIMITS_H__ |
#define LONG_MIN MIN_INT32 |
#define LONG_MAX MAX_INT32 |
#define ULONG_MIN MIN_UINT32 |
#define ULONG_MAX MAX_UINT32 |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc32/include/types.h |
---|
0,0 → 1,57 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__TYPES_H__ |
#define __LIBC__TYPES_H__ |
typedef unsigned int sysarg_t; |
typedef unsigned int size_t; |
typedef signed int ssize_t; |
typedef ssize_t off_t; |
typedef char int8_t; |
typedef short int int16_t; |
typedef int int32_t; |
typedef long long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long long int uint64_t; |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc32/include/thread.h |
---|
0,0 → 1,72 |
/* |
* Copyright (C) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__ppc32__THREAD_H__ |
#define __LIBC__ppc32__THREAD_H__ |
#define PPC_TP_OFFSET 0x7000 |
typedef struct { |
void *pst_data; |
} tcb_t; |
static inline void __tcb_set(tcb_t *tcb) |
{ |
void *tp = tcb; |
tp += PPC_TP_OFFSET + sizeof(tcb_t); |
asm volatile ( |
"mr %%r2, %0\n" |
: |
: "r" (tp) |
); |
} |
static inline tcb_t * __tcb_get(void) |
{ |
void * retval; |
asm volatile ( |
"mr %0, %%r2\n" |
: "=r" (retval) |
); |
return (tcb_t *)(retval - PPC_TP_OFFSET - sizeof(tcb_t)); |
} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc32/src/thread.c |
---|
0,0 → 1,60 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#include <thread.h> |
#include <malloc.h> |
/** Allocate TLS & TCB for initial module threads |
* |
* @param data Start of data section |
* @return pointer to tcb_t structure |
* |
*/ |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
tcb_t *result; |
result = malloc(sizeof(tcb_t) + size); |
*data = ((void *)result) + sizeof(tcb_t); |
return result; |
} |
void __free_tls_arch(tcb_t *tcb, size_t size) |
{ |
free(tcb); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc32/src/syscall.c |
---|
0,0 → 1,62 |
/* |
* Copyright (C) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc32 ppc32 |
* @brief ppc32 architecture dependent parts of libc |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#include <libc.h> |
sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, const sysarg_t p3, const sysarg_t p4, const syscall_t id) |
{ |
register sysarg_t __ppc32_reg_r3 asm("3") = p1; |
register sysarg_t __ppc32_reg_r4 asm("4") = p2; |
register sysarg_t __ppc32_reg_r5 asm("5") = p3; |
register sysarg_t __ppc32_reg_r6 asm("6") = p4; |
register sysarg_t __ppc32_reg_r7 asm("7") = id; |
asm volatile ( |
"sc\n" |
: "=r" (__ppc32_reg_r3) |
: "r" (__ppc32_reg_r3), |
"r" (__ppc32_reg_r4), |
"r" (__ppc32_reg_r5), |
"r" (__ppc32_reg_r6), |
"r" (__ppc32_reg_r7) |
); |
return __ppc32_reg_r3; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc32/src/entry.s |
---|
0,0 → 1,48 |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.section .init, "ax" |
.org 0 |
.globl __entry |
.globl __entry_driver |
## User-space task entry point |
# |
# |
__entry: |
bl __main |
bl __io_init |
bl main |
bl __exit |
__entry_driver: |
bl __main |
bl main |
bl __exit |
/tags/0.2.0/uspace/libc/arch/ppc32/src/psthread.S |
---|
0,0 → 1,110 |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.global context_save |
.global context_restore |
#include <libarch/regname.h> |
#include <libarch/context_offset.h> |
.macro CONTEXT_STORE r |
stw sp, OFFSET_SP(\r) |
stw r2, OFFSET_R2(\r) |
stw r13, OFFSET_R13(\r) |
stw r14, OFFSET_R14(\r) |
stw r15, OFFSET_R15(\r) |
stw r16, OFFSET_R16(\r) |
stw r17, OFFSET_R17(\r) |
stw r18, OFFSET_R18(\r) |
stw r19, OFFSET_R19(\r) |
stw r20, OFFSET_R20(\r) |
stw r21, OFFSET_R21(\r) |
stw r22, OFFSET_R22(\r) |
stw r23, OFFSET_R23(\r) |
stw r24, OFFSET_R24(\r) |
stw r25, OFFSET_R25(\r) |
stw r26, OFFSET_R26(\r) |
stw r27, OFFSET_R27(\r) |
stw r28, OFFSET_R28(\r) |
stw r29, OFFSET_R29(\r) |
stw r30, OFFSET_R30(\r) |
stw r31, OFFSET_R31(\r) |
.endm |
.macro CONTEXT_LOAD r |
lwz sp, OFFSET_SP(\r) |
lwz r2, OFFSET_R2(\r) |
lwz r13, OFFSET_R13(\r) |
lwz r14, OFFSET_R14(\r) |
lwz r15, OFFSET_R15(\r) |
lwz r16, OFFSET_R16(\r) |
lwz r17, OFFSET_R17(\r) |
lwz r18, OFFSET_R18(\r) |
lwz r19, OFFSET_R19(\r) |
lwz r20, OFFSET_R20(\r) |
lwz r21, OFFSET_R21(\r) |
lwz r22, OFFSET_R22(\r) |
lwz r23, OFFSET_R23(\r) |
lwz r24, OFFSET_R24(\r) |
lwz r25, OFFSET_R25(\r) |
lwz r26, OFFSET_R26(\r) |
lwz r27, OFFSET_R27(\r) |
lwz r28, OFFSET_R28(\r) |
lwz r29, OFFSET_R29(\r) |
lwz r30, OFFSET_R30(\r) |
lwz r31, OFFSET_R31(\r) |
.endm |
context_save: |
CONTEXT_STORE r3 |
mflr r4 |
stw r4, OFFSET_PC(r3) |
mfcr r4 |
stw r4, OFFSET_CR(r3) |
# context_save returns 1 |
li r3, 1 |
blr |
context_restore: |
CONTEXT_LOAD r3 |
lwz r4, OFFSET_CR(r3) |
mtcr r4 |
lwz r4, OFFSET_PC(r3) |
mtlr r4 |
# context_restore returns 0 |
li r3, 0 |
blr |
/tags/0.2.0/uspace/libc/arch/ppc32/src/thread_entry.s |
---|
0,0 → 1,39 |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.globl __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
__thread_entry: |
b __thread_main |
.end __thread_entry |
/tags/0.2.0/uspace/libc/arch/ppc32/Makefile.inc |
---|
0,0 → 1,44 |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Toolchain configuration |
# |
TARGET = ppc-linux-gnu |
TOOLCHAIN_DIR = /usr/local/ppc/bin |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ |
arch/$(ARCH)/src/psthread.S \ |
arch/$(ARCH)/src/thread.c |
CFLAGS += -mcpu=powerpc -msoft-float -m32 |
AFLAGS += -a32 |
LFLAGS += -N |
BFD_NAME = elf32-powerpc |
BFD_ARCH = powerpc:common |
/tags/0.2.0/uspace/libc/arch/ppc32/_link.ld.in |
---|
0,0 → 1,47 |
STARTUP(../libc/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x1000; |
.init ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.init); |
} :text |
.text : { |
*(.text); |
*(.rodata*); |
} :text |
.data ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.data); |
*(.sdata); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
.bss : { |
*(.sbss); |
*(COMMON); |
*(.bss); |
} :data |
. = ALIGN(0x1000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.2.0/uspace/libc/arch/ppc64/include/context_offset.h |
---|
0,0 → 1,28 |
/* struct context */ |
#define OFFSET_SP 0x0 |
#define OFFSET_PC 0x4 |
#define OFFSET_R2 0x8 |
#define OFFSET_R13 0xc |
#define OFFSET_R14 0x10 |
#define OFFSET_R15 0x14 |
#define OFFSET_R16 0x18 |
#define OFFSET_R17 0x1c |
#define OFFSET_R18 0x20 |
#define OFFSET_R19 0x24 |
#define OFFSET_R20 0x28 |
#define OFFSET_R21 0x2c |
#define OFFSET_R22 0x30 |
#define OFFSET_R23 0x34 |
#define OFFSET_R24 0x38 |
#define OFFSET_R25 0x3c |
#define OFFSET_R26 0x40 |
#define OFFSET_R27 0x44 |
#define OFFSET_R28 0x48 |
#define OFFSET_R29 0x4c |
#define OFFSET_R30 0x50 |
#define OFFSET_R31 0x54 |
#define OFFSET_CR 0x58 |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc64/include/psthread.h |
---|
0,0 → 1,84 |
/* |
* Copyright (C) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__ppc64__PSTHREAD_H__ |
#define __LIBC__ppc64__PSTHREAD_H__ |
#include <types.h> |
/* We define our own context_set, because we need to set |
* the TLS pointer to the tcb+0x7000 |
* |
* See tls_set in thread.h |
*/ |
#define context_set(c, _pc, stack, size, ptls) \ |
(c)->pc = (sysarg_t) (_pc); \ |
(c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ |
(c)->tls = ((sysarg_t) (ptls)) + 0x7000 + sizeof(tcb_t); |
#define SP_DELTA 16 |
typedef struct { |
uint64_t sp; |
uint64_t pc; |
uint64_t tls; |
uint64_t r13; |
uint64_t r14; |
uint64_t r15; |
uint64_t r16; |
uint64_t r17; |
uint64_t r18; |
uint64_t r19; |
uint64_t r20; |
uint64_t r21; |
uint64_t r22; |
uint64_t r23; |
uint64_t r24; |
uint64_t r25; |
uint64_t r26; |
uint64_t r27; |
uint64_t r28; |
uint64_t r29; |
uint64_t r30; |
uint64_t r31; |
uint64_t cr; |
} __attribute__ ((packed)) context_t; |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc64/include/atomic.h |
---|
0,0 → 1,96 |
/* |
* Copyright (C) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ppc64_ATOMIC_H__ |
#define __ppc64_ATOMIC_H__ |
static inline void atomic_inc(atomic_t *val) |
{ |
long tmp; |
asm __volatile__ ( |
"1:\n" |
"lwarx %0, 0, %2\n" |
"addic %0, %0, 1\n" |
"stwcx. %0, 0, %2\n" |
"bne- 1b" |
: "=&r" (tmp), "=m" (val->count) |
: "r" (&val->count), "m" (val->count) |
: "cc"); |
} |
static inline void atomic_dec(atomic_t *val) |
{ |
long tmp; |
asm __volatile__( |
"1:\n" |
"lwarx %0, 0, %2\n" |
"addic %0, %0, -1\n" |
"stwcx. %0, 0, %2\n" |
"bne- 1b" |
: "=&r" (tmp), "=m" (val->count) |
: "r" (&val->count), "m" (val->count) |
: "cc"); |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
atomic_inc(val); |
return val->count - 1; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
atomic_dec(val); |
return val->count + 1; |
} |
static inline long atomic_preinc(atomic_t *val) |
{ |
atomic_inc(val); |
return val->count; |
} |
static inline long atomic_predec(atomic_t *val) |
{ |
atomic_dec(val); |
return val->count; |
} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc64/include/endian.h |
---|
0,0 → 1,48 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ppc64_ENDIAN_H__ |
#define __ppc64_ENDIAN_H__ |
#ifndef __LIBC__ENDIAN_H__ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __BIG_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc64/include/regname.h |
---|
0,0 → 1,189 |
/* |
* Copyright (C) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ppc64_REGNAME_H__ |
#define __ppc64_REGNAME_H__ |
/* Condition Register Bit Fields */ |
#define cr0 0 |
#define cr1 1 |
#define cr2 2 |
#define cr3 3 |
#define cr4 4 |
#define cr5 5 |
#define cr6 6 |
#define cr7 7 |
/* General Purpose Registers (GPRs) */ |
#define r0 0 |
#define r1 1 |
#define r2 2 |
#define r3 3 |
#define r4 4 |
#define r5 5 |
#define r6 6 |
#define r7 7 |
#define r8 8 |
#define r9 9 |
#define r10 10 |
#define r11 11 |
#define r12 12 |
#define r13 13 |
#define r14 14 |
#define r15 15 |
#define r16 16 |
#define r17 17 |
#define r18 18 |
#define r19 19 |
#define r20 20 |
#define r21 21 |
#define r22 22 |
#define r23 23 |
#define r24 24 |
#define r25 25 |
#define r26 26 |
#define r27 27 |
#define r28 28 |
#define r29 29 |
#define r30 30 |
#define r31 31 |
/* GPR Aliases */ |
#define sp 1 |
/* Floating Point Registers (FPRs) */ |
#define fr0 0 |
#define fr1 1 |
#define fr2 2 |
#define fr3 3 |
#define fr4 4 |
#define fr5 5 |
#define fr6 6 |
#define fr7 7 |
#define fr8 8 |
#define fr9 9 |
#define fr10 10 |
#define fr11 11 |
#define fr12 12 |
#define fr13 13 |
#define fr14 14 |
#define fr15 15 |
#define fr16 16 |
#define fr17 17 |
#define fr18 18 |
#define fr19 19 |
#define fr20 20 |
#define fr21 21 |
#define fr22 22 |
#define fr23 23 |
#define fr24 24 |
#define fr25 25 |
#define fr26 26 |
#define fr27 27 |
#define fr28 28 |
#define fr29 29 |
#define fr30 30 |
#define fr31 31 |
#define vr0 0 |
#define vr1 1 |
#define vr2 2 |
#define vr3 3 |
#define vr4 4 |
#define vr5 5 |
#define vr6 6 |
#define vr7 7 |
#define vr8 8 |
#define vr9 9 |
#define vr10 10 |
#define vr11 11 |
#define vr12 12 |
#define vr13 13 |
#define vr14 14 |
#define vr15 15 |
#define vr16 16 |
#define vr17 17 |
#define vr18 18 |
#define vr19 19 |
#define vr20 20 |
#define vr21 21 |
#define vr22 22 |
#define vr23 23 |
#define vr24 24 |
#define vr25 25 |
#define vr26 26 |
#define vr27 27 |
#define vr28 28 |
#define vr29 29 |
#define vr30 30 |
#define vr31 31 |
#define evr0 0 |
#define evr1 1 |
#define evr2 2 |
#define evr3 3 |
#define evr4 4 |
#define evr5 5 |
#define evr6 6 |
#define evr7 7 |
#define evr8 8 |
#define evr9 9 |
#define evr10 10 |
#define evr11 11 |
#define evr12 12 |
#define evr13 13 |
#define evr14 14 |
#define evr15 15 |
#define evr16 16 |
#define evr17 17 |
#define evr18 18 |
#define evr19 19 |
#define evr20 20 |
#define evr21 21 |
#define evr22 22 |
#define evr23 23 |
#define evr24 24 |
#define evr25 25 |
#define evr26 26 |
#define evr27 27 |
#define evr28 28 |
#define evr29 29 |
#define evr30 30 |
#define evr31 31 |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc64/include/stackarg.h |
---|
0,0 → 1,43 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__STACKARG_H__ |
#define __LIBC__STACKARG_H__ |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc64/include/limits.h |
---|
0,0 → 1,47 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ppc64__LIMITS_H__ |
#define __ppc64__LIMITS_H__ |
#define LONG_MIN MIN_INT64 |
#define LONG_MAX MAX_INT64 |
#define ULONG_MIN MIN_UINT64 |
#define ULONG_MAX MAX_UINT64 |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc64/include/types.h |
---|
0,0 → 1,57 |
/* |
* Copyright (C) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__TYPES_H__ |
#define __LIBC__TYPES_H__ |
typedef unsigned long sysarg_t; |
typedef unsigned long size_t; |
typedef signed long ssize_t; |
typedef ssize_t off_t; |
typedef char int8_t; |
typedef short int int16_t; |
typedef int int32_t; |
typedef long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long int uint64_t; |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc64/include/thread.h |
---|
0,0 → 1,72 |
/* |
* Copyright (C) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__ppc64__THREAD_H__ |
#define __LIBC__ppc64__THREAD_H__ |
#define PPC_TP_OFFSET 0x7000 |
typedef struct { |
void *pst_data; |
} tcb_t; |
static inline void __tcb_set(tcb_t *tcb) |
{ |
void *tp = tcb; |
tp += PPC_TP_OFFSET + sizeof(tcb_t); |
asm volatile ( |
"mr %%r2, %0\n" |
: |
: "r" (tp) |
); |
} |
static inline tcb_t * __tcb_get(void) |
{ |
void * retval; |
asm volatile ( |
"mr %0, %%r2\n" |
: "=r" (retval) |
); |
return (tcb_t *)(retval - PPC_TP_OFFSET - sizeof(tcb_t)); |
} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc64/src/thread.c |
---|
0,0 → 1,61 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#include <thread.h> |
#include <malloc.h> |
/** Allocate TLS & TCB for initial module threads |
* |
* @param data Start of data section |
* @return pointer to tcb_t structure |
* |
*/ |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
tcb_t *tcb; |
*data = malloc(sizeof(tcb_t) + size); |
tcb = (tcb_t *) (*data + size); |
return tcb; |
} |
void __free_tls_arch(tcb_t *tcb, size_t size) |
{ |
void *start = ((void *) tcb) - size; |
free(start); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc64/src/syscall.c |
---|
0,0 → 1,62 |
/* |
* Copyright (C) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcppc64 ppc64 |
* @brief ppc64 architecture dependent parts of libc |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#include <libc.h> |
sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, const sysarg_t p3, const sysarg_t p4, const syscall_t id) |
{ |
register sysarg_t __ppc32_reg_r3 asm("3") = p1; |
register sysarg_t __ppc32_reg_r4 asm("4") = p2; |
register sysarg_t __ppc32_reg_r5 asm("5") = p3; |
register sysarg_t __ppc32_reg_r6 asm("6") = p4; |
register sysarg_t __ppc32_reg_r7 asm("7") = id; |
asm volatile ( |
"sc\n" |
: "=r" (__ppc32_reg_r3) |
: "r" (__ppc32_reg_r3), |
"r" (__ppc32_reg_r4), |
"r" (__ppc32_reg_r5), |
"r" (__ppc32_reg_r6), |
"r" (__ppc32_reg_r7) |
); |
return __ppc32_reg_r3; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ppc64/src/entry.s |
---|
0,0 → 1,48 |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.section .init, "ax" |
.org 0 |
.globl __entry |
.globl __entry_driver |
## User-space task entry point |
# |
# |
__entry: |
bl __main |
bl __io_init |
bl main |
bl __exit |
__entry_driver: |
bl __main |
bl main |
bl __exit |
/tags/0.2.0/uspace/libc/arch/ppc64/src/thread_entry.s |
---|
0,0 → 1,39 |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.globl __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
__thread_entry: |
b __thread_main |
.end __thread_entry |
/tags/0.2.0/uspace/libc/arch/ppc64/src/psthread.S |
---|
0,0 → 1,110 |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.global context_save |
.global context_restore |
#include <libarch/regname.h> |
#include <libarch/context_offset.h> |
.macro CONTEXT_STORE r |
stw sp, OFFSET_SP(\r) |
stw r2, OFFSET_R2(\r) |
stw r13, OFFSET_R13(\r) |
stw r14, OFFSET_R14(\r) |
stw r15, OFFSET_R15(\r) |
stw r16, OFFSET_R16(\r) |
stw r17, OFFSET_R17(\r) |
stw r18, OFFSET_R18(\r) |
stw r19, OFFSET_R19(\r) |
stw r20, OFFSET_R20(\r) |
stw r21, OFFSET_R21(\r) |
stw r22, OFFSET_R22(\r) |
stw r23, OFFSET_R23(\r) |
stw r24, OFFSET_R24(\r) |
stw r25, OFFSET_R25(\r) |
stw r26, OFFSET_R26(\r) |
stw r27, OFFSET_R27(\r) |
stw r28, OFFSET_R28(\r) |
stw r29, OFFSET_R29(\r) |
stw r30, OFFSET_R30(\r) |
stw r31, OFFSET_R31(\r) |
.endm |
.macro CONTEXT_LOAD r |
lwz sp, OFFSET_SP(\r) |
lwz r2, OFFSET_R2(\r) |
lwz r13, OFFSET_R13(\r) |
lwz r14, OFFSET_R14(\r) |
lwz r15, OFFSET_R15(\r) |
lwz r16, OFFSET_R16(\r) |
lwz r17, OFFSET_R17(\r) |
lwz r18, OFFSET_R18(\r) |
lwz r19, OFFSET_R19(\r) |
lwz r20, OFFSET_R20(\r) |
lwz r21, OFFSET_R21(\r) |
lwz r22, OFFSET_R22(\r) |
lwz r23, OFFSET_R23(\r) |
lwz r24, OFFSET_R24(\r) |
lwz r25, OFFSET_R25(\r) |
lwz r26, OFFSET_R26(\r) |
lwz r27, OFFSET_R27(\r) |
lwz r28, OFFSET_R28(\r) |
lwz r29, OFFSET_R29(\r) |
lwz r30, OFFSET_R30(\r) |
lwz r31, OFFSET_R31(\r) |
.endm |
context_save: |
CONTEXT_STORE r3 |
mflr r4 |
stw r4, OFFSET_PC(r3) |
mfcr r4 |
stw r4, OFFSET_CR(r3) |
# context_save returns 1 |
li r3, 1 |
blr |
context_restore: |
CONTEXT_LOAD r3 |
lwz r4, OFFSET_CR(r3) |
mtcr r4 |
lwz r4, OFFSET_PC(r3) |
mtlr r4 |
# context_restore returns 0 |
li r3, 0 |
blr |
/tags/0.2.0/uspace/libc/arch/ppc64/_link.ld.in |
---|
0,0 → 1,49 |
STARTUP(../libc/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x1000; |
.init ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.init); |
} :text |
.text : { |
*(.text); |
*(.toc); |
*(.rodata*); |
} :text |
.data ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.opd); |
*(.data*); |
*(.sdata); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
.bss : { |
*(.sbss); |
*(COMMON); |
*(.bss); |
} :data |
. = ALIGN(0x1000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.2.0/uspace/libc/arch/ppc64/Makefile.inc |
---|
0,0 → 1,41 |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Toolchain configuration |
# |
TARGET = ppc64-linux-gnu |
TOOLCHAIN_DIR = /usr/local/ppc64/bin |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ |
arch/$(ARCH)/src/psthread.S \ |
arch/$(ARCH)/src/thread.c |
CFLAGS += -mcpu=powerpc64 -msoft-float -m64 |
AFLAGS += -a64 |
LFLAGS += -N |
/tags/0.2.0/uspace/libc/arch/ia32/include/psthread.h |
---|
0,0 → 1,67 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__ia32PSTHREAD_H__ |
#define __LIBC__ia32PSTHREAD_H__ |
#include <types.h> |
/* According to ABI the stack MUST be aligned on |
* 16-byte boundary. If it is not, the va_arg calling will |
* panic sooner or later |
*/ |
#define SP_DELTA (12) |
/* We include only registers that must be preserved |
* during function call |
*/ |
typedef struct { |
uint32_t sp; |
uint32_t pc; |
uint32_t ebx; |
uint32_t esi; |
uint32_t edi; |
uint32_t ebp; |
uint32_t tls; |
} context_t; |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia32/include/atomic.h |
---|
0,0 → 1,81 |
/* |
* Copyright (C) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ia32_ATOMIC_H__ |
#define __ia32_ATOMIC_H__ |
static inline void atomic_inc(atomic_t *val) { |
__asm__ volatile ("lock incl %0\n" : "=m" (val->count)); |
} |
static inline void atomic_dec(atomic_t *val) { |
__asm__ volatile ("lock decl %0\n" : "=m" (val->count)); |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
long r; |
__asm__ volatile ( |
"movl $1, %0\n" |
"lock xaddl %0, %1\n" |
: "=r" (r), "=m" (val->count) |
); |
return r; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
long r; |
__asm__ volatile ( |
"movl $-1, %0\n" |
"lock xaddl %0, %1\n" |
: "=r" (r), "=m" (val->count) |
); |
return r; |
} |
#define atomic_preinc(val) (atomic_postinc(val)+1) |
#define atomic_predec(val) (atomic_postdec(val)-1) |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia32/include/endian.h |
---|
0,0 → 1,52 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ia32_ENDIAN_H__ |
#define __ia32_ENDIAN_H__ |
#ifndef __LIBC__ENDIAN_H__ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __LITTLE_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia32/include/stackarg.h |
---|
0,0 → 1,70 |
/* |
* Copyright (C) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Variable argument list manipulation macros |
* for architectures using stack to pass arguments. |
*/ |
#ifndef __LIBC_STACKARG_H__ |
#define __LIBC_STACKARG_H__ |
#include <types.h> |
/* dont allow to define it second time in stdarg.h */ |
#define __VARARGS_DEFINED |
typedef struct va_list { |
int pos; |
uint8_t *last; |
} va_list; |
#define va_start(ap, lst) \ |
(ap).pos = sizeof(lst); \ |
(ap).last = (uint8_t *) &(lst) |
#define va_arg(ap, type) \ |
(*((type *)((ap).last + ((ap).pos += sizeof(type) ) - sizeof(type)))) |
#define va_end(ap) |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia32/include/limits.h |
---|
0,0 → 1,50 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ia32__LIMITS_H__ |
#define __ia32__LIMITS_H__ |
# define LONG_MIN MIN_INT32 |
# define LONG_MAX MAX_INT32 |
# define ULONG_MIN MIN_UINT32 |
# define ULONG_MAX MAX_UINT32 |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia32/include/types.h |
---|
0,0 → 1,59 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__TYPES_H__ |
#define __LIBC__TYPES_H__ |
typedef unsigned int sysarg_t; |
typedef unsigned int size_t; |
typedef signed int ssize_t; |
typedef ssize_t off_t; |
typedef char int8_t; |
typedef short int int16_t; |
typedef int int32_t; |
typedef long long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long long int uint64_t; |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia32/include/thread.h |
---|
0,0 → 1,64 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__ia32THREAD_H__ |
#define __LIBC__ia32THREAD_H__ |
#include <libc.h> |
typedef struct { |
void *self; |
void *pst_data; |
} tcb_t; |
static inline void __tcb_set(tcb_t *tcb) |
{ |
__SYSCALL1(SYS_TLS_SET, (sysarg_t) tcb); |
} |
static inline tcb_t * __tcb_get(void) |
{ |
void * retval; |
__asm__ ("movl %%gs:0, %0" : "=r"(retval)); |
return retval; |
} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia32/src/syscall.c |
---|
0,0 → 1,60 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcia32 ia32 |
* @brief ia32 architecture dependent parts of libc |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#include <thread.h> |
#include <libc.h> |
sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, const sysarg_t p3, |
const sysarg_t p4, const syscall_t id) |
{ |
sysarg_t ret; |
asm volatile ( |
"int $0x30\n" |
: "=a" (ret) |
: "a" (p1), |
"c" (p2), |
"d" (p3), |
"S" (p4), |
"D" (id) |
); |
return ret; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/arch/ia32/src/psthread.S |
---|
0,0 → 1,84 |
# |
# Copyright (C) 2001-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.global context_save |
.global context_restore |
## Save current CPU context |
# |
# Save CPU context to the context_t variable |
# pointed by the 1st argument. Returns 1 in EAX. |
# |
context_save: |
movl 0(%esp),%eax # the caller's return %eip |
movl 4(%esp),%edx # address of the kernel_context variable to save context to |
movl %esp,0(%edx) # %esp -> ctx->sp |
movl %eax,4(%edx) # %eip -> ctx->pc |
movl %ebx,8(%edx) # %ebx -> ctx->ebx |
movl %esi,12(%edx) # %esi -> ctx->esi |
movl %edi,16(%edx) # %edi -> ctx->edi |
movl %ebp,20(%edx) # %ebp -> ctx->ebp |
# Save TLS |
movl %gs:0, %eax |
movl %eax, 24(%edx) # tls -> ctx->tls |
xorl %eax,%eax # context_save returns 1 |
incl %eax |
ret |
## Restore saved CPU context |
# |
# Restore CPU context from context_t variable |
# pointed by the 1st argument. Returns 0 in EAX. |
# |
context_restore: |
movl 4(%esp),%eax # address of the kernel_context variable to restore context from |
movl 0(%eax),%esp # ctx->sp -> %esp |
movl 4(%eax),%edx # ctx->pc -> %edx |
movl 8(%eax),%ebx # ctx->ebx -> %ebx |
movl 12(%eax),%esi # ctx->esi -> %esi |
movl 16(%eax),%edi # ctx->edi -> %edi |
movl 20(%eax),%ebp # ctx->ebp -> %ebp |
movl %edx,0(%esp) # ctx->pc -> saver's return %eip |
# Set thread local storage |
pushl %edi |
movl 24(%eax), %eax # Set arg1 to TLS addr |
movl $1, %edi # Syscall 1 |
int $0x30 |
popl %edi |
xorl %eax,%eax # context_restore returns 0 |
ret |
/tags/0.2.0/uspace/libc/arch/ia32/src/entry.s |
---|
0,0 → 1,60 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.section .init, "ax" |
.org 0 |
.globl __entry |
.globl __entry_driver |
## User-space task entry point |
# |
# |
__entry: |
mov %ss, %ax |
mov %ax, %ds |
mov %ax, %es |
mov %ax, %fs |
# Do not set %gs, it contains descriptor that can see TLS |
call __main |
call __io_init |
call main |
call __exit |
__entry_driver: |
mov %ss, %ax |
mov %ax, %ds |
mov %ax, %es |
mov %ax, %fs |
# Do not set %gs, it contains descriptor that can see TLS |
call __main |
call main |
call __exit |
/tags/0.2.0/uspace/libc/arch/ia32/src/thread.c |
---|
0,0 → 1,0 |
link ../../amd64/src/thread.c |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/libc/arch/ia32/src/thread_entry.s |
---|
0,0 → 1,53 |
# |
# Copyright (C) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
.text |
.globl __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
__thread_entry: |
mov %ss, %dx |
mov %dx, %ds |
mov %dx, %es |
mov %dx, %fs |
# Do not set %gs, it contains descriptor that can see TLS |
# |
# EAX contains address of uarg. |
# |
pushl %eax |
call __thread_main |
# |
# Not reached. |
# |
.end __thread_entry |
/tags/0.2.0/uspace/libc/arch/ia32/Makefile.inc |
---|
0,0 → 1,42 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Toolchain configuration |
# |
TARGET = i686-pc-linux-gnu |
TOOLCHAIN_DIR = /usr/local/i686/bin |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ |
arch/$(ARCH)/src/psthread.S \ |
arch/$(ARCH)/src/thread.c |
LFLAGS += -N |
BFD_NAME = elf32-i386 |
BFD_ARCH = i386 |
/tags/0.2.0/uspace/libc/arch/ia32/_link.ld.in |
---|
0,0 → 1,45 |
STARTUP(../libc/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x1000; |
.init ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.init); |
} :text |
.text : { |
*(.text); |
*(.rodata*); |
} :text |
.data ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.data); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
.bss : { |
*(COMMON); |
*(.bss); |
} :data |
. = ALIGN(0x1000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.2.0/uspace/libc/malloc/malloc.c |
---|
0,0 → 1,4426 |
/* |
This is a version (aka dlmalloc) of malloc/free/realloc written by |
Doug Lea and released to the public domain, as explained at |
http://creativecommons.org/licenses/publicdomain. Send questions, |
comments, complaints, performance data, etc to dl@cs.oswego.edu |
* Version 2.8.3 Thu Sep 22 11:16:15 2005 Doug Lea (dl at gee) |
Note: There may be an updated version of this malloc obtainable at |
ftp://gee.cs.oswego.edu/pub/misc/malloc.c |
Check before installing! |
* Quickstart |
This library is all in one file to simplify the most common usage: |
ftp it, compile it (-O3), and link it into another program. All of |
the compile-time options default to reasonable values for use on |
most platforms. You might later want to step through various |
compile-time and dynamic tuning options. |
For convenience, an include file for code using this malloc is at: |
ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h |
You don't really need this .h file unless you call functions not |
defined in your system include files. The .h file contains only the |
excerpts from this file needed for using this malloc on ANSI C/C++ |
systems, so long as you haven't changed compile-time options about |
naming and tuning parameters. If you do, then you can create your |
own malloc.h that does include all settings by cutting at the point |
indicated below. Note that you may already by default be using a C |
library containing a malloc that is based on some version of this |
malloc (for example in linux). You might still want to use the one |
in this file to customize settings or to avoid overheads associated |
with library versions. |
* Vital statistics: |
Supported pointer/size_t representation: 4 or 8 bytes |
size_t MUST be an unsigned type of the same width as |
pointers. (If you are using an ancient system that declares |
size_t as a signed type, or need it to be a different width |
than pointers, you can use a previous release of this malloc |
(e.g. 2.7.2) supporting these.) |
Alignment: 8 bytes (default) |
This suffices for nearly all current machines and C compilers. |
However, you can define MALLOC_ALIGNMENT to be wider than this |
if necessary (up to 128bytes), at the expense of using more space. |
Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes) |
8 or 16 bytes (if 8byte sizes) |
Each malloced chunk has a hidden word of overhead holding size |
and status information, and additional cross-check word |
if FOOTERS is defined. |
Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead) |
8-byte ptrs: 32 bytes (including overhead) |
Even a request for zero bytes (i.e., malloc(0)) returns a |
pointer to something of the minimum allocatable size. |
The maximum overhead wastage (i.e., number of extra bytes |
allocated than were requested in malloc) is less than or equal |
to the minimum size, except for requests >= mmap_threshold that |
are serviced via mmap(), where the worst case wastage is about |
32 bytes plus the remainder from a system page (the minimal |
mmap unit); typically 4096 or 8192 bytes. |
Security: static-safe; optionally more or less |
The "security" of malloc refers to the ability of malicious |
code to accentuate the effects of errors (for example, freeing |
space that is not currently malloc'ed or overwriting past the |
ends of chunks) in code that calls malloc. This malloc |
guarantees not to modify any memory locations below the base of |
heap, i.e., static variables, even in the presence of usage |
errors. The routines additionally detect most improper frees |
and reallocs. All this holds as long as the static bookkeeping |
for malloc itself is not corrupted by some other means. This |
is only one aspect of security -- these checks do not, and |
cannot, detect all possible programming errors. |
If FOOTERS is defined nonzero, then each allocated chunk |
carries an additional check word to verify that it was malloced |
from its space. These check words are the same within each |
execution of a program using malloc, but differ across |
executions, so externally crafted fake chunks cannot be |
freed. This improves security by rejecting frees/reallocs that |
could corrupt heap memory, in addition to the checks preventing |
writes to statics that are always on. This may further improve |
security at the expense of time and space overhead. (Note that |
FOOTERS may also be worth using with MSPACES.) |
By default detected errors cause the program to abort (calling |
"abort()"). You can override this to instead proceed past |
errors by defining PROCEED_ON_ERROR. In this case, a bad free |
has no effect, and a malloc that encounters a bad address |
caused by user overwrites will ignore the bad address by |
dropping pointers and indices to all known memory. This may |
be appropriate for programs that should continue if at all |
possible in the face of programming errors, although they may |
run out of memory because dropped memory is never reclaimed. |
If you don't like either of these options, you can define |
CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything |
else. And if if you are sure that your program using malloc has |
no errors or vulnerabilities, you can define INSECURE to 1, |
which might (or might not) provide a small performance improvement. |
Thread-safety: NOT thread-safe unless USE_LOCKS defined |
When USE_LOCKS is defined, each public call to malloc, free, |
etc is surrounded with either a pthread mutex or a win32 |
spinlock (depending on WIN32). This is not especially fast, and |
can be a major bottleneck. It is designed only to provide |
minimal protection in concurrent environments, and to provide a |
basis for extensions. If you are using malloc in a concurrent |
program, consider instead using ptmalloc, which is derived from |
a version of this malloc. (See http://www.malloc.de). |
System requirements: Any combination of MORECORE and/or MMAP/MUNMAP |
This malloc can use unix sbrk or any emulation (invoked using |
the CALL_MORECORE macro) and/or mmap/munmap or any emulation |
(invoked using CALL_MMAP/CALL_MUNMAP) to get and release system |
memory. On most unix systems, it tends to work best if both |
MORECORE and MMAP are enabled. On Win32, it uses emulations |
based on VirtualAlloc. It also uses common C library functions |
like memset. |
Compliance: I believe it is compliant with the Single Unix Specification |
(See http://www.unix.org). Also SVID/XPG, ANSI C, and probably |
others as well. |
* Overview of algorithms |
This is not the fastest, most space-conserving, most portable, or |
most tunable malloc ever written. However it is among the fastest |
while also being among the most space-conserving, portable and |
tunable. Consistent balance across these factors results in a good |
general-purpose allocator for malloc-intensive programs. |
In most ways, this malloc is a best-fit allocator. Generally, it |
chooses the best-fitting existing chunk for a request, with ties |
broken in approximately least-recently-used order. (This strategy |
normally maintains low fragmentation.) However, for requests less |
than 256bytes, it deviates from best-fit when there is not an |
exactly fitting available chunk by preferring to use space adjacent |
to that used for the previous small request, as well as by breaking |
ties in approximately most-recently-used order. (These enhance |
locality of series of small allocations.) And for very large requests |
(>= 256Kb by default), it relies on system memory mapping |
facilities, if supported. (This helps avoid carrying around and |
possibly fragmenting memory used only for large chunks.) |
All operations (except malloc_stats and mallinfo) have execution |
times that are bounded by a constant factor of the number of bits in |
a size_t, not counting any clearing in calloc or copying in realloc, |
or actions surrounding MORECORE and MMAP that have times |
proportional to the number of non-contiguous regions returned by |
system allocation routines, which is often just 1. |
The implementation is not very modular and seriously overuses |
macros. Perhaps someday all C compilers will do as good a job |
inlining modular code as can now be done by brute-force expansion, |
but now, enough of them seem not to. |
Some compilers issue a lot of warnings about code that is |
dead/unreachable only on some platforms, and also about intentional |
uses of negation on unsigned types. All known cases of each can be |
ignored. |
For a longer but out of date high-level description, see |
http://gee.cs.oswego.edu/dl/html/malloc.html |
* MSPACES |
If MSPACES is defined, then in addition to malloc, free, etc., |
this file also defines mspace_malloc, mspace_free, etc. These |
are versions of malloc routines that take an "mspace" argument |
obtained using create_mspace, to control all internal bookkeeping. |
If ONLY_MSPACES is defined, only these versions are compiled. |
So if you would like to use this allocator for only some allocations, |
and your system malloc for others, you can compile with |
ONLY_MSPACES and then do something like... |
static mspace mymspace = create_mspace(0,0); // for example |
#define mymalloc(bytes) mspace_malloc(mymspace, bytes) |
(Note: If you only need one instance of an mspace, you can instead |
use "USE_DL_PREFIX" to relabel the global malloc.) |
You can similarly create thread-local allocators by storing |
mspaces as thread-locals. For example: |
static __thread mspace tlms = 0; |
void* tlmalloc(size_t bytes) { |
if (tlms == 0) tlms = create_mspace(0, 0); |
return mspace_malloc(tlms, bytes); |
} |
void tlfree(void* mem) { mspace_free(tlms, mem); } |
Unless FOOTERS is defined, each mspace is completely independent. |
You cannot allocate from one and free to another (although |
conformance is only weakly checked, so usage errors are not always |
caught). If FOOTERS is defined, then each chunk carries around a tag |
indicating its originating mspace, and frees are directed to their |
originating spaces. |
------------------------- Compile-time options --------------------------- |
Be careful in setting #define values for numerical constants of type |
size_t. On some systems, literal values are not automatically extended |
to size_t precision unless they are explicitly casted. |
WIN32 default: defined if _WIN32 defined |
Defining WIN32 sets up defaults for MS environment and compilers. |
Otherwise defaults are for unix. |
MALLOC_ALIGNMENT default: (size_t)8 |
Controls the minimum alignment for malloc'ed chunks. It must be a |
power of two and at least 8, even on machines for which smaller |
alignments would suffice. It may be defined as larger than this |
though. Note however that code and data structures are optimized for |
the case of 8-byte alignment. |
MSPACES default: 0 (false) |
If true, compile in support for independent allocation spaces. |
This is only supported if HAVE_MMAP is true. |
ONLY_MSPACES default: 0 (false) |
If true, only compile in mspace versions, not regular versions. |
USE_LOCKS default: 0 (false) |
Causes each call to each public routine to be surrounded with |
pthread or WIN32 mutex lock/unlock. (If set true, this can be |
overridden on a per-mspace basis for mspace versions.) |
FOOTERS default: 0 |
If true, provide extra checking and dispatching by placing |
information in the footers of allocated chunks. This adds |
space and time overhead. |
INSECURE default: 0 |
If true, omit checks for usage errors and heap space overwrites. |
USE_DL_PREFIX default: NOT defined |
Causes compiler to prefix all public routines with the string 'dl'. |
This can be useful when you only want to use this malloc in one part |
of a program, using your regular system malloc elsewhere. |
ABORT default: defined as abort() |
Defines how to abort on failed checks. On most systems, a failed |
check cannot die with an "assert" or even print an informative |
message, because the underlying print routines in turn call malloc, |
which will fail again. Generally, the best policy is to simply call |
abort(). It's not very useful to do more than this because many |
errors due to overwriting will show up as address faults (null, odd |
addresses etc) rather than malloc-triggered checks, so will also |
abort. Also, most compilers know that abort() does not return, so |
can better optimize code conditionally calling it. |
PROCEED_ON_ERROR default: defined as 0 (false) |
Controls whether detected bad addresses cause them to bypassed |
rather than aborting. If set, detected bad arguments to free and |
realloc are ignored. And all bookkeeping information is zeroed out |
upon a detected overwrite of freed heap space, thus losing the |
ability to ever return it from malloc again, but enabling the |
application to proceed. If PROCEED_ON_ERROR is defined, the |
static variable malloc_corruption_error_count is compiled in |
and can be examined to see if errors have occurred. This option |
generates slower code than the default abort policy. |
DEBUG default: NOT defined |
The DEBUG setting is mainly intended for people trying to modify |
this code or diagnose problems when porting to new platforms. |
However, it may also be able to better isolate user errors than just |
using runtime checks. The assertions in the check routines spell |
out in more detail the assumptions and invariants underlying the |
algorithms. The checking is fairly extensive, and will slow down |
execution noticeably. Calling malloc_stats or mallinfo with DEBUG |
set will attempt to check every non-mmapped allocated and free chunk |
in the course of computing the summaries. |
ABORT_ON_ASSERT_FAILURE default: defined as 1 (true) |
Debugging assertion failures can be nearly impossible if your |
version of the assert macro causes malloc to be called, which will |
lead to a cascade of further failures, blowing the runtime stack. |
ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(), |
which will usually make debugging easier. |
MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32 |
The action to take before "return 0" when malloc fails to be able to |
return memory because there is none available. |
HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES |
True if this system supports sbrk or an emulation of it. |
MORECORE default: sbrk |
The name of the sbrk-style system routine to call to obtain more |
memory. See below for guidance on writing custom MORECORE |
functions. The type of the argument to sbrk/MORECORE varies across |
systems. It cannot be size_t, because it supports negative |
arguments, so it is normally the signed type of the same width as |
size_t (sometimes declared as "intptr_t"). It doesn't much matter |
though. Internally, we only call it with arguments less than half |
the max value of a size_t, which should work across all reasonable |
possibilities, although sometimes generating compiler warnings. See |
near the end of this file for guidelines for creating a custom |
version of MORECORE. |
MORECORE_CONTIGUOUS default: 1 (true) |
If true, take advantage of fact that consecutive calls to MORECORE |
with positive arguments always return contiguous increasing |
addresses. This is true of unix sbrk. It does not hurt too much to |
set it true anyway, since malloc copes with non-contiguities. |
Setting it false when definitely non-contiguous saves time |
and possibly wasted space it would take to discover this though. |
MORECORE_CANNOT_TRIM default: NOT defined |
True if MORECORE cannot release space back to the system when given |
negative arguments. This is generally necessary only if you are |
using a hand-crafted MORECORE function that cannot handle negative |
arguments. |
HAVE_MMAP default: 1 (true) |
True if this system supports mmap or an emulation of it. If so, and |
HAVE_MORECORE is not true, MMAP is used for all system |
allocation. If set and HAVE_MORECORE is true as well, MMAP is |
primarily used to directly allocate very large blocks. It is also |
used as a backup strategy in cases where MORECORE fails to provide |
space from system. Note: A single call to MUNMAP is assumed to be |
able to unmap memory that may have be allocated using multiple calls |
to MMAP, so long as they are adjacent. |
HAVE_MREMAP default: 1 on linux, else 0 |
If true realloc() uses mremap() to re-allocate large blocks and |
extend or shrink allocation spaces. |
MMAP_CLEARS default: 1 on unix |
True if mmap clears memory so calloc doesn't need to. This is true |
for standard unix mmap using /dev/zero. |
USE_BUILTIN_FFS default: 0 (i.e., not used) |
Causes malloc to use the builtin ffs() function to compute indices. |
Some compilers may recognize and intrinsify ffs to be faster than the |
supplied C version. Also, the case of x86 using gcc is special-cased |
to an asm instruction, so is already as fast as it can be, and so |
this setting has no effect. (On most x86s, the asm version is only |
slightly faster than the C version.) |
malloc_getpagesize default: derive from system includes, or 4096. |
The system page size. To the extent possible, this malloc manages |
memory from the system in page-size units. This may be (and |
usually is) a function rather than a constant. This is ignored |
if WIN32, where page size is determined using getSystemInfo during |
initialization. |
USE_DEV_RANDOM default: 0 (i.e., not used) |
Causes malloc to use /dev/random to initialize secure magic seed for |
stamping footers. Otherwise, the current time is used. |
NO_MALLINFO default: 0 |
If defined, don't compile "mallinfo". This can be a simple way |
of dealing with mismatches between system declarations and |
those in this file. |
MALLINFO_FIELD_TYPE default: size_t |
The type of the fields in the mallinfo struct. This was originally |
defined as "int" in SVID etc, but is more usefully defined as |
size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set |
REALLOC_ZERO_BYTES_FREES default: not defined |
This should be set if a call to realloc with zero bytes should |
be the same as a call to free. Some people think it should. Otherwise, |
since this malloc returns a unique pointer for malloc(0), so does |
realloc(p, 0). |
LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H |
LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H |
LACKS_STDLIB_H default: NOT defined unless on WIN32 |
Define these if your system does not have these header files. |
You might need to manually insert some of the declarations they provide. |
DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS, |
system_info.dwAllocationGranularity in WIN32, |
otherwise 64K. |
Also settable using mallopt(M_GRANULARITY, x) |
The unit for allocating and deallocating memory from the system. On |
most systems with contiguous MORECORE, there is no reason to |
make this more than a page. However, systems with MMAP tend to |
either require or encourage larger granularities. You can increase |
this value to prevent system allocation functions to be called so |
often, especially if they are slow. The value must be at least one |
page and must be a power of two. Setting to 0 causes initialization |
to either page size or win32 region size. (Note: In previous |
versions of malloc, the equivalent of this option was called |
"TOP_PAD") |
DEFAULT_TRIM_THRESHOLD default: 2MB |
Also settable using mallopt(M_TRIM_THRESHOLD, x) |
The maximum amount of unused top-most memory to keep before |
releasing via malloc_trim in free(). Automatic trimming is mainly |
useful in long-lived programs using contiguous MORECORE. Because |
trimming via sbrk can be slow on some systems, and can sometimes be |
wasteful (in cases where programs immediately afterward allocate |
more large chunks) the value should be high enough so that your |
overall system performance would improve by releasing this much |
memory. As a rough guide, you might set to a value close to the |
average size of a process (program) running on your system. |
Releasing this much memory would allow such a process to run in |
memory. Generally, it is worth tuning trim thresholds when a |
program undergoes phases where several large chunks are allocated |
and released in ways that can reuse each other's storage, perhaps |
mixed with phases where there are no such chunks at all. The trim |
value must be greater than page size to have any useful effect. To |
disable trimming completely, you can set to MAX_SIZE_T. Note that the trick |
some people use of mallocing a huge space and then freeing it at |
program startup, in an attempt to reserve system memory, doesn't |
have the intended effect under automatic trimming, since that memory |
will immediately be returned to the system. |
DEFAULT_MMAP_THRESHOLD default: 256K |
Also settable using mallopt(M_MMAP_THRESHOLD, x) |
The request size threshold for using MMAP to directly service a |
request. Requests of at least this size that cannot be allocated |
using already-existing space will be serviced via mmap. (If enough |
normal freed space already exists it is used instead.) Using mmap |
segregates relatively large chunks of memory so that they can be |
individually obtained and released from the host system. A request |
serviced through mmap is never reused by any other request (at least |
not directly; the system may just so happen to remap successive |
requests to the same locations). Segregating space in this way has |
the benefits that: Mmapped space can always be individually released |
back to the system, which helps keep the system level memory demands |
of a long-lived program low. Also, mapped memory doesn't become |
`locked' between other chunks, as can happen with normally allocated |
chunks, which means that even trimming via malloc_trim would not |
release them. However, it has the disadvantage that the space |
cannot be reclaimed, consolidated, and then used to service later |
requests, as happens with normal chunks. The advantages of mmap |
nearly always outweigh disadvantages for "large" chunks, but the |
value of "large" may vary across systems. The default is an |
empirically derived value that works well in most systems. You can |
disable mmap by setting to MAX_SIZE_T. |
*/ |
/** @addtogroup libcmalloc malloc |
* @brief Malloc originally written by Doug Lea and ported to HelenOS. |
* @ingroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <sys/types.h> /* For size_t */ |
/** Non-default helenos customizations */ |
#define LACKS_FCNTL_H |
#define LACKS_SYS_MMAN_H |
#define LACKS_SYS_PARAM_H |
#undef HAVE_MMAP |
#define HAVE_MMAP 0 |
#define LACKS_ERRNO_H |
/* Set errno? */ |
#undef MALLOC_FAILURE_ACTION |
#define MALLOC_FAILURE_ACTION |
/* The maximum possible size_t value has all bits set */ |
#define MAX_SIZE_T (~(size_t)0) |
#define ONLY_MSPACES 0 |
#define MSPACES 0 |
#ifdef MALLOC_ALIGNMENT_16 |
#define MALLOC_ALIGNMENT ((size_t)16U) |
#else |
#define MALLOC_ALIGNMENT ((size_t)8U) |
#endif |
#define FOOTERS 0 |
#define ABORT abort() |
#define ABORT_ON_ASSERT_FAILURE 1 |
#define PROCEED_ON_ERROR 0 |
#define USE_LOCKS 1 |
#define INSECURE 0 |
#define HAVE_MMAP 0 |
#define MMAP_CLEARS 1 |
#define HAVE_MORECORE 1 |
#define MORECORE_CONTIGUOUS 1 |
#define MORECORE sbrk |
#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */ |
#ifndef DEFAULT_TRIM_THRESHOLD |
#ifndef MORECORE_CANNOT_TRIM |
#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) |
#else /* MORECORE_CANNOT_TRIM */ |
#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T |
#endif /* MORECORE_CANNOT_TRIM */ |
#endif /* DEFAULT_TRIM_THRESHOLD */ |
#ifndef DEFAULT_MMAP_THRESHOLD |
#if HAVE_MMAP |
#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U) |
#else /* HAVE_MMAP */ |
#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T |
#endif /* HAVE_MMAP */ |
#endif /* DEFAULT_MMAP_THRESHOLD */ |
#ifndef USE_BUILTIN_FFS |
#define USE_BUILTIN_FFS 0 |
#endif /* USE_BUILTIN_FFS */ |
#ifndef USE_DEV_RANDOM |
#define USE_DEV_RANDOM 0 |
#endif /* USE_DEV_RANDOM */ |
#ifndef NO_MALLINFO |
#define NO_MALLINFO 0 |
#endif /* NO_MALLINFO */ |
#ifndef MALLINFO_FIELD_TYPE |
#define MALLINFO_FIELD_TYPE size_t |
#endif /* MALLINFO_FIELD_TYPE */ |
/* |
mallopt tuning options. SVID/XPG defines four standard parameter |
numbers for mallopt, normally defined in malloc.h. None of these |
are used in this malloc, so setting them has no effect. But this |
malloc does support the following options. |
*/ |
#define M_TRIM_THRESHOLD (-1) |
#define M_GRANULARITY (-2) |
#define M_MMAP_THRESHOLD (-3) |
/* |
======================================================================== |
To make a fully customizable malloc.h header file, cut everything |
above this line, put into file malloc.h, edit to suit, and #include it |
on the next line, as well as in programs that use this malloc. |
======================================================================== |
*/ |
#include "malloc.h" |
/*------------------------------ internal #includes ---------------------- */ |
#include <stdio.h> /* for printing in malloc_stats */ |
#include <string.h> |
#ifndef LACKS_ERRNO_H |
#include <errno.h> /* for MALLOC_FAILURE_ACTION */ |
#endif /* LACKS_ERRNO_H */ |
#if FOOTERS |
#include <time.h> /* for magic initialization */ |
#endif /* FOOTERS */ |
#ifndef LACKS_STDLIB_H |
#include <stdlib.h> /* for abort() */ |
#endif /* LACKS_STDLIB_H */ |
#ifdef DEBUG |
#if ABORT_ON_ASSERT_FAILURE |
#define assert(x) {if(!(x)) {printf(#x);ABORT;}} |
#else /* ABORT_ON_ASSERT_FAILURE */ |
#include <assert.h> |
#endif /* ABORT_ON_ASSERT_FAILURE */ |
#else /* DEBUG */ |
#define assert(x) |
#endif /* DEBUG */ |
#if USE_BUILTIN_FFS |
#ifndef LACKS_STRINGS_H |
#include <strings.h> /* for ffs */ |
#endif /* LACKS_STRINGS_H */ |
#endif /* USE_BUILTIN_FFS */ |
#if HAVE_MMAP |
#ifndef LACKS_SYS_MMAN_H |
#include <sys/mman.h> /* for mmap */ |
#endif /* LACKS_SYS_MMAN_H */ |
#ifndef LACKS_FCNTL_H |
#include <fcntl.h> |
#endif /* LACKS_FCNTL_H */ |
#endif /* HAVE_MMAP */ |
#if HAVE_MORECORE |
#ifndef LACKS_UNISTD_H |
#include <unistd.h> /* for sbrk */ |
#else /* LACKS_UNISTD_H */ |
#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) |
extern void* sbrk(ptrdiff_t); |
#endif /* FreeBSD etc */ |
#endif /* LACKS_UNISTD_H */ |
#endif /* HAVE_MMAP */ |
#ifndef WIN32 |
#ifndef malloc_getpagesize |
# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ |
# ifndef _SC_PAGE_SIZE |
# define _SC_PAGE_SIZE _SC_PAGESIZE |
# endif |
# endif |
# ifdef _SC_PAGE_SIZE |
# define malloc_getpagesize sysconf(_SC_PAGE_SIZE) |
# else |
# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) |
extern size_t getpagesize(); |
# define malloc_getpagesize getpagesize() |
# else |
# ifdef WIN32 /* use supplied emulation of getpagesize */ |
# define malloc_getpagesize getpagesize() |
# else |
# ifndef LACKS_SYS_PARAM_H |
# include <sys/param.h> |
# endif |
# ifdef EXEC_PAGESIZE |
# define malloc_getpagesize EXEC_PAGESIZE |
# else |
# ifdef NBPG |
# ifndef CLSIZE |
# define malloc_getpagesize NBPG |
# else |
# define malloc_getpagesize (NBPG * CLSIZE) |
# endif |
# else |
# ifdef NBPC |
# define malloc_getpagesize NBPC |
# else |
# ifdef PAGESIZE |
# define malloc_getpagesize PAGESIZE |
# else /* just guess */ |
# define malloc_getpagesize ((size_t)4096U) |
# endif |
# endif |
# endif |
# endif |
# endif |
# endif |
# endif |
#endif |
#endif |
/* ------------------- size_t and alignment properties -------------------- */ |
/* The byte and bit size of a size_t */ |
#define SIZE_T_SIZE (sizeof(size_t)) |
#define SIZE_T_BITSIZE (sizeof(size_t) << 3) |
/* Some constants coerced to size_t */ |
/* Annoying but necessary to avoid errors on some plaftorms */ |
#define SIZE_T_ZERO ((size_t)0) |
#define SIZE_T_ONE ((size_t)1) |
#define SIZE_T_TWO ((size_t)2) |
#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) |
#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) |
#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) |
#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) |
/* The bit mask value corresponding to MALLOC_ALIGNMENT */ |
#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) |
/* True if address a has acceptable alignment */ |
#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0) |
/* the number of bytes to offset an address to align it */ |
#define align_offset(A)\ |
((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ |
((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) |
/* -------------------------- MMAP preliminaries ------------------------- */ |
/* |
If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and |
checks to fail so compiler optimizer can delete code rather than |
using so many "#if"s. |
*/ |
/* MORECORE and MMAP must return MFAIL on failure */ |
#define MFAIL ((void*)(MAX_SIZE_T)) |
#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */ |
#if !HAVE_MMAP |
#define IS_MMAPPED_BIT (SIZE_T_ZERO) |
#define USE_MMAP_BIT (SIZE_T_ZERO) |
#define CALL_MMAP(s) MFAIL |
#define CALL_MUNMAP(a, s) (-1) |
#define DIRECT_MMAP(s) MFAIL |
#else /* HAVE_MMAP */ |
#define IS_MMAPPED_BIT (SIZE_T_ONE) |
#define USE_MMAP_BIT (SIZE_T_ONE) |
#ifndef WIN32 |
#define CALL_MUNMAP(a, s) munmap((a), (s)) |
#define MMAP_PROT (PROT_READ|PROT_WRITE) |
#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) |
#define MAP_ANONYMOUS MAP_ANON |
#endif /* MAP_ANON */ |
#ifdef MAP_ANONYMOUS |
#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) |
#define CALL_MMAP(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0) |
#else /* MAP_ANONYMOUS */ |
/* |
Nearly all versions of mmap support MAP_ANONYMOUS, so the following |
is unlikely to be needed, but is supplied just in case. |
*/ |
#define MMAP_FLAGS (MAP_PRIVATE) |
static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ |
#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \ |
(dev_zero_fd = open("/dev/zero", O_RDWR), \ |
mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \ |
mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) |
#endif /* MAP_ANONYMOUS */ |
#define DIRECT_MMAP(s) CALL_MMAP(s) |
#else /* WIN32 */ |
/* Win32 MMAP via VirtualAlloc */ |
static void* win32mmap(size_t size) { |
void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); |
return (ptr != 0)? ptr: MFAIL; |
} |
/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ |
static void* win32direct_mmap(size_t size) { |
void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, |
PAGE_READWRITE); |
return (ptr != 0)? ptr: MFAIL; |
} |
/* This function supports releasing coalesed segments */ |
static int win32munmap(void* ptr, size_t size) { |
MEMORY_BASIC_INFORMATION minfo; |
char* cptr = ptr; |
while (size) { |
if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) |
return -1; |
if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || |
minfo.State != MEM_COMMIT || minfo.RegionSize > size) |
return -1; |
if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) |
return -1; |
cptr += minfo.RegionSize; |
size -= minfo.RegionSize; |
} |
return 0; |
} |
#define CALL_MMAP(s) win32mmap(s) |
#define CALL_MUNMAP(a, s) win32munmap((a), (s)) |
#define DIRECT_MMAP(s) win32direct_mmap(s) |
#endif /* WIN32 */ |
#endif /* HAVE_MMAP */ |
#if HAVE_MMAP && HAVE_MREMAP |
#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) |
#else /* HAVE_MMAP && HAVE_MREMAP */ |
#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL |
#endif /* HAVE_MMAP && HAVE_MREMAP */ |
#if HAVE_MORECORE |
#define CALL_MORECORE(S) MORECORE(S) |
#else /* HAVE_MORECORE */ |
#define CALL_MORECORE(S) MFAIL |
#endif /* HAVE_MORECORE */ |
/* mstate bit set if continguous morecore disabled or failed */ |
#define USE_NONCONTIGUOUS_BIT (4U) |
/* segment bit set in create_mspace_with_base */ |
#define EXTERN_BIT (8U) |
/* --------------------------- Lock preliminaries ------------------------ */ |
#if USE_LOCKS |
/* |
When locks are defined, there are up to two global locks: |
* If HAVE_MORECORE, morecore_mutex protects sequences of calls to |
MORECORE. In many cases sys_alloc requires two calls, that should |
not be interleaved with calls by other threads. This does not |
protect against direct calls to MORECORE by other threads not |
using this lock, so there is still code to cope the best we can on |
interference. |
* magic_init_mutex ensures that mparams.magic and other |
unique mparams values are initialized only once. |
*/ |
/* By default use posix locks */ |
#include <futex.h> |
#define MLOCK_T atomic_t |
#define INITIAL_LOCK(l) futex_initialize(l, 1) |
/* futex_down cannot fail, but can return different |
* retvals for OK |
*/ |
#define ACQUIRE_LOCK(l) ({futex_down(l);0;}) |
#define RELEASE_LOCK(l) futex_up(l) |
#if HAVE_MORECORE |
static MLOCK_T morecore_mutex = FUTEX_INITIALIZER; |
#endif /* HAVE_MORECORE */ |
static MLOCK_T magic_init_mutex = FUTEX_INITIALIZER; |
#define USE_LOCK_BIT (2U) |
#else /* USE_LOCKS */ |
#define USE_LOCK_BIT (0U) |
#define INITIAL_LOCK(l) |
#endif /* USE_LOCKS */ |
#if USE_LOCKS && HAVE_MORECORE |
#define ACQUIRE_MORECORE_LOCK() ACQUIRE_LOCK(&morecore_mutex); |
#define RELEASE_MORECORE_LOCK() RELEASE_LOCK(&morecore_mutex); |
#else /* USE_LOCKS && HAVE_MORECORE */ |
#define ACQUIRE_MORECORE_LOCK() |
#define RELEASE_MORECORE_LOCK() |
#endif /* USE_LOCKS && HAVE_MORECORE */ |
#if USE_LOCKS |
#define ACQUIRE_MAGIC_INIT_LOCK() ACQUIRE_LOCK(&magic_init_mutex); |
#define RELEASE_MAGIC_INIT_LOCK() RELEASE_LOCK(&magic_init_mutex); |
#else /* USE_LOCKS */ |
#define ACQUIRE_MAGIC_INIT_LOCK() |
#define RELEASE_MAGIC_INIT_LOCK() |
#endif /* USE_LOCKS */ |
/* ----------------------- Chunk representations ------------------------ */ |
/* |
(The following includes lightly edited explanations by Colin Plumb.) |
The malloc_chunk declaration below is misleading (but accurate and |
necessary). It declares a "view" into memory allowing access to |
necessary fields at known offsets from a given base. |
Chunks of memory are maintained using a `boundary tag' method as |
originally described by Knuth. (See the paper by Paul Wilson |
ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such |
techniques.) Sizes of free chunks are stored both in the front of |
each chunk and at the end. This makes consolidating fragmented |
chunks into bigger chunks fast. The head fields also hold bits |
representing whether chunks are free or in use. |
Here are some pictures to make it clearer. They are "exploded" to |
show that the state of a chunk can be thought of as extending from |
the high 31 bits of the head field of its header through the |
prev_foot and PINUSE_BIT bit of the following chunk header. |
A chunk that's in use looks like: |
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Size of previous chunk (if P = 1) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| |
| Size of this chunk 1| +-+ |
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | |
+- -+ |
| | |
+- -+ |
| : |
+- size - sizeof(size_t) available payload bytes -+ |
: | |
chunk-> +- -+ |
| | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1| |
| Size of next chunk (may or may not be in use) | +-+ |
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
And if it's free, it looks like this: |
chunk-> +- -+ |
| User payload (must be in use, or we would have merged!) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| |
| Size of this chunk 0| +-+ |
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Next pointer | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Prev pointer | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| : |
+- size - sizeof(struct chunk) unused bytes -+ |
: | |
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Size of this chunk | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| |
| Size of next chunk (must be in use, or we would have merged)| +-+ |
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| : |
+- User payload -+ |
: | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|0| |
+-+ |
Note that since we always merge adjacent free chunks, the chunks |
adjacent to a free chunk must be in use. |
Given a pointer to a chunk (which can be derived trivially from the |
payload pointer) we can, in O(1) time, find out whether the adjacent |
chunks are free, and if so, unlink them from the lists that they |
are on and merge them with the current chunk. |
Chunks always begin on even word boundaries, so the mem portion |
(which is returned to the user) is also on an even word boundary, and |
thus at least double-word aligned. |
The P (PINUSE_BIT) bit, stored in the unused low-order bit of the |
chunk size (which is always a multiple of two words), is an in-use |
bit for the *previous* chunk. If that bit is *clear*, then the |
word before the current chunk size contains the previous chunk |
size, and can be used to find the front of the previous chunk. |
The very first chunk allocated always has this bit set, preventing |
access to non-existent (or non-owned) memory. If pinuse is set for |
any given chunk, then you CANNOT determine the size of the |
previous chunk, and might even get a memory addressing fault when |
trying to do so. |
The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of |
the chunk size redundantly records whether the current chunk is |
inuse. This redundancy enables usage checks within free and realloc, |
and reduces indirection when freeing and consolidating chunks. |
Each freshly allocated chunk must have both cinuse and pinuse set. |
That is, each allocated chunk borders either a previously allocated |
and still in-use chunk, or the base of its memory arena. This is |
ensured by making all allocations from the the `lowest' part of any |
found chunk. Further, no free chunk physically borders another one, |
so each free chunk is known to be preceded and followed by either |
inuse chunks or the ends of memory. |
Note that the `foot' of the current chunk is actually represented |
as the prev_foot of the NEXT chunk. This makes it easier to |
deal with alignments etc but can be very confusing when trying |
to extend or adapt this code. |
The exceptions to all this are |
1. The special chunk `top' is the top-most available chunk (i.e., |
the one bordering the end of available memory). It is treated |
specially. Top is never included in any bin, is used only if |
no other chunk is available, and is released back to the |
system if it is very large (see M_TRIM_THRESHOLD). In effect, |
the top chunk is treated as larger (and thus less well |
fitting) than any other available chunk. The top chunk |
doesn't update its trailing size field since there is no next |
contiguous chunk that would have to index off it. However, |
space is still allocated for it (TOP_FOOT_SIZE) to enable |
separation or merging when space is extended. |
3. Chunks allocated via mmap, which have the lowest-order bit |
(IS_MMAPPED_BIT) set in their prev_foot fields, and do not set |
PINUSE_BIT in their head fields. Because they are allocated |
one-by-one, each must carry its own prev_foot field, which is |
also used to hold the offset this chunk has within its mmapped |
region, which is needed to preserve alignment. Each mmapped |
chunk is trailed by the first two fields of a fake next-chunk |
for sake of usage checks. |
*/ |
struct malloc_chunk { |
size_t prev_foot; /* Size of previous chunk (if free). */ |
size_t head; /* Size and inuse bits. */ |
struct malloc_chunk* fd; /* double links -- used only if free. */ |
struct malloc_chunk* bk; |
}; |
typedef struct malloc_chunk mchunk; |
typedef struct malloc_chunk* mchunkptr; |
typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ |
typedef unsigned int bindex_t; /* Described below */ |
typedef unsigned int binmap_t; /* Described below */ |
typedef unsigned int flag_t; /* The type of various bit flag sets */ |
/* ------------------- Chunks sizes and alignments ----------------------- */ |
#define MCHUNK_SIZE (sizeof(mchunk)) |
#if FOOTERS |
#define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) |
#else /* FOOTERS */ |
#define CHUNK_OVERHEAD (SIZE_T_SIZE) |
#endif /* FOOTERS */ |
/* MMapped chunks need a second word of overhead ... */ |
#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) |
/* ... and additional padding for fake next-chunk at foot */ |
#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) |
/* The smallest size we can malloc is an aligned minimal chunk */ |
#define MIN_CHUNK_SIZE\ |
((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) |
/* conversion from malloc headers to user pointers, and back */ |
#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) |
#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) |
/* chunk associated with aligned address A */ |
#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) |
/* Bounds on request (not chunk) sizes. */ |
#define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2) |
#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) |
/* pad request bytes into a usable size */ |
#define pad_request(req) \ |
(((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) |
/* pad request, checking for minimum (but not maximum) */ |
#define request2size(req) \ |
(((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) |
/* ------------------ Operations on head and foot fields ----------------- */ |
/* |
The head field of a chunk is or'ed with PINUSE_BIT when previous |
adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in |
use. If the chunk was obtained with mmap, the prev_foot field has |
IS_MMAPPED_BIT set, otherwise holding the offset of the base of the |
mmapped region to the base of the chunk. |
*/ |
#define PINUSE_BIT (SIZE_T_ONE) |
#define CINUSE_BIT (SIZE_T_TWO) |
#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) |
/* Head value for fenceposts */ |
#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) |
/* extraction of fields from head words */ |
#define cinuse(p) ((p)->head & CINUSE_BIT) |
#define pinuse(p) ((p)->head & PINUSE_BIT) |
#define chunksize(p) ((p)->head & ~(INUSE_BITS)) |
#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) |
#define clear_cinuse(p) ((p)->head &= ~CINUSE_BIT) |
/* Treat space at ptr +/- offset as a chunk */ |
#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) |
#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s))) |
/* Ptr to next or previous physical malloc_chunk. */ |
#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS))) |
#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) )) |
/* extract next chunk's pinuse bit */ |
#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) |
/* Get/set size at footer */ |
#define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot) |
#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s)) |
/* Set size, pinuse bit, and foot */ |
#define set_size_and_pinuse_of_free_chunk(p, s)\ |
((p)->head = (s|PINUSE_BIT), set_foot(p, s)) |
/* Set size, pinuse bit, foot, and clear next pinuse */ |
#define set_free_with_pinuse(p, s, n)\ |
(clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) |
#define is_mmapped(p)\ |
(!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT)) |
/* Get the internal overhead associated with chunk p */ |
#define overhead_for(p)\ |
(is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) |
/* Return true if malloced space is not necessarily cleared */ |
#if MMAP_CLEARS |
#define calloc_must_clear(p) (!is_mmapped(p)) |
#else /* MMAP_CLEARS */ |
#define calloc_must_clear(p) (1) |
#endif /* MMAP_CLEARS */ |
/* ---------------------- Overlaid data structures ----------------------- */ |
/* |
When chunks are not in use, they are treated as nodes of either |
lists or trees. |
"Small" chunks are stored in circular doubly-linked lists, and look |
like this: |
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Size of previous chunk | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
`head:' | Size of chunk, in bytes |P| |
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Forward pointer to next chunk in list | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Back pointer to previous chunk in list | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Unused space (may be 0 bytes long) . |
. . |
. | |
nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
`foot:' | Size of chunk, in bytes | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
Larger chunks are kept in a form of bitwise digital trees (aka |
tries) keyed on chunksizes. Because malloc_tree_chunks are only for |
free chunks greater than 256 bytes, their size doesn't impose any |
constraints on user chunk sizes. Each node looks like: |
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Size of previous chunk | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
`head:' | Size of chunk, in bytes |P| |
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Forward pointer to next chunk of same size | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Back pointer to previous chunk of same size | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Pointer to left child (child[0]) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Pointer to right child (child[1]) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Pointer to parent | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| bin index of this chunk | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Unused space . |
. | |
nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
`foot:' | Size of chunk, in bytes | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
Each tree holding treenodes is a tree of unique chunk sizes. Chunks |
of the same size are arranged in a circularly-linked list, with only |
the oldest chunk (the next to be used, in our FIFO ordering) |
actually in the tree. (Tree members are distinguished by a non-null |
parent pointer.) If a chunk with the same size an an existing node |
is inserted, it is linked off the existing node using pointers that |
work in the same way as fd/bk pointers of small chunks. |
Each tree contains a power of 2 sized range of chunk sizes (the |
smallest is 0x100 <= x < 0x180), which is is divided in half at each |
tree level, with the chunks in the smaller half of the range (0x100 |
<= x < 0x140 for the top nose) in the left subtree and the larger |
half (0x140 <= x < 0x180) in the right subtree. This is, of course, |
done by inspecting individual bits. |
Using these rules, each node's left subtree contains all smaller |
sizes than its right subtree. However, the node at the root of each |
subtree has no particular ordering relationship to either. (The |
dividing line between the subtree sizes is based on trie relation.) |
If we remove the last chunk of a given size from the interior of the |
tree, we need to replace it with a leaf node. The tree ordering |
rules permit a node to be replaced by any leaf below it. |
The smallest chunk in a tree (a common operation in a best-fit |
allocator) can be found by walking a path to the leftmost leaf in |
the tree. Unlike a usual binary tree, where we follow left child |
pointers until we reach a null, here we follow the right child |
pointer any time the left one is null, until we reach a leaf with |
both child pointers null. The smallest chunk in the tree will be |
somewhere along that path. |
The worst case number of steps to add, find, or remove a node is |
bounded by the number of bits differentiating chunks within |
bins. Under current bin calculations, this ranges from 6 up to 21 |
(for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case |
is of course much better. |
*/ |
struct malloc_tree_chunk { |
/* The first four fields must be compatible with malloc_chunk */ |
size_t prev_foot; |
size_t head; |
struct malloc_tree_chunk* fd; |
struct malloc_tree_chunk* bk; |
struct malloc_tree_chunk* child[2]; |
struct malloc_tree_chunk* parent; |
bindex_t index; |
}; |
typedef struct malloc_tree_chunk tchunk; |
typedef struct malloc_tree_chunk* tchunkptr; |
typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */ |
/* A little helper macro for trees */ |
#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) |
/* ----------------------------- Segments -------------------------------- */ |
/* |
Each malloc space may include non-contiguous segments, held in a |
list headed by an embedded malloc_segment record representing the |
top-most space. Segments also include flags holding properties of |
the space. Large chunks that are directly allocated by mmap are not |
included in this list. They are instead independently created and |
destroyed without otherwise keeping track of them. |
Segment management mainly comes into play for spaces allocated by |
MMAP. Any call to MMAP might or might not return memory that is |
adjacent to an existing segment. MORECORE normally contiguously |
extends the current space, so this space is almost always adjacent, |
which is simpler and faster to deal with. (This is why MORECORE is |
used preferentially to MMAP when both are available -- see |
sys_alloc.) When allocating using MMAP, we don't use any of the |
hinting mechanisms (inconsistently) supported in various |
implementations of unix mmap, or distinguish reserving from |
committing memory. Instead, we just ask for space, and exploit |
contiguity when we get it. It is probably possible to do |
better than this on some systems, but no general scheme seems |
to be significantly better. |
Management entails a simpler variant of the consolidation scheme |
used for chunks to reduce fragmentation -- new adjacent memory is |
normally prepended or appended to an existing segment. However, |
there are limitations compared to chunk consolidation that mostly |
reflect the fact that segment processing is relatively infrequent |
(occurring only when getting memory from system) and that we |
don't expect to have huge numbers of segments: |
* Segments are not indexed, so traversal requires linear scans. (It |
would be possible to index these, but is not worth the extra |
overhead and complexity for most programs on most platforms.) |
* New segments are only appended to old ones when holding top-most |
memory; if they cannot be prepended to others, they are held in |
different segments. |
Except for the top-most segment of an mstate, each segment record |
is kept at the tail of its segment. Segments are added by pushing |
segment records onto the list headed by &mstate.seg for the |
containing mstate. |
Segment flags control allocation/merge/deallocation policies: |
* If EXTERN_BIT set, then we did not allocate this segment, |
and so should not try to deallocate or merge with others. |
(This currently holds only for the initial segment passed |
into create_mspace_with_base.) |
* If IS_MMAPPED_BIT set, the segment may be merged with |
other surrounding mmapped segments and trimmed/de-allocated |
using munmap. |
* If neither bit is set, then the segment was obtained using |
MORECORE so can be merged with surrounding MORECORE'd segments |
and deallocated/trimmed using MORECORE with negative arguments. |
*/ |
struct malloc_segment { |
char* base; /* base address */ |
size_t size; /* allocated size */ |
struct malloc_segment* next; /* ptr to next segment */ |
flag_t sflags; /* mmap and extern flag */ |
}; |
#define is_mmapped_segment(S) ((S)->sflags & IS_MMAPPED_BIT) |
#define is_extern_segment(S) ((S)->sflags & EXTERN_BIT) |
typedef struct malloc_segment msegment; |
typedef struct malloc_segment* msegmentptr; |
/* ---------------------------- malloc_state ----------------------------- */ |
/* |
A malloc_state holds all of the bookkeeping for a space. |
The main fields are: |
Top |
The topmost chunk of the currently active segment. Its size is |
cached in topsize. The actual size of topmost space is |
topsize+TOP_FOOT_SIZE, which includes space reserved for adding |
fenceposts and segment records if necessary when getting more |
space from the system. The size at which to autotrim top is |
cached from mparams in trim_check, except that it is disabled if |
an autotrim fails. |
Designated victim (dv) |
This is the preferred chunk for servicing small requests that |
don't have exact fits. It is normally the chunk split off most |
recently to service another small request. Its size is cached in |
dvsize. The link fields of this chunk are not maintained since it |
is not kept in a bin. |
SmallBins |
An array of bin headers for free chunks. These bins hold chunks |
with sizes less than MIN_LARGE_SIZE bytes. Each bin contains |
chunks of all the same size, spaced 8 bytes apart. To simplify |
use in double-linked lists, each bin header acts as a malloc_chunk |
pointing to the real first node, if it exists (else pointing to |
itself). This avoids special-casing for headers. But to avoid |
waste, we allocate only the fd/bk pointers of bins, and then use |
repositioning tricks to treat these as the fields of a chunk. |
TreeBins |
Treebins are pointers to the roots of trees holding a range of |
sizes. There are 2 equally spaced treebins for each power of two |
from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything |
larger. |
Bin maps |
There is one bit map for small bins ("smallmap") and one for |
treebins ("treemap). Each bin sets its bit when non-empty, and |
clears the bit when empty. Bit operations are then used to avoid |
bin-by-bin searching -- nearly all "search" is done without ever |
looking at bins that won't be selected. The bit maps |
conservatively use 32 bits per map word, even if on 64bit system. |
For a good description of some of the bit-based techniques used |
here, see Henry S. Warren Jr's book "Hacker's Delight" (and |
supplement at http://hackersdelight.org/). Many of these are |
intended to reduce the branchiness of paths through malloc etc, as |
well as to reduce the number of memory locations read or written. |
Segments |
A list of segments headed by an embedded malloc_segment record |
representing the initial space. |
Address check support |
The least_addr field is the least address ever obtained from |
MORECORE or MMAP. Attempted frees and reallocs of any address less |
than this are trapped (unless INSECURE is defined). |
Magic tag |
A cross-check field that should always hold same value as mparams.magic. |
Flags |
Bits recording whether to use MMAP, locks, or contiguous MORECORE |
Statistics |
Each space keeps track of current and maximum system memory |
obtained via MORECORE or MMAP. |
Locking |
If USE_LOCKS is defined, the "mutex" lock is acquired and released |
around every public call using this mspace. |
*/ |
/* Bin types, widths and sizes */ |
#define NSMALLBINS (32U) |
#define NTREEBINS (32U) |
#define SMALLBIN_SHIFT (3U) |
#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) |
#define TREEBIN_SHIFT (8U) |
#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) |
#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) |
#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) |
struct malloc_state { |
binmap_t smallmap; |
binmap_t treemap; |
size_t dvsize; |
size_t topsize; |
char* least_addr; |
mchunkptr dv; |
mchunkptr top; |
size_t trim_check; |
size_t magic; |
mchunkptr smallbins[(NSMALLBINS+1)*2]; |
tbinptr treebins[NTREEBINS]; |
size_t footprint; |
size_t max_footprint; |
flag_t mflags; |
#if USE_LOCKS |
MLOCK_T mutex; /* locate lock among fields that rarely change */ |
#endif /* USE_LOCKS */ |
msegment seg; |
}; |
typedef struct malloc_state* mstate; |
/* ------------- Global malloc_state and malloc_params ------------------- */ |
/* |
malloc_params holds global properties, including those that can be |
dynamically set using mallopt. There is a single instance, mparams, |
initialized in init_mparams. |
*/ |
struct malloc_params { |
size_t magic; |
size_t page_size; |
size_t granularity; |
size_t mmap_threshold; |
size_t trim_threshold; |
flag_t default_mflags; |
}; |
static struct malloc_params mparams; |
/* The global malloc_state used for all non-"mspace" calls */ |
static struct malloc_state _gm_; |
#define gm (&_gm_) |
#define is_global(M) ((M) == &_gm_) |
#define is_initialized(M) ((M)->top != 0) |
/* -------------------------- system alloc setup ------------------------- */ |
/* Operations on mflags */ |
#define use_lock(M) ((M)->mflags & USE_LOCK_BIT) |
#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT) |
#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT) |
#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT) |
#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT) |
#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT) |
#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT) |
#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT) |
#define set_lock(M,L)\ |
((M)->mflags = (L)?\ |
((M)->mflags | USE_LOCK_BIT) :\ |
((M)->mflags & ~USE_LOCK_BIT)) |
/* page-align a size */ |
#define page_align(S)\ |
(((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE)) |
/* granularity-align a size */ |
#define granularity_align(S)\ |
(((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE)) |
#define is_page_aligned(S)\ |
(((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0) |
#define is_granularity_aligned(S)\ |
(((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0) |
/* True if segment S holds address A */ |
#define segment_holds(S, A)\ |
((char*)(A) >= S->base && (char*)(A) < S->base + S->size) |
/* Return segment holding given address */ |
static msegmentptr segment_holding(mstate m, char* addr) { |
msegmentptr sp = &m->seg; |
for (;;) { |
if (addr >= sp->base && addr < sp->base + sp->size) |
return sp; |
if ((sp = sp->next) == 0) |
return 0; |
} |
} |
/* Return true if segment contains a segment link */ |
static int has_segment_link(mstate m, msegmentptr ss) { |
msegmentptr sp = &m->seg; |
for (;;) { |
if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size) |
return 1; |
if ((sp = sp->next) == 0) |
return 0; |
} |
} |
#ifndef MORECORE_CANNOT_TRIM |
#define should_trim(M,s) ((s) > (M)->trim_check) |
#else /* MORECORE_CANNOT_TRIM */ |
#define should_trim(M,s) (0) |
#endif /* MORECORE_CANNOT_TRIM */ |
/* |
TOP_FOOT_SIZE is padding at the end of a segment, including space |
that may be needed to place segment records and fenceposts when new |
noncontiguous segments are added. |
*/ |
#define TOP_FOOT_SIZE\ |
(align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) |
/* ------------------------------- Hooks -------------------------------- */ |
/* |
PREACTION should be defined to return 0 on success, and nonzero on |
failure. If you are not using locking, you can redefine these to do |
anything you like. |
*/ |
#if USE_LOCKS |
/* Ensure locks are initialized */ |
#define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams()) |
#define PREACTION(M) ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0) |
#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); } |
#else /* USE_LOCKS */ |
#ifndef PREACTION |
#define PREACTION(M) (0) |
#endif /* PREACTION */ |
#ifndef POSTACTION |
#define POSTACTION(M) |
#endif /* POSTACTION */ |
#endif /* USE_LOCKS */ |
/* |
CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses. |
USAGE_ERROR_ACTION is triggered on detected bad frees and |
reallocs. The argument p is an address that might have triggered the |
fault. It is ignored by the two predefined actions, but might be |
useful in custom actions that try to help diagnose errors. |
*/ |
#if PROCEED_ON_ERROR |
/* A count of the number of corruption errors causing resets */ |
int malloc_corruption_error_count; |
/* default corruption action */ |
static void reset_on_error(mstate m); |
#define CORRUPTION_ERROR_ACTION(m) reset_on_error(m) |
#define USAGE_ERROR_ACTION(m, p) |
#else /* PROCEED_ON_ERROR */ |
#ifndef CORRUPTION_ERROR_ACTION |
#define CORRUPTION_ERROR_ACTION(m) ABORT |
#endif /* CORRUPTION_ERROR_ACTION */ |
#ifndef USAGE_ERROR_ACTION |
#define USAGE_ERROR_ACTION(m,p) ABORT |
#endif /* USAGE_ERROR_ACTION */ |
#endif /* PROCEED_ON_ERROR */ |
/* -------------------------- Debugging setup ---------------------------- */ |
#if ! DEBUG |
#define check_free_chunk(M,P) |
#define check_inuse_chunk(M,P) |
#define check_malloced_chunk(M,P,N) |
#define check_mmapped_chunk(M,P) |
#define check_malloc_state(M) |
#define check_top_chunk(M,P) |
#else /* DEBUG */ |
#define check_free_chunk(M,P) do_check_free_chunk(M,P) |
#define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P) |
#define check_top_chunk(M,P) do_check_top_chunk(M,P) |
#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N) |
#define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P) |
#define check_malloc_state(M) do_check_malloc_state(M) |
static void do_check_any_chunk(mstate m, mchunkptr p); |
static void do_check_top_chunk(mstate m, mchunkptr p); |
static void do_check_mmapped_chunk(mstate m, mchunkptr p); |
static void do_check_inuse_chunk(mstate m, mchunkptr p); |
static void do_check_free_chunk(mstate m, mchunkptr p); |
static void do_check_malloced_chunk(mstate m, void* mem, size_t s); |
static void do_check_tree(mstate m, tchunkptr t); |
static void do_check_treebin(mstate m, bindex_t i); |
static void do_check_smallbin(mstate m, bindex_t i); |
static void do_check_malloc_state(mstate m); |
static int bin_find(mstate m, mchunkptr x); |
static size_t traverse_and_check(mstate m); |
#endif /* DEBUG */ |
/* ---------------------------- Indexing Bins ---------------------------- */ |
#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) |
#define small_index(s) ((s) >> SMALLBIN_SHIFT) |
#define small_index2size(i) ((i) << SMALLBIN_SHIFT) |
#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) |
/* addressing by index. See above about smallbin repositioning */ |
#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1]))) |
#define treebin_at(M,i) (&((M)->treebins[i])) |
/* assign tree index for size S to variable I */ |
#if defined(__GNUC__) && defined(i386) |
#define compute_tree_index(S, I)\ |
{\ |
size_t X = S >> TREEBIN_SHIFT;\ |
if (X == 0)\ |
I = 0;\ |
else if (X > 0xFFFF)\ |
I = NTREEBINS-1;\ |
else {\ |
unsigned int K;\ |
__asm__("bsrl %1,%0\n\t" : "=r" (K) : "rm" (X));\ |
I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ |
}\ |
} |
#else /* GNUC */ |
#define compute_tree_index(S, I)\ |
{\ |
size_t X = S >> TREEBIN_SHIFT;\ |
if (X == 0)\ |
I = 0;\ |
else if (X > 0xFFFF)\ |
I = NTREEBINS-1;\ |
else {\ |
unsigned int Y = (unsigned int)X;\ |
unsigned int N = ((Y - 0x100) >> 16) & 8;\ |
unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\ |
N += K;\ |
N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\ |
K = 14 - N + ((Y <<= K) >> 15);\ |
I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\ |
}\ |
} |
#endif /* GNUC */ |
/* Bit representing maximum resolved size in a treebin at i */ |
#define bit_for_tree_index(i) \ |
(i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) |
/* Shift placing maximum resolved bit in a treebin at i as sign bit */ |
#define leftshift_for_tree_index(i) \ |
((i == NTREEBINS-1)? 0 : \ |
((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) |
/* The size of the smallest chunk held in bin with index i */ |
#define minsize_for_tree_index(i) \ |
((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ |
(((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) |
/* ------------------------ Operations on bin maps ----------------------- */ |
/* bit corresponding to given index */ |
#define idx2bit(i) ((binmap_t)(1) << (i)) |
/* Mark/Clear bits with given index */ |
#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) |
#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) |
#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) |
#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) |
#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) |
#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) |
/* index corresponding to given bit */ |
#if defined(__GNUC__) && defined(i386) |
#define compute_bit2idx(X, I)\ |
{\ |
unsigned int J;\ |
__asm__("bsfl %1,%0\n\t" : "=r" (J) : "rm" (X));\ |
I = (bindex_t)J;\ |
} |
#else /* GNUC */ |
#if USE_BUILTIN_FFS |
#define compute_bit2idx(X, I) I = ffs(X)-1 |
#else /* USE_BUILTIN_FFS */ |
#define compute_bit2idx(X, I)\ |
{\ |
unsigned int Y = X - 1;\ |
unsigned int K = Y >> (16-4) & 16;\ |
unsigned int N = K; Y >>= K;\ |
N += K = Y >> (8-3) & 8; Y >>= K;\ |
N += K = Y >> (4-2) & 4; Y >>= K;\ |
N += K = Y >> (2-1) & 2; Y >>= K;\ |
N += K = Y >> (1-0) & 1; Y >>= K;\ |
I = (bindex_t)(N + Y);\ |
} |
#endif /* USE_BUILTIN_FFS */ |
#endif /* GNUC */ |
/* isolate the least set bit of a bitmap */ |
#define least_bit(x) ((x) & -(x)) |
/* mask with all bits to left of least bit of x on */ |
#define left_bits(x) ((x<<1) | -(x<<1)) |
/* mask with all bits to left of or equal to least bit of x on */ |
#define same_or_left_bits(x) ((x) | -(x)) |
/* ----------------------- Runtime Check Support ------------------------- */ |
/* |
For security, the main invariant is that malloc/free/etc never |
writes to a static address other than malloc_state, unless static |
malloc_state itself has been corrupted, which cannot occur via |
malloc (because of these checks). In essence this means that we |
believe all pointers, sizes, maps etc held in malloc_state, but |
check all of those linked or offsetted from other embedded data |
structures. These checks are interspersed with main code in a way |
that tends to minimize their run-time cost. |
When FOOTERS is defined, in addition to range checking, we also |
verify footer fields of inuse chunks, which can be used guarantee |
that the mstate controlling malloc/free is intact. This is a |
streamlined version of the approach described by William Robertson |
et al in "Run-time Detection of Heap-based Overflows" LISA'03 |
http://www.usenix.org/events/lisa03/tech/robertson.html The footer |
of an inuse chunk holds the xor of its mstate and a random seed, |
that is checked upon calls to free() and realloc(). This is |
(probablistically) unguessable from outside the program, but can be |
computed by any code successfully malloc'ing any chunk, so does not |
itself provide protection against code that has already broken |
security through some other means. Unlike Robertson et al, we |
always dynamically check addresses of all offset chunks (previous, |
next, etc). This turns out to be cheaper than relying on hashes. |
*/ |
#if !INSECURE |
/* Check if address a is at least as high as any from MORECORE or MMAP */ |
#define ok_address(M, a) ((char*)(a) >= (M)->least_addr) |
/* Check if address of next chunk n is higher than base chunk p */ |
#define ok_next(p, n) ((char*)(p) < (char*)(n)) |
/* Check if p has its cinuse bit on */ |
#define ok_cinuse(p) cinuse(p) |
/* Check if p has its pinuse bit on */ |
#define ok_pinuse(p) pinuse(p) |
#else /* !INSECURE */ |
#define ok_address(M, a) (1) |
#define ok_next(b, n) (1) |
#define ok_cinuse(p) (1) |
#define ok_pinuse(p) (1) |
#endif /* !INSECURE */ |
#if (FOOTERS && !INSECURE) |
/* Check if (alleged) mstate m has expected magic field */ |
#define ok_magic(M) ((M)->magic == mparams.magic) |
#else /* (FOOTERS && !INSECURE) */ |
#define ok_magic(M) (1) |
#endif /* (FOOTERS && !INSECURE) */ |
/* In gcc, use __builtin_expect to minimize impact of checks */ |
#if !INSECURE |
#if defined(__GNUC__) && __GNUC__ >= 3 |
#define RTCHECK(e) __builtin_expect(e, 1) |
#else /* GNUC */ |
#define RTCHECK(e) (e) |
#endif /* GNUC */ |
#else /* !INSECURE */ |
#define RTCHECK(e) (1) |
#endif /* !INSECURE */ |
/* macros to set up inuse chunks with or without footers */ |
#if !FOOTERS |
#define mark_inuse_foot(M,p,s) |
/* Set cinuse bit and pinuse bit of next chunk */ |
#define set_inuse(M,p,s)\ |
((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ |
((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) |
/* Set cinuse and pinuse of this chunk and pinuse of next chunk */ |
#define set_inuse_and_pinuse(M,p,s)\ |
((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ |
((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) |
/* Set size, cinuse and pinuse bit of this chunk */ |
#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ |
((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) |
#else /* FOOTERS */ |
/* Set foot of inuse chunk to be xor of mstate and seed */ |
#define mark_inuse_foot(M,p,s)\ |
(((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic)) |
#define get_mstate_for(p)\ |
((mstate)(((mchunkptr)((char*)(p) +\ |
(chunksize(p))))->prev_foot ^ mparams.magic)) |
#define set_inuse(M,p,s)\ |
((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ |
(((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \ |
mark_inuse_foot(M,p,s)) |
#define set_inuse_and_pinuse(M,p,s)\ |
((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ |
(((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\ |
mark_inuse_foot(M,p,s)) |
#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ |
((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ |
mark_inuse_foot(M, p, s)) |
#endif /* !FOOTERS */ |
/* ---------------------------- setting mparams -------------------------- */ |
/* Initialize mparams */ |
static int init_mparams(void) { |
if (mparams.page_size == 0) { |
size_t s; |
mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD; |
mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD; |
#if MORECORE_CONTIGUOUS |
mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT; |
#else /* MORECORE_CONTIGUOUS */ |
mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT; |
#endif /* MORECORE_CONTIGUOUS */ |
#if (FOOTERS && !INSECURE) |
{ |
#if USE_DEV_RANDOM |
int fd; |
unsigned char buf[sizeof(size_t)]; |
/* Try to use /dev/urandom, else fall back on using time */ |
if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 && |
read(fd, buf, sizeof(buf)) == sizeof(buf)) { |
s = *((size_t *) buf); |
close(fd); |
} |
else |
#endif /* USE_DEV_RANDOM */ |
s = (size_t)(time(0) ^ (size_t)0x55555555U); |
s |= (size_t)8U; /* ensure nonzero */ |
s &= ~(size_t)7U; /* improve chances of fault for bad values */ |
} |
#else /* (FOOTERS && !INSECURE) */ |
s = (size_t)0x58585858U; |
#endif /* (FOOTERS && !INSECURE) */ |
ACQUIRE_MAGIC_INIT_LOCK(); |
if (mparams.magic == 0) { |
mparams.magic = s; |
/* Set up lock for main malloc area */ |
INITIAL_LOCK(&gm->mutex); |
gm->mflags = mparams.default_mflags; |
} |
RELEASE_MAGIC_INIT_LOCK(); |
#ifndef WIN32 |
mparams.page_size = malloc_getpagesize; |
mparams.granularity = ((DEFAULT_GRANULARITY != 0)? |
DEFAULT_GRANULARITY : mparams.page_size); |
#else /* WIN32 */ |
{ |
SYSTEM_INFO system_info; |
GetSystemInfo(&system_info); |
mparams.page_size = system_info.dwPageSize; |
mparams.granularity = system_info.dwAllocationGranularity; |
} |
#endif /* WIN32 */ |
/* Sanity-check configuration: |
size_t must be unsigned and as wide as pointer type. |
ints must be at least 4 bytes. |
alignment must be at least 8. |
Alignment, min chunk size, and page size must all be powers of 2. |
*/ |
if ((sizeof(size_t) != sizeof(char*)) || |
(MAX_SIZE_T < MIN_CHUNK_SIZE) || |
(sizeof(int) < 4) || |
(MALLOC_ALIGNMENT < (size_t)8U) || |
((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) || |
((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) || |
((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) || |
((mparams.page_size & (mparams.page_size-SIZE_T_ONE)) != 0)) |
ABORT; |
} |
return 0; |
} |
/* support for mallopt */ |
static int change_mparam(int param_number, int value) { |
size_t val = (size_t)value; |
init_mparams(); |
switch(param_number) { |
case M_TRIM_THRESHOLD: |
mparams.trim_threshold = val; |
return 1; |
case M_GRANULARITY: |
if (val >= mparams.page_size && ((val & (val-1)) == 0)) { |
mparams.granularity = val; |
return 1; |
} |
else |
return 0; |
case M_MMAP_THRESHOLD: |
mparams.mmap_threshold = val; |
return 1; |
default: |
return 0; |
} |
} |
#if DEBUG |
/* ------------------------- Debugging Support --------------------------- */ |
/* Check properties of any chunk, whether free, inuse, mmapped etc */ |
static void do_check_any_chunk(mstate m, mchunkptr p) { |
assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); |
assert(ok_address(m, p)); |
} |
/* Check properties of top chunk */ |
static void do_check_top_chunk(mstate m, mchunkptr p) { |
msegmentptr sp = segment_holding(m, (char*)p); |
size_t sz = chunksize(p); |
assert(sp != 0); |
assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); |
assert(ok_address(m, p)); |
assert(sz == m->topsize); |
assert(sz > 0); |
assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE); |
assert(pinuse(p)); |
assert(!next_pinuse(p)); |
} |
/* Check properties of (inuse) mmapped chunks */ |
static void do_check_mmapped_chunk(mstate m, mchunkptr p) { |
size_t sz = chunksize(p); |
size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD); |
assert(is_mmapped(p)); |
assert(use_mmap(m)); |
assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); |
assert(ok_address(m, p)); |
assert(!is_small(sz)); |
assert((len & (mparams.page_size-SIZE_T_ONE)) == 0); |
assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD); |
assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0); |
} |
/* Check properties of inuse chunks */ |
static void do_check_inuse_chunk(mstate m, mchunkptr p) { |
do_check_any_chunk(m, p); |
assert(cinuse(p)); |
assert(next_pinuse(p)); |
/* If not pinuse and not mmapped, previous chunk has OK offset */ |
assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p); |
if (is_mmapped(p)) |
do_check_mmapped_chunk(m, p); |
} |
/* Check properties of free chunks */ |
static void do_check_free_chunk(mstate m, mchunkptr p) { |
size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); |
mchunkptr next = chunk_plus_offset(p, sz); |
do_check_any_chunk(m, p); |
assert(!cinuse(p)); |
assert(!next_pinuse(p)); |
assert (!is_mmapped(p)); |
if (p != m->dv && p != m->top) { |
if (sz >= MIN_CHUNK_SIZE) { |
assert((sz & CHUNK_ALIGN_MASK) == 0); |
assert(is_aligned(chunk2mem(p))); |
assert(next->prev_foot == sz); |
assert(pinuse(p)); |
assert (next == m->top || cinuse(next)); |
assert(p->fd->bk == p); |
assert(p->bk->fd == p); |
} |
else /* markers are always of size SIZE_T_SIZE */ |
assert(sz == SIZE_T_SIZE); |
} |
} |
/* Check properties of malloced chunks at the point they are malloced */ |
static void do_check_malloced_chunk(mstate m, void* mem, size_t s) { |
if (mem != 0) { |
mchunkptr p = mem2chunk(mem); |
size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); |
do_check_inuse_chunk(m, p); |
assert((sz & CHUNK_ALIGN_MASK) == 0); |
assert(sz >= MIN_CHUNK_SIZE); |
assert(sz >= s); |
/* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */ |
assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE)); |
} |
} |
/* Check a tree and its subtrees. */ |
static void do_check_tree(mstate m, tchunkptr t) { |
tchunkptr head = 0; |
tchunkptr u = t; |
bindex_t tindex = t->index; |
size_t tsize = chunksize(t); |
bindex_t idx; |
compute_tree_index(tsize, idx); |
assert(tindex == idx); |
assert(tsize >= MIN_LARGE_SIZE); |
assert(tsize >= minsize_for_tree_index(idx)); |
assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1)))); |
do { /* traverse through chain of same-sized nodes */ |
do_check_any_chunk(m, ((mchunkptr)u)); |
assert(u->index == tindex); |
assert(chunksize(u) == tsize); |
assert(!cinuse(u)); |
assert(!next_pinuse(u)); |
assert(u->fd->bk == u); |
assert(u->bk->fd == u); |
if (u->parent == 0) { |
assert(u->child[0] == 0); |
assert(u->child[1] == 0); |
} |
else { |
assert(head == 0); /* only one node on chain has parent */ |
head = u; |
assert(u->parent != u); |
assert (u->parent->child[0] == u || |
u->parent->child[1] == u || |
*((tbinptr*)(u->parent)) == u); |
if (u->child[0] != 0) { |
assert(u->child[0]->parent == u); |
assert(u->child[0] != u); |
do_check_tree(m, u->child[0]); |
} |
if (u->child[1] != 0) { |
assert(u->child[1]->parent == u); |
assert(u->child[1] != u); |
do_check_tree(m, u->child[1]); |
} |
if (u->child[0] != 0 && u->child[1] != 0) { |
assert(chunksize(u->child[0]) < chunksize(u->child[1])); |
} |
} |
u = u->fd; |
} while (u != t); |
assert(head != 0); |
} |
/* Check all the chunks in a treebin. */ |
static void do_check_treebin(mstate m, bindex_t i) { |
tbinptr* tb = treebin_at(m, i); |
tchunkptr t = *tb; |
int empty = (m->treemap & (1U << i)) == 0; |
if (t == 0) |
assert(empty); |
if (!empty) |
do_check_tree(m, t); |
} |
/* Check all the chunks in a smallbin. */ |
static void do_check_smallbin(mstate m, bindex_t i) { |
sbinptr b = smallbin_at(m, i); |
mchunkptr p = b->bk; |
unsigned int empty = (m->smallmap & (1U << i)) == 0; |
if (p == b) |
assert(empty); |
if (!empty) { |
for (; p != b; p = p->bk) { |
size_t size = chunksize(p); |
mchunkptr q; |
/* each chunk claims to be free */ |
do_check_free_chunk(m, p); |
/* chunk belongs in bin */ |
assert(small_index(size) == i); |
assert(p->bk == b || chunksize(p->bk) == chunksize(p)); |
/* chunk is followed by an inuse chunk */ |
q = next_chunk(p); |
if (q->head != FENCEPOST_HEAD) |
do_check_inuse_chunk(m, q); |
} |
} |
} |
/* Find x in a bin. Used in other check functions. */ |
static int bin_find(mstate m, mchunkptr x) { |
size_t size = chunksize(x); |
if (is_small(size)) { |
bindex_t sidx = small_index(size); |
sbinptr b = smallbin_at(m, sidx); |
if (smallmap_is_marked(m, sidx)) { |
mchunkptr p = b; |
do { |
if (p == x) |
return 1; |
} while ((p = p->fd) != b); |
} |
} |
else { |
bindex_t tidx; |
compute_tree_index(size, tidx); |
if (treemap_is_marked(m, tidx)) { |
tchunkptr t = *treebin_at(m, tidx); |
size_t sizebits = size << leftshift_for_tree_index(tidx); |
while (t != 0 && chunksize(t) != size) { |
t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; |
sizebits <<= 1; |
} |
if (t != 0) { |
tchunkptr u = t; |
do { |
if (u == (tchunkptr)x) |
return 1; |
} while ((u = u->fd) != t); |
} |
} |
} |
return 0; |
} |
/* Traverse each chunk and check it; return total */ |
static size_t traverse_and_check(mstate m) { |
size_t sum = 0; |
if (is_initialized(m)) { |
msegmentptr s = &m->seg; |
sum += m->topsize + TOP_FOOT_SIZE; |
while (s != 0) { |
mchunkptr q = align_as_chunk(s->base); |
mchunkptr lastq = 0; |
assert(pinuse(q)); |
while (segment_holds(s, q) && |
q != m->top && q->head != FENCEPOST_HEAD) { |
sum += chunksize(q); |
if (cinuse(q)) { |
assert(!bin_find(m, q)); |
do_check_inuse_chunk(m, q); |
} |
else { |
assert(q == m->dv || bin_find(m, q)); |
assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */ |
do_check_free_chunk(m, q); |
} |
lastq = q; |
q = next_chunk(q); |
} |
s = s->next; |
} |
} |
return sum; |
} |
/* Check all properties of malloc_state. */ |
static void do_check_malloc_state(mstate m) { |
bindex_t i; |
size_t total; |
/* check bins */ |
for (i = 0; i < NSMALLBINS; ++i) |
do_check_smallbin(m, i); |
for (i = 0; i < NTREEBINS; ++i) |
do_check_treebin(m, i); |
if (m->dvsize != 0) { /* check dv chunk */ |
do_check_any_chunk(m, m->dv); |
assert(m->dvsize == chunksize(m->dv)); |
assert(m->dvsize >= MIN_CHUNK_SIZE); |
assert(bin_find(m, m->dv) == 0); |
} |
if (m->top != 0) { /* check top chunk */ |
do_check_top_chunk(m, m->top); |
assert(m->topsize == chunksize(m->top)); |
assert(m->topsize > 0); |
assert(bin_find(m, m->top) == 0); |
} |
total = traverse_and_check(m); |
assert(total <= m->footprint); |
assert(m->footprint <= m->max_footprint); |
} |
#endif /* DEBUG */ |
/* ----------------------------- statistics ------------------------------ */ |
#if !NO_MALLINFO |
static struct mallinfo internal_mallinfo(mstate m) { |
struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; |
if (!PREACTION(m)) { |
check_malloc_state(m); |
if (is_initialized(m)) { |
size_t nfree = SIZE_T_ONE; /* top always free */ |
size_t mfree = m->topsize + TOP_FOOT_SIZE; |
size_t sum = mfree; |
msegmentptr s = &m->seg; |
while (s != 0) { |
mchunkptr q = align_as_chunk(s->base); |
while (segment_holds(s, q) && |
q != m->top && q->head != FENCEPOST_HEAD) { |
size_t sz = chunksize(q); |
sum += sz; |
if (!cinuse(q)) { |
mfree += sz; |
++nfree; |
} |
q = next_chunk(q); |
} |
s = s->next; |
} |
nm.arena = sum; |
nm.ordblks = nfree; |
nm.hblkhd = m->footprint - sum; |
nm.usmblks = m->max_footprint; |
nm.uordblks = m->footprint - mfree; |
nm.fordblks = mfree; |
nm.keepcost = m->topsize; |
} |
POSTACTION(m); |
} |
return nm; |
} |
#endif /* !NO_MALLINFO */ |
static void internal_malloc_stats(mstate m) { |
if (!PREACTION(m)) { |
size_t maxfp = 0; |
size_t fp = 0; |
size_t used = 0; |
check_malloc_state(m); |
if (is_initialized(m)) { |
msegmentptr s = &m->seg; |
maxfp = m->max_footprint; |
fp = m->footprint; |
used = fp - (m->topsize + TOP_FOOT_SIZE); |
while (s != 0) { |
mchunkptr q = align_as_chunk(s->base); |
while (segment_holds(s, q) && |
q != m->top && q->head != FENCEPOST_HEAD) { |
if (!cinuse(q)) |
used -= chunksize(q); |
q = next_chunk(q); |
} |
s = s->next; |
} |
} |
fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp)); |
fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp)); |
fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used)); |
POSTACTION(m); |
} |
} |
/* ----------------------- Operations on smallbins ----------------------- */ |
/* |
Various forms of linking and unlinking are defined as macros. Even |
the ones for trees, which are very long but have very short typical |
paths. This is ugly but reduces reliance on inlining support of |
compilers. |
*/ |
/* Link a free chunk into a smallbin */ |
#define insert_small_chunk(M, P, S) {\ |
bindex_t I = small_index(S);\ |
mchunkptr B = smallbin_at(M, I);\ |
mchunkptr F = B;\ |
assert(S >= MIN_CHUNK_SIZE);\ |
if (!smallmap_is_marked(M, I))\ |
mark_smallmap(M, I);\ |
else if (RTCHECK(ok_address(M, B->fd)))\ |
F = B->fd;\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
B->fd = P;\ |
F->bk = P;\ |
P->fd = F;\ |
P->bk = B;\ |
} |
/* Unlink a chunk from a smallbin */ |
#define unlink_small_chunk(M, P, S) {\ |
mchunkptr F = P->fd;\ |
mchunkptr B = P->bk;\ |
bindex_t I = small_index(S);\ |
assert(P != B);\ |
assert(P != F);\ |
assert(chunksize(P) == small_index2size(I));\ |
if (F == B)\ |
clear_smallmap(M, I);\ |
else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\ |
(B == smallbin_at(M,I) || ok_address(M, B)))) {\ |
F->bk = B;\ |
B->fd = F;\ |
}\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
} |
/* Unlink the first chunk from a smallbin */ |
#define unlink_first_small_chunk(M, B, P, I) {\ |
mchunkptr F = P->fd;\ |
assert(P != B);\ |
assert(P != F);\ |
assert(chunksize(P) == small_index2size(I));\ |
if (B == F)\ |
clear_smallmap(M, I);\ |
else if (RTCHECK(ok_address(M, F))) {\ |
B->fd = F;\ |
F->bk = B;\ |
}\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
} |
/* Replace dv node, binning the old one */ |
/* Used only when dvsize known to be small */ |
#define replace_dv(M, P, S) {\ |
size_t DVS = M->dvsize;\ |
if (DVS != 0) {\ |
mchunkptr DV = M->dv;\ |
assert(is_small(DVS));\ |
insert_small_chunk(M, DV, DVS);\ |
}\ |
M->dvsize = S;\ |
M->dv = P;\ |
} |
/* ------------------------- Operations on trees ------------------------- */ |
/* Insert chunk into tree */ |
#define insert_large_chunk(M, X, S) {\ |
tbinptr* H;\ |
bindex_t I;\ |
compute_tree_index(S, I);\ |
H = treebin_at(M, I);\ |
X->index = I;\ |
X->child[0] = X->child[1] = 0;\ |
if (!treemap_is_marked(M, I)) {\ |
mark_treemap(M, I);\ |
*H = X;\ |
X->parent = (tchunkptr)H;\ |
X->fd = X->bk = X;\ |
}\ |
else {\ |
tchunkptr T = *H;\ |
size_t K = S << leftshift_for_tree_index(I);\ |
for (;;) {\ |
if (chunksize(T) != S) {\ |
tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ |
K <<= 1;\ |
if (*C != 0)\ |
T = *C;\ |
else if (RTCHECK(ok_address(M, C))) {\ |
*C = X;\ |
X->parent = T;\ |
X->fd = X->bk = X;\ |
break;\ |
}\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
break;\ |
}\ |
}\ |
else {\ |
tchunkptr F = T->fd;\ |
if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\ |
T->fd = F->bk = X;\ |
X->fd = F;\ |
X->bk = T;\ |
X->parent = 0;\ |
break;\ |
}\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
break;\ |
}\ |
}\ |
}\ |
}\ |
} |
/* |
Unlink steps: |
1. If x is a chained node, unlink it from its same-sized fd/bk links |
and choose its bk node as its replacement. |
2. If x was the last node of its size, but not a leaf node, it must |
be replaced with a leaf node (not merely one with an open left or |
right), to make sure that lefts and rights of descendents |
correspond properly to bit masks. We use the rightmost descendent |
of x. We could use any other leaf, but this is easy to locate and |
tends to counteract removal of leftmosts elsewhere, and so keeps |
paths shorter than minimally guaranteed. This doesn't loop much |
because on average a node in a tree is near the bottom. |
3. If x is the base of a chain (i.e., has parent links) relink |
x's parent and children to x's replacement (or null if none). |
*/ |
#define unlink_large_chunk(M, X) {\ |
tchunkptr XP = X->parent;\ |
tchunkptr R;\ |
if (X->bk != X) {\ |
tchunkptr F = X->fd;\ |
R = X->bk;\ |
if (RTCHECK(ok_address(M, F))) {\ |
F->bk = R;\ |
R->fd = F;\ |
}\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
}\ |
else {\ |
tchunkptr* RP;\ |
if (((R = *(RP = &(X->child[1]))) != 0) ||\ |
((R = *(RP = &(X->child[0]))) != 0)) {\ |
tchunkptr* CP;\ |
while ((*(CP = &(R->child[1])) != 0) ||\ |
(*(CP = &(R->child[0])) != 0)) {\ |
R = *(RP = CP);\ |
}\ |
if (RTCHECK(ok_address(M, RP)))\ |
*RP = 0;\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
}\ |
}\ |
if (XP != 0) {\ |
tbinptr* H = treebin_at(M, X->index);\ |
if (X == *H) {\ |
if ((*H = R) == 0) \ |
clear_treemap(M, X->index);\ |
}\ |
else if (RTCHECK(ok_address(M, XP))) {\ |
if (XP->child[0] == X) \ |
XP->child[0] = R;\ |
else \ |
XP->child[1] = R;\ |
}\ |
else\ |
CORRUPTION_ERROR_ACTION(M);\ |
if (R != 0) {\ |
if (RTCHECK(ok_address(M, R))) {\ |
tchunkptr C0, C1;\ |
R->parent = XP;\ |
if ((C0 = X->child[0]) != 0) {\ |
if (RTCHECK(ok_address(M, C0))) {\ |
R->child[0] = C0;\ |
C0->parent = R;\ |
}\ |
else\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
if ((C1 = X->child[1]) != 0) {\ |
if (RTCHECK(ok_address(M, C1))) {\ |
R->child[1] = C1;\ |
C1->parent = R;\ |
}\ |
else\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
}\ |
else\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
}\ |
} |
/* Relays to large vs small bin operations */ |
#define insert_chunk(M, P, S)\ |
if (is_small(S)) insert_small_chunk(M, P, S)\ |
else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } |
#define unlink_chunk(M, P, S)\ |
if (is_small(S)) unlink_small_chunk(M, P, S)\ |
else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } |
/* Relays to internal calls to malloc/free from realloc, memalign etc */ |
#if ONLY_MSPACES |
#define internal_malloc(m, b) mspace_malloc(m, b) |
#define internal_free(m, mem) mspace_free(m,mem); |
#else /* ONLY_MSPACES */ |
#if MSPACES |
#define internal_malloc(m, b)\ |
(m == gm)? dlmalloc(b) : mspace_malloc(m, b) |
#define internal_free(m, mem)\ |
if (m == gm) dlfree(mem); else mspace_free(m,mem); |
#else /* MSPACES */ |
#define internal_malloc(m, b) dlmalloc(b) |
#define internal_free(m, mem) dlfree(mem) |
#endif /* MSPACES */ |
#endif /* ONLY_MSPACES */ |
/* ----------------------- Direct-mmapping chunks ----------------------- */ |
/* |
Directly mmapped chunks are set up with an offset to the start of |
the mmapped region stored in the prev_foot field of the chunk. This |
allows reconstruction of the required argument to MUNMAP when freed, |
and also allows adjustment of the returned chunk to meet alignment |
requirements (especially in memalign). There is also enough space |
allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain |
the PINUSE bit so frees can be checked. |
*/ |
/* Malloc using mmap */ |
static void* mmap_alloc(mstate m, size_t nb) { |
size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); |
if (mmsize > nb) { /* Check for wrap around 0 */ |
char* mm = (char*)(DIRECT_MMAP(mmsize)); |
if (mm != CMFAIL) { |
size_t offset = align_offset(chunk2mem(mm)); |
size_t psize = mmsize - offset - MMAP_FOOT_PAD; |
mchunkptr p = (mchunkptr)(mm + offset); |
p->prev_foot = offset | IS_MMAPPED_BIT; |
(p)->head = (psize|CINUSE_BIT); |
mark_inuse_foot(m, p, psize); |
chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; |
chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; |
if (mm < m->least_addr) |
m->least_addr = mm; |
if ((m->footprint += mmsize) > m->max_footprint) |
m->max_footprint = m->footprint; |
assert(is_aligned(chunk2mem(p))); |
check_mmapped_chunk(m, p); |
return chunk2mem(p); |
} |
} |
return 0; |
} |
/* Realloc using mmap */ |
static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) { |
size_t oldsize = chunksize(oldp); |
if (is_small(nb)) /* Can't shrink mmap regions below small size */ |
return 0; |
/* Keep old chunk if big enough but not too big */ |
if (oldsize >= nb + SIZE_T_SIZE && |
(oldsize - nb) <= (mparams.granularity << 1)) |
return oldp; |
else { |
size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT; |
size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD; |
size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES + |
CHUNK_ALIGN_MASK); |
char* cp = (char*)CALL_MREMAP((char*)oldp - offset, |
oldmmsize, newmmsize, 1); |
if (cp != CMFAIL) { |
mchunkptr newp = (mchunkptr)(cp + offset); |
size_t psize = newmmsize - offset - MMAP_FOOT_PAD; |
newp->head = (psize|CINUSE_BIT); |
mark_inuse_foot(m, newp, psize); |
chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; |
chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; |
if (cp < m->least_addr) |
m->least_addr = cp; |
if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint) |
m->max_footprint = m->footprint; |
check_mmapped_chunk(m, newp); |
return newp; |
} |
} |
return 0; |
} |
/* -------------------------- mspace management -------------------------- */ |
/* Initialize top chunk and its size */ |
static void init_top(mstate m, mchunkptr p, size_t psize) { |
/* Ensure alignment */ |
size_t offset = align_offset(chunk2mem(p)); |
p = (mchunkptr)((char*)p + offset); |
psize -= offset; |
m->top = p; |
m->topsize = psize; |
p->head = psize | PINUSE_BIT; |
/* set size of fake trailing chunk holding overhead space only once */ |
chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; |
m->trim_check = mparams.trim_threshold; /* reset on each update */ |
} |
/* Initialize bins for a new mstate that is otherwise zeroed out */ |
static void init_bins(mstate m) { |
/* Establish circular links for smallbins */ |
bindex_t i; |
for (i = 0; i < NSMALLBINS; ++i) { |
sbinptr bin = smallbin_at(m,i); |
bin->fd = bin->bk = bin; |
} |
} |
#if PROCEED_ON_ERROR |
/* default corruption action */ |
static void reset_on_error(mstate m) { |
int i; |
++malloc_corruption_error_count; |
/* Reinitialize fields to forget about all memory */ |
m->smallbins = m->treebins = 0; |
m->dvsize = m->topsize = 0; |
m->seg.base = 0; |
m->seg.size = 0; |
m->seg.next = 0; |
m->top = m->dv = 0; |
for (i = 0; i < NTREEBINS; ++i) |
*treebin_at(m, i) = 0; |
init_bins(m); |
} |
#endif /* PROCEED_ON_ERROR */ |
/* Allocate chunk and prepend remainder with chunk in successor base. */ |
static void* prepend_alloc(mstate m, char* newbase, char* oldbase, |
size_t nb) { |
mchunkptr p = align_as_chunk(newbase); |
mchunkptr oldfirst = align_as_chunk(oldbase); |
size_t psize = (char*)oldfirst - (char*)p; |
mchunkptr q = chunk_plus_offset(p, nb); |
size_t qsize = psize - nb; |
set_size_and_pinuse_of_inuse_chunk(m, p, nb); |
assert((char*)oldfirst > (char*)q); |
assert(pinuse(oldfirst)); |
assert(qsize >= MIN_CHUNK_SIZE); |
/* consolidate remainder with first chunk of old base */ |
if (oldfirst == m->top) { |
size_t tsize = m->topsize += qsize; |
m->top = q; |
q->head = tsize | PINUSE_BIT; |
check_top_chunk(m, q); |
} |
else if (oldfirst == m->dv) { |
size_t dsize = m->dvsize += qsize; |
m->dv = q; |
set_size_and_pinuse_of_free_chunk(q, dsize); |
} |
else { |
if (!cinuse(oldfirst)) { |
size_t nsize = chunksize(oldfirst); |
unlink_chunk(m, oldfirst, nsize); |
oldfirst = chunk_plus_offset(oldfirst, nsize); |
qsize += nsize; |
} |
set_free_with_pinuse(q, qsize, oldfirst); |
insert_chunk(m, q, qsize); |
check_free_chunk(m, q); |
} |
check_malloced_chunk(m, chunk2mem(p), nb); |
return chunk2mem(p); |
} |
/* Add a segment to hold a new noncontiguous region */ |
static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) { |
/* Determine locations and sizes of segment, fenceposts, old top */ |
char* old_top = (char*)m->top; |
msegmentptr oldsp = segment_holding(m, old_top); |
char* old_end = oldsp->base + oldsp->size; |
size_t ssize = pad_request(sizeof(struct malloc_segment)); |
char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); |
size_t offset = align_offset(chunk2mem(rawsp)); |
char* asp = rawsp + offset; |
char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; |
mchunkptr sp = (mchunkptr)csp; |
msegmentptr ss = (msegmentptr)(chunk2mem(sp)); |
mchunkptr tnext = chunk_plus_offset(sp, ssize); |
mchunkptr p = tnext; |
int nfences = 0; |
/* reset top to new space */ |
init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); |
/* Set up segment record */ |
assert(is_aligned(ss)); |
set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); |
*ss = m->seg; /* Push current record */ |
m->seg.base = tbase; |
m->seg.size = tsize; |
m->seg.sflags = mmapped; |
m->seg.next = ss; |
/* Insert trailing fenceposts */ |
for (;;) { |
mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); |
p->head = FENCEPOST_HEAD; |
++nfences; |
if ((char*)(&(nextp->head)) < old_end) |
p = nextp; |
else |
break; |
} |
assert(nfences >= 2); |
/* Insert the rest of old top into a bin as an ordinary free chunk */ |
if (csp != old_top) { |
mchunkptr q = (mchunkptr)old_top; |
size_t psize = csp - old_top; |
mchunkptr tn = chunk_plus_offset(q, psize); |
set_free_with_pinuse(q, psize, tn); |
insert_chunk(m, q, psize); |
} |
check_top_chunk(m, m->top); |
} |
/* -------------------------- System allocation -------------------------- */ |
/* Get memory from system using MORECORE or MMAP */ |
static void* sys_alloc(mstate m, size_t nb) { |
char* tbase = CMFAIL; |
size_t tsize = 0; |
flag_t mmap_flag = 0; |
init_mparams(); |
/* Directly map large chunks */ |
if (use_mmap(m) && nb >= mparams.mmap_threshold) { |
void* mem = mmap_alloc(m, nb); |
if (mem != 0) |
return mem; |
} |
/* |
Try getting memory in any of three ways (in most-preferred to |
least-preferred order): |
1. A call to MORECORE that can normally contiguously extend memory. |
(disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or |
or main space is mmapped or a previous contiguous call failed) |
2. A call to MMAP new space (disabled if not HAVE_MMAP). |
Note that under the default settings, if MORECORE is unable to |
fulfill a request, and HAVE_MMAP is true, then mmap is |
used as a noncontiguous system allocator. This is a useful backup |
strategy for systems with holes in address spaces -- in this case |
sbrk cannot contiguously expand the heap, but mmap may be able to |
find space. |
3. A call to MORECORE that cannot usually contiguously extend memory. |
(disabled if not HAVE_MORECORE) |
*/ |
if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) { |
char* br = CMFAIL; |
msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top); |
size_t asize = 0; |
ACQUIRE_MORECORE_LOCK(); |
if (ss == 0) { /* First time through or recovery */ |
char* base = (char*)CALL_MORECORE(0); |
if (base != CMFAIL) { |
asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); |
/* Adjust to end on a page boundary */ |
if (!is_page_aligned(base)) |
asize += (page_align((size_t)base) - (size_t)base); |
/* Can't call MORECORE if size is negative when treated as signed */ |
if (asize < HALF_MAX_SIZE_T && |
(br = (char*)(CALL_MORECORE(asize))) == base) { |
tbase = base; |
tsize = asize; |
} |
} |
} |
else { |
/* Subtract out existing available top space from MORECORE request. */ |
asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE); |
/* Use mem here only if it did continuously extend old space */ |
if (asize < HALF_MAX_SIZE_T && |
(br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) { |
tbase = br; |
tsize = asize; |
} |
} |
if (tbase == CMFAIL) { /* Cope with partial failure */ |
if (br != CMFAIL) { /* Try to use/extend the space we did get */ |
if (asize < HALF_MAX_SIZE_T && |
asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) { |
size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize); |
if (esize < HALF_MAX_SIZE_T) { |
char* end = (char*)CALL_MORECORE(esize); |
if (end != CMFAIL) |
asize += esize; |
else { /* Can't use; try to release */ |
CALL_MORECORE(-asize); |
br = CMFAIL; |
} |
} |
} |
} |
if (br != CMFAIL) { /* Use the space we did get */ |
tbase = br; |
tsize = asize; |
} |
else |
disable_contiguous(m); /* Don't try contiguous path in the future */ |
} |
RELEASE_MORECORE_LOCK(); |
} |
if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ |
size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE; |
size_t rsize = granularity_align(req); |
if (rsize > nb) { /* Fail if wraps around zero */ |
char* mp = (char*)(CALL_MMAP(rsize)); |
if (mp != CMFAIL) { |
tbase = mp; |
tsize = rsize; |
mmap_flag = IS_MMAPPED_BIT; |
} |
} |
} |
if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ |
size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); |
if (asize < HALF_MAX_SIZE_T) { |
char* br = CMFAIL; |
char* end = CMFAIL; |
ACQUIRE_MORECORE_LOCK(); |
br = (char*)(CALL_MORECORE(asize)); |
end = (char*)(CALL_MORECORE(0)); |
RELEASE_MORECORE_LOCK(); |
if (br != CMFAIL && end != CMFAIL && br < end) { |
size_t ssize = end - br; |
if (ssize > nb + TOP_FOOT_SIZE) { |
tbase = br; |
tsize = ssize; |
} |
} |
} |
} |
if (tbase != CMFAIL) { |
if ((m->footprint += tsize) > m->max_footprint) |
m->max_footprint = m->footprint; |
if (!is_initialized(m)) { /* first-time initialization */ |
m->seg.base = m->least_addr = tbase; |
m->seg.size = tsize; |
m->seg.sflags = mmap_flag; |
m->magic = mparams.magic; |
init_bins(m); |
if (is_global(m)) |
init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); |
else { |
/* Offset top by embedded malloc_state */ |
mchunkptr mn = next_chunk(mem2chunk(m)); |
init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); |
} |
} |
else { |
/* Try to merge with an existing segment */ |
msegmentptr sp = &m->seg; |
while (sp != 0 && tbase != sp->base + sp->size) |
sp = sp->next; |
if (sp != 0 && |
!is_extern_segment(sp) && |
(sp->sflags & IS_MMAPPED_BIT) == mmap_flag && |
segment_holds(sp, m->top)) { /* append */ |
sp->size += tsize; |
init_top(m, m->top, m->topsize + tsize); |
} |
else { |
if (tbase < m->least_addr) |
m->least_addr = tbase; |
sp = &m->seg; |
while (sp != 0 && sp->base != tbase + tsize) |
sp = sp->next; |
if (sp != 0 && |
!is_extern_segment(sp) && |
(sp->sflags & IS_MMAPPED_BIT) == mmap_flag) { |
char* oldbase = sp->base; |
sp->base = tbase; |
sp->size += tsize; |
return prepend_alloc(m, tbase, oldbase, nb); |
} |
else |
add_segment(m, tbase, tsize, mmap_flag); |
} |
} |
if (nb < m->topsize) { /* Allocate from new or extended top space */ |
size_t rsize = m->topsize -= nb; |
mchunkptr p = m->top; |
mchunkptr r = m->top = chunk_plus_offset(p, nb); |
r->head = rsize | PINUSE_BIT; |
set_size_and_pinuse_of_inuse_chunk(m, p, nb); |
check_top_chunk(m, m->top); |
check_malloced_chunk(m, chunk2mem(p), nb); |
return chunk2mem(p); |
} |
} |
MALLOC_FAILURE_ACTION; |
return 0; |
} |
/* ----------------------- system deallocation -------------------------- */ |
/* Unmap and unlink any mmapped segments that don't contain used chunks */ |
static size_t release_unused_segments(mstate m) { |
size_t released = 0; |
msegmentptr pred = &m->seg; |
msegmentptr sp = pred->next; |
while (sp != 0) { |
char* base = sp->base; |
size_t size = sp->size; |
msegmentptr next = sp->next; |
if (is_mmapped_segment(sp) && !is_extern_segment(sp)) { |
mchunkptr p = align_as_chunk(base); |
size_t psize = chunksize(p); |
/* Can unmap if first chunk holds entire segment and not pinned */ |
if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) { |
tchunkptr tp = (tchunkptr)p; |
assert(segment_holds(sp, (char*)sp)); |
if (p == m->dv) { |
m->dv = 0; |
m->dvsize = 0; |
} |
else { |
unlink_large_chunk(m, tp); |
} |
if (CALL_MUNMAP(base, size) == 0) { |
released += size; |
m->footprint -= size; |
/* unlink obsoleted record */ |
sp = pred; |
sp->next = next; |
} |
else { /* back out if cannot unmap */ |
insert_large_chunk(m, tp, psize); |
} |
} |
} |
pred = sp; |
sp = next; |
} |
return released; |
} |
static int sys_trim(mstate m, size_t pad) { |
size_t released = 0; |
if (pad < MAX_REQUEST && is_initialized(m)) { |
pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ |
if (m->topsize > pad) { |
/* Shrink top space in granularity-size units, keeping at least one */ |
size_t unit = mparams.granularity; |
size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - |
SIZE_T_ONE) * unit; |
msegmentptr sp = segment_holding(m, (char*)m->top); |
if (!is_extern_segment(sp)) { |
if (is_mmapped_segment(sp)) { |
if (HAVE_MMAP && |
sp->size >= extra && |
!has_segment_link(m, sp)) { /* can't shrink if pinned */ |
size_t newsize = sp->size - extra; |
/* Prefer mremap, fall back to munmap */ |
if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) || |
(CALL_MUNMAP(sp->base + newsize, extra) == 0)) { |
released = extra; |
} |
} |
} |
else if (HAVE_MORECORE) { |
if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */ |
extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit; |
ACQUIRE_MORECORE_LOCK(); |
{ |
/* Make sure end of memory is where we last set it. */ |
char* old_br = (char*)(CALL_MORECORE(0)); |
if (old_br == sp->base + sp->size) { |
char* rel_br = (char*)(CALL_MORECORE(-extra)); |
char* new_br = (char*)(CALL_MORECORE(0)); |
if (rel_br != CMFAIL && new_br < old_br) |
released = old_br - new_br; |
} |
} |
RELEASE_MORECORE_LOCK(); |
} |
} |
if (released != 0) { |
sp->size -= released; |
m->footprint -= released; |
init_top(m, m->top, m->topsize - released); |
check_top_chunk(m, m->top); |
} |
} |
/* Unmap any unused mmapped segments */ |
if (HAVE_MMAP) |
released += release_unused_segments(m); |
/* On failure, disable autotrim to avoid repeated failed future calls */ |
if (released == 0) |
m->trim_check = MAX_SIZE_T; |
} |
return (released != 0)? 1 : 0; |
} |
/* ---------------------------- malloc support --------------------------- */ |
/* allocate a large request from the best fitting chunk in a treebin */ |
static void* tmalloc_large(mstate m, size_t nb) { |
tchunkptr v = 0; |
size_t rsize = -nb; /* Unsigned negation */ |
tchunkptr t; |
bindex_t idx; |
compute_tree_index(nb, idx); |
if ((t = *treebin_at(m, idx)) != 0) { |
/* Traverse tree for this bin looking for node with size == nb */ |
size_t sizebits = nb << leftshift_for_tree_index(idx); |
tchunkptr rst = 0; /* The deepest untaken right subtree */ |
for (;;) { |
tchunkptr rt; |
size_t trem = chunksize(t) - nb; |
if (trem < rsize) { |
v = t; |
if ((rsize = trem) == 0) |
break; |
} |
rt = t->child[1]; |
t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; |
if (rt != 0 && rt != t) |
rst = rt; |
if (t == 0) { |
t = rst; /* set t to least subtree holding sizes > nb */ |
break; |
} |
sizebits <<= 1; |
} |
} |
if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ |
binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; |
if (leftbits != 0) { |
bindex_t i; |
binmap_t leastbit = least_bit(leftbits); |
compute_bit2idx(leastbit, i); |
t = *treebin_at(m, i); |
} |
} |
while (t != 0) { /* find smallest of tree or subtree */ |
size_t trem = chunksize(t) - nb; |
if (trem < rsize) { |
rsize = trem; |
v = t; |
} |
t = leftmost_child(t); |
} |
/* If dv is a better fit, return 0 so malloc will use it */ |
if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { |
if (RTCHECK(ok_address(m, v))) { /* split */ |
mchunkptr r = chunk_plus_offset(v, nb); |
assert(chunksize(v) == rsize + nb); |
if (RTCHECK(ok_next(v, r))) { |
unlink_large_chunk(m, v); |
if (rsize < MIN_CHUNK_SIZE) |
set_inuse_and_pinuse(m, v, (rsize + nb)); |
else { |
set_size_and_pinuse_of_inuse_chunk(m, v, nb); |
set_size_and_pinuse_of_free_chunk(r, rsize); |
insert_chunk(m, r, rsize); |
} |
return chunk2mem(v); |
} |
} |
CORRUPTION_ERROR_ACTION(m); |
} |
return 0; |
} |
/* allocate a small request from the best fitting chunk in a treebin */ |
static void* tmalloc_small(mstate m, size_t nb) { |
tchunkptr t, v; |
size_t rsize; |
bindex_t i; |
binmap_t leastbit = least_bit(m->treemap); |
compute_bit2idx(leastbit, i); |
v = t = *treebin_at(m, i); |
rsize = chunksize(t) - nb; |
while ((t = leftmost_child(t)) != 0) { |
size_t trem = chunksize(t) - nb; |
if (trem < rsize) { |
rsize = trem; |
v = t; |
} |
} |
if (RTCHECK(ok_address(m, v))) { |
mchunkptr r = chunk_plus_offset(v, nb); |
assert(chunksize(v) == rsize + nb); |
if (RTCHECK(ok_next(v, r))) { |
unlink_large_chunk(m, v); |
if (rsize < MIN_CHUNK_SIZE) |
set_inuse_and_pinuse(m, v, (rsize + nb)); |
else { |
set_size_and_pinuse_of_inuse_chunk(m, v, nb); |
set_size_and_pinuse_of_free_chunk(r, rsize); |
replace_dv(m, r, rsize); |
} |
return chunk2mem(v); |
} |
} |
CORRUPTION_ERROR_ACTION(m); |
return 0; |
} |
/* --------------------------- realloc support --------------------------- */ |
static void* internal_realloc(mstate m, void* oldmem, size_t bytes) { |
if (bytes >= MAX_REQUEST) { |
MALLOC_FAILURE_ACTION; |
return 0; |
} |
if (!PREACTION(m)) { |
mchunkptr oldp = mem2chunk(oldmem); |
size_t oldsize = chunksize(oldp); |
mchunkptr next = chunk_plus_offset(oldp, oldsize); |
mchunkptr newp = 0; |
void* extra = 0; |
/* Try to either shrink or extend into top. Else malloc-copy-free */ |
if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) && |
ok_next(oldp, next) && ok_pinuse(next))) { |
size_t nb = request2size(bytes); |
if (is_mmapped(oldp)) |
newp = mmap_resize(m, oldp, nb); |
else if (oldsize >= nb) { /* already big enough */ |
size_t rsize = oldsize - nb; |
newp = oldp; |
if (rsize >= MIN_CHUNK_SIZE) { |
mchunkptr remainder = chunk_plus_offset(newp, nb); |
set_inuse(m, newp, nb); |
set_inuse(m, remainder, rsize); |
extra = chunk2mem(remainder); |
} |
} |
else if (next == m->top && oldsize + m->topsize > nb) { |
/* Expand into top */ |
size_t newsize = oldsize + m->topsize; |
size_t newtopsize = newsize - nb; |
mchunkptr newtop = chunk_plus_offset(oldp, nb); |
set_inuse(m, oldp, nb); |
newtop->head = newtopsize |PINUSE_BIT; |
m->top = newtop; |
m->topsize = newtopsize; |
newp = oldp; |
} |
} |
else { |
USAGE_ERROR_ACTION(m, oldmem); |
POSTACTION(m); |
return 0; |
} |
POSTACTION(m); |
if (newp != 0) { |
if (extra != 0) { |
internal_free(m, extra); |
} |
check_inuse_chunk(m, newp); |
return chunk2mem(newp); |
} |
else { |
void* newmem = internal_malloc(m, bytes); |
if (newmem != 0) { |
size_t oc = oldsize - overhead_for(oldp); |
memcpy(newmem, oldmem, (oc < bytes)? oc : bytes); |
internal_free(m, oldmem); |
} |
return newmem; |
} |
} |
return 0; |
} |
/* --------------------------- memalign support -------------------------- */ |
static void* internal_memalign(mstate m, size_t alignment, size_t bytes) { |
if (alignment <= MALLOC_ALIGNMENT) /* Can just use malloc */ |
return internal_malloc(m, bytes); |
if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */ |
alignment = MIN_CHUNK_SIZE; |
if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */ |
size_t a = MALLOC_ALIGNMENT << 1; |
while (a < alignment) a <<= 1; |
alignment = a; |
} |
if (bytes >= MAX_REQUEST - alignment) { |
if (m != 0) { /* Test isn't needed but avoids compiler warning */ |
MALLOC_FAILURE_ACTION; |
} |
} |
else { |
size_t nb = request2size(bytes); |
size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD; |
char* mem = (char*)internal_malloc(m, req); |
if (mem != 0) { |
void* leader = 0; |
void* trailer = 0; |
mchunkptr p = mem2chunk(mem); |
if (PREACTION(m)) return 0; |
if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */ |
/* |
Find an aligned spot inside chunk. Since we need to give |
back leading space in a chunk of at least MIN_CHUNK_SIZE, if |
the first calculation places us at a spot with less than |
MIN_CHUNK_SIZE leader, we can move to the next aligned spot. |
We've allocated enough total room so that this is always |
possible. |
*/ |
char* br = (char*)mem2chunk((size_t)(((size_t)(mem + |
alignment - |
SIZE_T_ONE)) & |
-alignment)); |
char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)? |
br : br+alignment; |
mchunkptr newp = (mchunkptr)pos; |
size_t leadsize = pos - (char*)(p); |
size_t newsize = chunksize(p) - leadsize; |
if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */ |
newp->prev_foot = p->prev_foot + leadsize; |
newp->head = (newsize|CINUSE_BIT); |
} |
else { /* Otherwise, give back leader, use the rest */ |
set_inuse(m, newp, newsize); |
set_inuse(m, p, leadsize); |
leader = chunk2mem(p); |
} |
p = newp; |
} |
/* Give back spare room at the end */ |
if (!is_mmapped(p)) { |
size_t size = chunksize(p); |
if (size > nb + MIN_CHUNK_SIZE) { |
size_t remainder_size = size - nb; |
mchunkptr remainder = chunk_plus_offset(p, nb); |
set_inuse(m, p, nb); |
set_inuse(m, remainder, remainder_size); |
trailer = chunk2mem(remainder); |
} |
} |
assert (chunksize(p) >= nb); |
assert((((size_t)(chunk2mem(p))) % alignment) == 0); |
check_inuse_chunk(m, p); |
POSTACTION(m); |
if (leader != 0) { |
internal_free(m, leader); |
} |
if (trailer != 0) { |
internal_free(m, trailer); |
} |
return chunk2mem(p); |
} |
} |
return 0; |
} |
/* ------------------------ comalloc/coalloc support --------------------- */ |
static void** ialloc(mstate m, |
size_t n_elements, |
size_t* sizes, |
int opts, |
void* chunks[]) { |
/* |
This provides common support for independent_X routines, handling |
all of the combinations that can result. |
The opts arg has: |
bit 0 set if all elements are same size (using sizes[0]) |
bit 1 set if elements should be zeroed |
*/ |
size_t element_size; /* chunksize of each element, if all same */ |
size_t contents_size; /* total size of elements */ |
size_t array_size; /* request size of pointer array */ |
void* mem; /* malloced aggregate space */ |
mchunkptr p; /* corresponding chunk */ |
size_t remainder_size; /* remaining bytes while splitting */ |
void** marray; /* either "chunks" or malloced ptr array */ |
mchunkptr array_chunk; /* chunk for malloced ptr array */ |
flag_t was_enabled; /* to disable mmap */ |
size_t size; |
size_t i; |
/* compute array length, if needed */ |
if (chunks != 0) { |
if (n_elements == 0) |
return chunks; /* nothing to do */ |
marray = chunks; |
array_size = 0; |
} |
else { |
/* if empty req, must still return chunk representing empty array */ |
if (n_elements == 0) |
return (void**)internal_malloc(m, 0); |
marray = 0; |
array_size = request2size(n_elements * (sizeof(void*))); |
} |
/* compute total element size */ |
if (opts & 0x1) { /* all-same-size */ |
element_size = request2size(*sizes); |
contents_size = n_elements * element_size; |
} |
else { /* add up all the sizes */ |
element_size = 0; |
contents_size = 0; |
for (i = 0; i != n_elements; ++i) |
contents_size += request2size(sizes[i]); |
} |
size = contents_size + array_size; |
/* |
Allocate the aggregate chunk. First disable direct-mmapping so |
malloc won't use it, since we would not be able to later |
free/realloc space internal to a segregated mmap region. |
*/ |
was_enabled = use_mmap(m); |
disable_mmap(m); |
mem = internal_malloc(m, size - CHUNK_OVERHEAD); |
if (was_enabled) |
enable_mmap(m); |
if (mem == 0) |
return 0; |
if (PREACTION(m)) return 0; |
p = mem2chunk(mem); |
remainder_size = chunksize(p); |
assert(!is_mmapped(p)); |
if (opts & 0x2) { /* optionally clear the elements */ |
memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size); |
} |
/* If not provided, allocate the pointer array as final part of chunk */ |
if (marray == 0) { |
size_t array_chunk_size; |
array_chunk = chunk_plus_offset(p, contents_size); |
array_chunk_size = remainder_size - contents_size; |
marray = (void**) (chunk2mem(array_chunk)); |
set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size); |
remainder_size = contents_size; |
} |
/* split out elements */ |
for (i = 0; ; ++i) { |
marray[i] = chunk2mem(p); |
if (i != n_elements-1) { |
if (element_size != 0) |
size = element_size; |
else |
size = request2size(sizes[i]); |
remainder_size -= size; |
set_size_and_pinuse_of_inuse_chunk(m, p, size); |
p = chunk_plus_offset(p, size); |
} |
else { /* the final element absorbs any overallocation slop */ |
set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size); |
break; |
} |
} |
#if DEBUG |
if (marray != chunks) { |
/* final element must have exactly exhausted chunk */ |
if (element_size != 0) { |
assert(remainder_size == element_size); |
} |
else { |
assert(remainder_size == request2size(sizes[i])); |
} |
check_inuse_chunk(m, mem2chunk(marray)); |
} |
for (i = 0; i != n_elements; ++i) |
check_inuse_chunk(m, mem2chunk(marray[i])); |
#endif /* DEBUG */ |
POSTACTION(m); |
return marray; |
} |
/* -------------------------- public routines ---------------------------- */ |
#if !ONLY_MSPACES |
void* dlmalloc(size_t bytes) { |
/* |
Basic algorithm: |
If a small request (< 256 bytes minus per-chunk overhead): |
1. If one exists, use a remainderless chunk in associated smallbin. |
(Remainderless means that there are too few excess bytes to |
represent as a chunk.) |
2. If it is big enough, use the dv chunk, which is normally the |
chunk adjacent to the one used for the most recent small request. |
3. If one exists, split the smallest available chunk in a bin, |
saving remainder in dv. |
4. If it is big enough, use the top chunk. |
5. If available, get memory from system and use it |
Otherwise, for a large request: |
1. Find the smallest available binned chunk that fits, and use it |
if it is better fitting than dv chunk, splitting if necessary. |
2. If better fitting than any binned chunk, use the dv chunk. |
3. If it is big enough, use the top chunk. |
4. If request size >= mmap threshold, try to directly mmap this chunk. |
5. If available, get memory from system and use it |
The ugly goto's here ensure that postaction occurs along all paths. |
*/ |
if (!PREACTION(gm)) { |
void* mem; |
size_t nb; |
if (bytes <= MAX_SMALL_REQUEST) { |
bindex_t idx; |
binmap_t smallbits; |
nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); |
idx = small_index(nb); |
smallbits = gm->smallmap >> idx; |
if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ |
mchunkptr b, p; |
idx += ~smallbits & 1; /* Uses next bin if idx empty */ |
b = smallbin_at(gm, idx); |
p = b->fd; |
assert(chunksize(p) == small_index2size(idx)); |
unlink_first_small_chunk(gm, b, p, idx); |
set_inuse_and_pinuse(gm, p, small_index2size(idx)); |
mem = chunk2mem(p); |
check_malloced_chunk(gm, mem, nb); |
goto postaction; |
} |
else if (nb > gm->dvsize) { |
if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ |
mchunkptr b, p, r; |
size_t rsize; |
bindex_t i; |
binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); |
binmap_t leastbit = least_bit(leftbits); |
compute_bit2idx(leastbit, i); |
b = smallbin_at(gm, i); |
p = b->fd; |
assert(chunksize(p) == small_index2size(i)); |
unlink_first_small_chunk(gm, b, p, i); |
rsize = small_index2size(i) - nb; |
/* Fit here cannot be remainderless if 4byte sizes */ |
if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) |
set_inuse_and_pinuse(gm, p, small_index2size(i)); |
else { |
set_size_and_pinuse_of_inuse_chunk(gm, p, nb); |
r = chunk_plus_offset(p, nb); |
set_size_and_pinuse_of_free_chunk(r, rsize); |
replace_dv(gm, r, rsize); |
} |
mem = chunk2mem(p); |
check_malloced_chunk(gm, mem, nb); |
goto postaction; |
} |
else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) { |
check_malloced_chunk(gm, mem, nb); |
goto postaction; |
} |
} |
} |
else if (bytes >= MAX_REQUEST) |
nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ |
else { |
nb = pad_request(bytes); |
if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) { |
check_malloced_chunk(gm, mem, nb); |
goto postaction; |
} |
} |
if (nb <= gm->dvsize) { |
size_t rsize = gm->dvsize - nb; |
mchunkptr p = gm->dv; |
if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ |
mchunkptr r = gm->dv = chunk_plus_offset(p, nb); |
gm->dvsize = rsize; |
set_size_and_pinuse_of_free_chunk(r, rsize); |
set_size_and_pinuse_of_inuse_chunk(gm, p, nb); |
} |
else { /* exhaust dv */ |
size_t dvs = gm->dvsize; |
gm->dvsize = 0; |
gm->dv = 0; |
set_inuse_and_pinuse(gm, p, dvs); |
} |
mem = chunk2mem(p); |
check_malloced_chunk(gm, mem, nb); |
goto postaction; |
} |
else if (nb < gm->topsize) { /* Split top */ |
size_t rsize = gm->topsize -= nb; |
mchunkptr p = gm->top; |
mchunkptr r = gm->top = chunk_plus_offset(p, nb); |
r->head = rsize | PINUSE_BIT; |
set_size_and_pinuse_of_inuse_chunk(gm, p, nb); |
mem = chunk2mem(p); |
check_top_chunk(gm, gm->top); |
check_malloced_chunk(gm, mem, nb); |
goto postaction; |
} |
mem = sys_alloc(gm, nb); |
postaction: |
POSTACTION(gm); |
return mem; |
} |
return 0; |
} |
void dlfree(void* mem) { |
/* |
Consolidate freed chunks with preceeding or succeeding bordering |
free chunks, if they exist, and then place in a bin. Intermixed |
with special cases for top, dv, mmapped chunks, and usage errors. |
*/ |
if (mem != 0) { |
mchunkptr p = mem2chunk(mem); |
#if FOOTERS |
mstate fm = get_mstate_for(p); |
if (!ok_magic(fm)) { |
USAGE_ERROR_ACTION(fm, p); |
return; |
} |
#else /* FOOTERS */ |
#define fm gm |
#endif /* FOOTERS */ |
if (!PREACTION(fm)) { |
check_inuse_chunk(fm, p); |
if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { |
size_t psize = chunksize(p); |
mchunkptr next = chunk_plus_offset(p, psize); |
if (!pinuse(p)) { |
size_t prevsize = p->prev_foot; |
if ((prevsize & IS_MMAPPED_BIT) != 0) { |
prevsize &= ~IS_MMAPPED_BIT; |
psize += prevsize + MMAP_FOOT_PAD; |
if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) |
fm->footprint -= psize; |
goto postaction; |
} |
else { |
mchunkptr prev = chunk_minus_offset(p, prevsize); |
psize += prevsize; |
p = prev; |
if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ |
if (p != fm->dv) { |
unlink_chunk(fm, p, prevsize); |
} |
else if ((next->head & INUSE_BITS) == INUSE_BITS) { |
fm->dvsize = psize; |
set_free_with_pinuse(p, psize, next); |
goto postaction; |
} |
} |
else |
goto erroraction; |
} |
} |
if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { |
if (!cinuse(next)) { /* consolidate forward */ |
if (next == fm->top) { |
size_t tsize = fm->topsize += psize; |
fm->top = p; |
p->head = tsize | PINUSE_BIT; |
if (p == fm->dv) { |
fm->dv = 0; |
fm->dvsize = 0; |
} |
if (should_trim(fm, tsize)) |
sys_trim(fm, 0); |
goto postaction; |
} |
else if (next == fm->dv) { |
size_t dsize = fm->dvsize += psize; |
fm->dv = p; |
set_size_and_pinuse_of_free_chunk(p, dsize); |
goto postaction; |
} |
else { |
size_t nsize = chunksize(next); |
psize += nsize; |
unlink_chunk(fm, next, nsize); |
set_size_and_pinuse_of_free_chunk(p, psize); |
if (p == fm->dv) { |
fm->dvsize = psize; |
goto postaction; |
} |
} |
} |
else |
set_free_with_pinuse(p, psize, next); |
insert_chunk(fm, p, psize); |
check_free_chunk(fm, p); |
goto postaction; |
} |
} |
erroraction: |
USAGE_ERROR_ACTION(fm, p); |
postaction: |
POSTACTION(fm); |
} |
} |
#if !FOOTERS |
#undef fm |
#endif /* FOOTERS */ |
} |
void* dlcalloc(size_t n_elements, size_t elem_size) { |
void* mem; |
size_t req = 0; |
if (n_elements != 0) { |
req = n_elements * elem_size; |
if (((n_elements | elem_size) & ~(size_t)0xffff) && |
(req / n_elements != elem_size)) |
req = MAX_SIZE_T; /* force downstream failure on overflow */ |
} |
mem = dlmalloc(req); |
if (mem != 0 && calloc_must_clear(mem2chunk(mem))) |
memset(mem, 0, req); |
return mem; |
} |
void* dlrealloc(void* oldmem, size_t bytes) { |
if (oldmem == 0) |
return dlmalloc(bytes); |
#ifdef REALLOC_ZERO_BYTES_FREES |
if (bytes == 0) { |
dlfree(oldmem); |
return 0; |
} |
#endif /* REALLOC_ZERO_BYTES_FREES */ |
else { |
#if ! FOOTERS |
mstate m = gm; |
#else /* FOOTERS */ |
mstate m = get_mstate_for(mem2chunk(oldmem)); |
if (!ok_magic(m)) { |
USAGE_ERROR_ACTION(m, oldmem); |
return 0; |
} |
#endif /* FOOTERS */ |
return internal_realloc(m, oldmem, bytes); |
} |
} |
void* dlmemalign(size_t alignment, size_t bytes) { |
return internal_memalign(gm, alignment, bytes); |
} |
void** dlindependent_calloc(size_t n_elements, size_t elem_size, |
void* chunks[]) { |
size_t sz = elem_size; /* serves as 1-element array */ |
return ialloc(gm, n_elements, &sz, 3, chunks); |
} |
void** dlindependent_comalloc(size_t n_elements, size_t sizes[], |
void* chunks[]) { |
return ialloc(gm, n_elements, sizes, 0, chunks); |
} |
void* dlvalloc(size_t bytes) { |
size_t pagesz; |
init_mparams(); |
pagesz = mparams.page_size; |
return dlmemalign(pagesz, bytes); |
} |
void* dlpvalloc(size_t bytes) { |
size_t pagesz; |
init_mparams(); |
pagesz = mparams.page_size; |
return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE)); |
} |
int dlmalloc_trim(size_t pad) { |
int result = 0; |
if (!PREACTION(gm)) { |
result = sys_trim(gm, pad); |
POSTACTION(gm); |
} |
return result; |
} |
size_t dlmalloc_footprint(void) { |
return gm->footprint; |
} |
size_t dlmalloc_max_footprint(void) { |
return gm->max_footprint; |
} |
#if !NO_MALLINFO |
struct mallinfo dlmallinfo(void) { |
return internal_mallinfo(gm); |
} |
#endif /* NO_MALLINFO */ |
void dlmalloc_stats() { |
internal_malloc_stats(gm); |
} |
size_t dlmalloc_usable_size(void* mem) { |
if (mem != 0) { |
mchunkptr p = mem2chunk(mem); |
if (cinuse(p)) |
return chunksize(p) - overhead_for(p); |
} |
return 0; |
} |
int dlmallopt(int param_number, int value) { |
return change_mparam(param_number, value); |
} |
#endif /* !ONLY_MSPACES */ |
/* ----------------------------- user mspaces ---------------------------- */ |
#if MSPACES |
static mstate init_user_mstate(char* tbase, size_t tsize) { |
size_t msize = pad_request(sizeof(struct malloc_state)); |
mchunkptr mn; |
mchunkptr msp = align_as_chunk(tbase); |
mstate m = (mstate)(chunk2mem(msp)); |
memset(m, 0, msize); |
INITIAL_LOCK(&m->mutex); |
msp->head = (msize|PINUSE_BIT|CINUSE_BIT); |
m->seg.base = m->least_addr = tbase; |
m->seg.size = m->footprint = m->max_footprint = tsize; |
m->magic = mparams.magic; |
m->mflags = mparams.default_mflags; |
disable_contiguous(m); |
init_bins(m); |
mn = next_chunk(mem2chunk(m)); |
init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE); |
check_top_chunk(m, m->top); |
return m; |
} |
mspace create_mspace(size_t capacity, int locked) { |
mstate m = 0; |
size_t msize = pad_request(sizeof(struct malloc_state)); |
init_mparams(); /* Ensure pagesize etc initialized */ |
if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { |
size_t rs = ((capacity == 0)? mparams.granularity : |
(capacity + TOP_FOOT_SIZE + msize)); |
size_t tsize = granularity_align(rs); |
char* tbase = (char*)(CALL_MMAP(tsize)); |
if (tbase != CMFAIL) { |
m = init_user_mstate(tbase, tsize); |
m->seg.sflags = IS_MMAPPED_BIT; |
set_lock(m, locked); |
} |
} |
return (mspace)m; |
} |
mspace create_mspace_with_base(void* base, size_t capacity, int locked) { |
mstate m = 0; |
size_t msize = pad_request(sizeof(struct malloc_state)); |
init_mparams(); /* Ensure pagesize etc initialized */ |
if (capacity > msize + TOP_FOOT_SIZE && |
capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { |
m = init_user_mstate((char*)base, capacity); |
m->seg.sflags = EXTERN_BIT; |
set_lock(m, locked); |
} |
return (mspace)m; |
} |
size_t destroy_mspace(mspace msp) { |
size_t freed = 0; |
mstate ms = (mstate)msp; |
if (ok_magic(ms)) { |
msegmentptr sp = &ms->seg; |
while (sp != 0) { |
char* base = sp->base; |
size_t size = sp->size; |
flag_t flag = sp->sflags; |
sp = sp->next; |
if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) && |
CALL_MUNMAP(base, size) == 0) |
freed += size; |
} |
} |
else { |
USAGE_ERROR_ACTION(ms,ms); |
} |
return freed; |
} |
/* |
mspace versions of routines are near-clones of the global |
versions. This is not so nice but better than the alternatives. |
*/ |
void* mspace_malloc(mspace msp, size_t bytes) { |
mstate ms = (mstate)msp; |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
return 0; |
} |
if (!PREACTION(ms)) { |
void* mem; |
size_t nb; |
if (bytes <= MAX_SMALL_REQUEST) { |
bindex_t idx; |
binmap_t smallbits; |
nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); |
idx = small_index(nb); |
smallbits = ms->smallmap >> idx; |
if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ |
mchunkptr b, p; |
idx += ~smallbits & 1; /* Uses next bin if idx empty */ |
b = smallbin_at(ms, idx); |
p = b->fd; |
assert(chunksize(p) == small_index2size(idx)); |
unlink_first_small_chunk(ms, b, p, idx); |
set_inuse_and_pinuse(ms, p, small_index2size(idx)); |
mem = chunk2mem(p); |
check_malloced_chunk(ms, mem, nb); |
goto postaction; |
} |
else if (nb > ms->dvsize) { |
if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ |
mchunkptr b, p, r; |
size_t rsize; |
bindex_t i; |
binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); |
binmap_t leastbit = least_bit(leftbits); |
compute_bit2idx(leastbit, i); |
b = smallbin_at(ms, i); |
p = b->fd; |
assert(chunksize(p) == small_index2size(i)); |
unlink_first_small_chunk(ms, b, p, i); |
rsize = small_index2size(i) - nb; |
/* Fit here cannot be remainderless if 4byte sizes */ |
if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) |
set_inuse_and_pinuse(ms, p, small_index2size(i)); |
else { |
set_size_and_pinuse_of_inuse_chunk(ms, p, nb); |
r = chunk_plus_offset(p, nb); |
set_size_and_pinuse_of_free_chunk(r, rsize); |
replace_dv(ms, r, rsize); |
} |
mem = chunk2mem(p); |
check_malloced_chunk(ms, mem, nb); |
goto postaction; |
} |
else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { |
check_malloced_chunk(ms, mem, nb); |
goto postaction; |
} |
} |
} |
else if (bytes >= MAX_REQUEST) |
nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ |
else { |
nb = pad_request(bytes); |
if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { |
check_malloced_chunk(ms, mem, nb); |
goto postaction; |
} |
} |
if (nb <= ms->dvsize) { |
size_t rsize = ms->dvsize - nb; |
mchunkptr p = ms->dv; |
if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ |
mchunkptr r = ms->dv = chunk_plus_offset(p, nb); |
ms->dvsize = rsize; |
set_size_and_pinuse_of_free_chunk(r, rsize); |
set_size_and_pinuse_of_inuse_chunk(ms, p, nb); |
} |
else { /* exhaust dv */ |
size_t dvs = ms->dvsize; |
ms->dvsize = 0; |
ms->dv = 0; |
set_inuse_and_pinuse(ms, p, dvs); |
} |
mem = chunk2mem(p); |
check_malloced_chunk(ms, mem, nb); |
goto postaction; |
} |
else if (nb < ms->topsize) { /* Split top */ |
size_t rsize = ms->topsize -= nb; |
mchunkptr p = ms->top; |
mchunkptr r = ms->top = chunk_plus_offset(p, nb); |
r->head = rsize | PINUSE_BIT; |
set_size_and_pinuse_of_inuse_chunk(ms, p, nb); |
mem = chunk2mem(p); |
check_top_chunk(ms, ms->top); |
check_malloced_chunk(ms, mem, nb); |
goto postaction; |
} |
mem = sys_alloc(ms, nb); |
postaction: |
POSTACTION(ms); |
return mem; |
} |
return 0; |
} |
void mspace_free(mspace msp, void* mem) { |
if (mem != 0) { |
mchunkptr p = mem2chunk(mem); |
#if FOOTERS |
mstate fm = get_mstate_for(p); |
#else /* FOOTERS */ |
mstate fm = (mstate)msp; |
#endif /* FOOTERS */ |
if (!ok_magic(fm)) { |
USAGE_ERROR_ACTION(fm, p); |
return; |
} |
if (!PREACTION(fm)) { |
check_inuse_chunk(fm, p); |
if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { |
size_t psize = chunksize(p); |
mchunkptr next = chunk_plus_offset(p, psize); |
if (!pinuse(p)) { |
size_t prevsize = p->prev_foot; |
if ((prevsize & IS_MMAPPED_BIT) != 0) { |
prevsize &= ~IS_MMAPPED_BIT; |
psize += prevsize + MMAP_FOOT_PAD; |
if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) |
fm->footprint -= psize; |
goto postaction; |
} |
else { |
mchunkptr prev = chunk_minus_offset(p, prevsize); |
psize += prevsize; |
p = prev; |
if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ |
if (p != fm->dv) { |
unlink_chunk(fm, p, prevsize); |
} |
else if ((next->head & INUSE_BITS) == INUSE_BITS) { |
fm->dvsize = psize; |
set_free_with_pinuse(p, psize, next); |
goto postaction; |
} |
} |
else |
goto erroraction; |
} |
} |
if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { |
if (!cinuse(next)) { /* consolidate forward */ |
if (next == fm->top) { |
size_t tsize = fm->topsize += psize; |
fm->top = p; |
p->head = tsize | PINUSE_BIT; |
if (p == fm->dv) { |
fm->dv = 0; |
fm->dvsize = 0; |
} |
if (should_trim(fm, tsize)) |
sys_trim(fm, 0); |
goto postaction; |
} |
else if (next == fm->dv) { |
size_t dsize = fm->dvsize += psize; |
fm->dv = p; |
set_size_and_pinuse_of_free_chunk(p, dsize); |
goto postaction; |
} |
else { |
size_t nsize = chunksize(next); |
psize += nsize; |
unlink_chunk(fm, next, nsize); |
set_size_and_pinuse_of_free_chunk(p, psize); |
if (p == fm->dv) { |
fm->dvsize = psize; |
goto postaction; |
} |
} |
} |
else |
set_free_with_pinuse(p, psize, next); |
insert_chunk(fm, p, psize); |
check_free_chunk(fm, p); |
goto postaction; |
} |
} |
erroraction: |
USAGE_ERROR_ACTION(fm, p); |
postaction: |
POSTACTION(fm); |
} |
} |
} |
void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) { |
void* mem; |
size_t req = 0; |
mstate ms = (mstate)msp; |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
return 0; |
} |
if (n_elements != 0) { |
req = n_elements * elem_size; |
if (((n_elements | elem_size) & ~(size_t)0xffff) && |
(req / n_elements != elem_size)) |
req = MAX_SIZE_T; /* force downstream failure on overflow */ |
} |
mem = internal_malloc(ms, req); |
if (mem != 0 && calloc_must_clear(mem2chunk(mem))) |
memset(mem, 0, req); |
return mem; |
} |
void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) { |
if (oldmem == 0) |
return mspace_malloc(msp, bytes); |
#ifdef REALLOC_ZERO_BYTES_FREES |
if (bytes == 0) { |
mspace_free(msp, oldmem); |
return 0; |
} |
#endif /* REALLOC_ZERO_BYTES_FREES */ |
else { |
#if FOOTERS |
mchunkptr p = mem2chunk(oldmem); |
mstate ms = get_mstate_for(p); |
#else /* FOOTERS */ |
mstate ms = (mstate)msp; |
#endif /* FOOTERS */ |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
return 0; |
} |
return internal_realloc(ms, oldmem, bytes); |
} |
} |
void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) { |
mstate ms = (mstate)msp; |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
return 0; |
} |
return internal_memalign(ms, alignment, bytes); |
} |
void** mspace_independent_calloc(mspace msp, size_t n_elements, |
size_t elem_size, void* chunks[]) { |
size_t sz = elem_size; /* serves as 1-element array */ |
mstate ms = (mstate)msp; |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
return 0; |
} |
return ialloc(ms, n_elements, &sz, 3, chunks); |
} |
void** mspace_independent_comalloc(mspace msp, size_t n_elements, |
size_t sizes[], void* chunks[]) { |
mstate ms = (mstate)msp; |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
return 0; |
} |
return ialloc(ms, n_elements, sizes, 0, chunks); |
} |
int mspace_trim(mspace msp, size_t pad) { |
int result = 0; |
mstate ms = (mstate)msp; |
if (ok_magic(ms)) { |
if (!PREACTION(ms)) { |
result = sys_trim(ms, pad); |
POSTACTION(ms); |
} |
} |
else { |
USAGE_ERROR_ACTION(ms,ms); |
} |
return result; |
} |
void mspace_malloc_stats(mspace msp) { |
mstate ms = (mstate)msp; |
if (ok_magic(ms)) { |
internal_malloc_stats(ms); |
} |
else { |
USAGE_ERROR_ACTION(ms,ms); |
} |
} |
size_t mspace_footprint(mspace msp) { |
size_t result; |
mstate ms = (mstate)msp; |
if (ok_magic(ms)) { |
result = ms->footprint; |
} |
USAGE_ERROR_ACTION(ms,ms); |
return result; |
} |
size_t mspace_max_footprint(mspace msp) { |
size_t result; |
mstate ms = (mstate)msp; |
if (ok_magic(ms)) { |
result = ms->max_footprint; |
} |
USAGE_ERROR_ACTION(ms,ms); |
return result; |
} |
#if !NO_MALLINFO |
struct mallinfo mspace_mallinfo(mspace msp) { |
mstate ms = (mstate)msp; |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
} |
return internal_mallinfo(ms); |
} |
#endif /* NO_MALLINFO */ |
int mspace_mallopt(int param_number, int value) { |
return change_mparam(param_number, value); |
} |
#endif /* MSPACES */ |
/* -------------------- Alternative MORECORE functions ------------------- */ |
/* |
Guidelines for creating a custom version of MORECORE: |
* For best performance, MORECORE should allocate in multiples of pagesize. |
* MORECORE may allocate more memory than requested. (Or even less, |
but this will usually result in a malloc failure.) |
* MORECORE must not allocate memory when given argument zero, but |
instead return one past the end address of memory from previous |
nonzero call. |
* For best performance, consecutive calls to MORECORE with positive |
arguments should return increasing addresses, indicating that |
space has been contiguously extended. |
* Even though consecutive calls to MORECORE need not return contiguous |
addresses, it must be OK for malloc'ed chunks to span multiple |
regions in those cases where they do happen to be contiguous. |
* MORECORE need not handle negative arguments -- it may instead |
just return MFAIL when given negative arguments. |
Negative arguments are always multiples of pagesize. MORECORE |
must not misinterpret negative args as large positive unsigned |
args. You can suppress all such calls from even occurring by defining |
MORECORE_CANNOT_TRIM, |
As an example alternative MORECORE, here is a custom allocator |
kindly contributed for pre-OSX macOS. It uses virtually but not |
necessarily physically contiguous non-paged memory (locked in, |
present and won't get swapped out). You can use it by uncommenting |
this section, adding some #includes, and setting up the appropriate |
defines above: |
#define MORECORE osMoreCore |
There is also a shutdown routine that should somehow be called for |
cleanup upon program exit. |
#define MAX_POOL_ENTRIES 100 |
#define MINIMUM_MORECORE_SIZE (64 * 1024U) |
static int next_os_pool; |
void *our_os_pools[MAX_POOL_ENTRIES]; |
void *osMoreCore(int size) |
{ |
void *ptr = 0; |
static void *sbrk_top = 0; |
if (size > 0) |
{ |
if (size < MINIMUM_MORECORE_SIZE) |
size = MINIMUM_MORECORE_SIZE; |
if (CurrentExecutionLevel() == kTaskLevel) |
ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0); |
if (ptr == 0) |
{ |
return (void *) MFAIL; |
} |
// save ptrs so they can be freed during cleanup |
our_os_pools[next_os_pool] = ptr; |
next_os_pool++; |
ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK); |
sbrk_top = (char *) ptr + size; |
return ptr; |
} |
else if (size < 0) |
{ |
// we don't currently support shrink behavior |
return (void *) MFAIL; |
} |
else |
{ |
return sbrk_top; |
} |
} |
// cleanup any allocated memory pools |
// called as last thing before shutting down driver |
void osCleanupMem(void) |
{ |
void **ptr; |
for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++) |
if (*ptr) |
{ |
PoolDeallocate(*ptr); |
*ptr = 0; |
} |
} |
*/ |
/* ----------------------------------------------------------------------- |
History: |
V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee) |
* Add max_footprint functions |
* Ensure all appropriate literals are size_t |
* Fix conditional compilation problem for some #define settings |
* Avoid concatenating segments with the one provided |
in create_mspace_with_base |
* Rename some variables to avoid compiler shadowing warnings |
* Use explicit lock initialization. |
* Better handling of sbrk interference. |
* Simplify and fix segment insertion, trimming and mspace_destroy |
* Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x |
* Thanks especially to Dennis Flanagan for help on these. |
V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee) |
* Fix memalign brace error. |
V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee) |
* Fix improper #endif nesting in C++ |
* Add explicit casts needed for C++ |
V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee) |
* Use trees for large bins |
* Support mspaces |
* Use segments to unify sbrk-based and mmap-based system allocation, |
removing need for emulation on most platforms without sbrk. |
* Default safety checks |
* Optional footer checks. Thanks to William Robertson for the idea. |
* Internal code refactoring |
* Incorporate suggestions and platform-specific changes. |
Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas, |
Aaron Bachmann, Emery Berger, and others. |
* Speed up non-fastbin processing enough to remove fastbins. |
* Remove useless cfree() to avoid conflicts with other apps. |
* Remove internal memcpy, memset. Compilers handle builtins better. |
* Remove some options that no one ever used and rename others. |
V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee) |
* Fix malloc_state bitmap array misdeclaration |
V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee) |
* Allow tuning of FIRST_SORTED_BIN_SIZE |
* Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte. |
* Better detection and support for non-contiguousness of MORECORE. |
Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger |
* Bypass most of malloc if no frees. Thanks To Emery Berger. |
* Fix freeing of old top non-contiguous chunk im sysmalloc. |
* Raised default trim and map thresholds to 256K. |
* Fix mmap-related #defines. Thanks to Lubos Lunak. |
* Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield. |
* Branch-free bin calculation |
* Default trim and mmap thresholds now 256K. |
V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee) |
* Introduce independent_comalloc and independent_calloc. |
Thanks to Michael Pachos for motivation and help. |
* Make optional .h file available |
* Allow > 2GB requests on 32bit systems. |
* new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>. |
Thanks also to Andreas Mueller <a.mueller at paradatec.de>, |
and Anonymous. |
* Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for |
helping test this.) |
* memalign: check alignment arg |
* realloc: don't try to shift chunks backwards, since this |
leads to more fragmentation in some programs and doesn't |
seem to help in any others. |
* Collect all cases in malloc requiring system memory into sysmalloc |
* Use mmap as backup to sbrk |
* Place all internal state in malloc_state |
* Introduce fastbins (although similar to 2.5.1) |
* Many minor tunings and cosmetic improvements |
* Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK |
* Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS |
Thanks to Tony E. Bennett <tbennett@nvidia.com> and others. |
* Include errno.h to support default failure action. |
V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee) |
* return null for negative arguments |
* Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com> |
* Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h' |
(e.g. WIN32 platforms) |
* Cleanup header file inclusion for WIN32 platforms |
* Cleanup code to avoid Microsoft Visual C++ compiler complaints |
* Add 'USE_DL_PREFIX' to quickly allow co-existence with existing |
memory allocation routines |
* Set 'malloc_getpagesize' for WIN32 platforms (needs more work) |
* Use 'assert' rather than 'ASSERT' in WIN32 code to conform to |
usage of 'assert' in non-WIN32 code |
* Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to |
avoid infinite loop |
* Always call 'fREe()' rather than 'free()' |
V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) |
* Fixed ordering problem with boundary-stamping |
V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) |
* Added pvalloc, as recommended by H.J. Liu |
* Added 64bit pointer support mainly from Wolfram Gloger |
* Added anonymously donated WIN32 sbrk emulation |
* Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen |
* malloc_extend_top: fix mask error that caused wastage after |
foreign sbrks |
* Add linux mremap support code from HJ Liu |
V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) |
* Integrated most documentation with the code. |
* Add support for mmap, with help from |
Wolfram Gloger (Gloger@lrz.uni-muenchen.de). |
* Use last_remainder in more cases. |
* Pack bins using idea from colin@nyx10.cs.du.edu |
* Use ordered bins instead of best-fit threshhold |
* Eliminate block-local decls to simplify tracing and debugging. |
* Support another case of realloc via move into top |
* Fix error occuring when initial sbrk_base not word-aligned. |
* Rely on page size for units instead of SBRK_UNIT to |
avoid surprises about sbrk alignment conventions. |
* Add mallinfo, mallopt. Thanks to Raymond Nijssen |
(raymond@es.ele.tue.nl) for the suggestion. |
* Add `pad' argument to malloc_trim and top_pad mallopt parameter. |
* More precautions for cases where other routines call sbrk, |
courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). |
* Added macros etc., allowing use in linux libc from |
H.J. Lu (hjl@gnu.ai.mit.edu) |
* Inverted this history list |
V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) |
* Re-tuned and fixed to behave more nicely with V2.6.0 changes. |
* Removed all preallocation code since under current scheme |
the work required to undo bad preallocations exceeds |
the work saved in good cases for most test programs. |
* No longer use return list or unconsolidated bins since |
no scheme using them consistently outperforms those that don't |
given above changes. |
* Use best fit for very large chunks to prevent some worst-cases. |
* Added some support for debugging |
V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) |
* Removed footers when chunks are in use. Thanks to |
Paul Wilson (wilson@cs.texas.edu) for the suggestion. |
V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) |
* Added malloc_trim, with help from Wolfram Gloger |
(wmglo@Dent.MED.Uni-Muenchen.DE). |
V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) |
V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) |
* realloc: try to expand in both directions |
* malloc: swap order of clean-bin strategy; |
* realloc: only conditionally expand backwards |
* Try not to scavenge used bins |
* Use bin counts as a guide to preallocation |
* Occasionally bin return list chunks in first scan |
* Add a few optimizations from colin@nyx10.cs.du.edu |
V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) |
* faster bin computation & slightly different binning |
* merged all consolidations to one part of malloc proper |
(eliminating old malloc_find_space & malloc_clean_bin) |
* Scan 2 returns chunks (not just 1) |
* Propagate failure in realloc if malloc returns 0 |
* Add stuff to allow compilation on non-ANSI compilers |
from kpv@research.att.com |
V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) |
* removed potential for odd address access in prev_chunk |
* removed dependency on getpagesize.h |
* misc cosmetics and a bit more internal documentation |
* anticosmetics: mangled names in macros to evade debugger strangeness |
* tested on sparc, hp-700, dec-mips, rs6000 |
with gcc & native cc (hp, dec only) allowing |
Detlefs & Zorn comparison study (in SIGPLAN Notices.) |
Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) |
* Based loosely on libg++-1.2X malloc. (It retains some of the overall |
structure of old version, but most details differ.) |
*/ |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/libc.c |
---|
0,0 → 1,80 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup lc Libc |
* @brief HelenOS C library |
* @{ |
* @} |
*/ |
/** @addtogroup libc generic |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#include <libc.h> |
#include <unistd.h> |
#include <thread.h> |
#include <malloc.h> |
#include <psthread.h> |
#include <io/stream.h> |
#include <ipc/ipc.h> |
#include <async.h> |
#include <as.h> |
extern char _heap; |
void _exit(int status) { |
thread_exit(status); |
} |
void __main(void) { |
psthread_data_t *pt; |
(void) as_area_create(&_heap, 1, AS_AREA_WRITE | AS_AREA_READ); |
_async_init(); |
pt = psthread_setup(); |
__tcb_set(pt->tcb); |
} |
void __io_init(void) { |
open("stdin", 0); |
open("stdout", 0); |
open("stderr", 0); |
} |
void __exit(void) { |
psthread_teardown(__tcb_get()->pst_data); |
_exit(0); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/time.c |
---|
0,0 → 1,123 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <sys/time.h> |
#include <unistd.h> |
#include <ipc/ipc.h> |
#include <stdio.h> |
#include <arch/barrier.h> |
#include <unistd.h> |
#include <atomic.h> |
#include <futex.h> |
#include <ipc/services.h> |
#include <sysinfo.h> |
#include <as.h> |
#include <ddi.h> |
/* Pointers to public variables with time */ |
struct { |
volatile sysarg_t seconds1; |
volatile sysarg_t useconds; |
volatile sysarg_t seconds2; |
} *ktime = NULL; |
/** POSIX gettimeofday |
* |
* The time variables are memory mapped(RO) from kernel, which updates |
* them periodically. As it is impossible to read 2 values atomically, we |
* use a trick: First read a seconds, then read microseconds, then |
* read seconds again. If a second elapsed in the meantime, read |
* useconds again. This provides assurance, that at least the |
* sequence of subsequent gettimeofday calls is ordered. |
*/ |
int gettimeofday(struct timeval *tv, struct timezone *tz) |
{ |
void *mapping; |
sysarg_t s1, s2; |
sysarg_t rights; |
int res; |
if (!ktime) { |
mapping = as_get_mappable_page(PAGE_SIZE); |
/* Get the mapping of kernel clock */ |
res = ipc_call_sync_3(PHONE_NS, IPC_M_AS_AREA_RECV, |
mapping, PAGE_SIZE, SERVICE_MEM_REALTIME, |
NULL,&rights,NULL); |
if (res) { |
printf("Failed to initialize timeofday memarea\n"); |
_exit(1); |
} |
if (! (rights & AS_AREA_READ)) { |
printf("Received bad rights on time area: %X\n", |
rights); |
as_area_destroy(mapping); |
_exit(1); |
} |
ktime = mapping; |
} |
if (tz) { |
tz->tz_minuteswest = 0; |
tz->tz_dsttime = DST_NONE; |
} |
s2 = ktime->seconds2; |
read_barrier(); |
tv->tv_usec = ktime->useconds; |
read_barrier(); |
s1 = ktime->seconds1; |
if (s1 != s2) { |
tv->tv_usec = 0; |
tv->tv_sec = s1 > s2 ? s1 : s2; |
} else |
tv->tv_sec = s1; |
return 0; |
} |
/** Wait unconditionally for specified microseconds */ |
void usleep(unsigned long usec) |
{ |
atomic_t futex = FUTEX_INITIALIZER; |
futex_initialize(&futex,0); |
futex_down_timeout(&futex, usec, 0); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/ddi.c |
---|
0,0 → 1,95 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <ddi.h> |
#include <libc.h> |
#include <task.h> |
#include <kernel/ddi/ddi_arg.h> |
/** Map piece of physical memory to task. |
* |
* Caller of this function must have the CAP_MEM_MANAGER capability. |
* |
* @param pf Physical address of the starting frame. |
* @param vp Virtual address of the sterting page. |
* @param pages Number of pages to map. |
* @param flags Flags for the new address space area. |
* |
* @return 0 on success, EPERM if the caller lacks the CAP_MEM_MANAGER capability, |
* ENOENT if there is no task with specified ID and ENOMEM if there |
* was some problem in creating address space area. |
*/ |
int map_physmem(void *pf, void *vp, unsigned long pages, int flags) |
{ |
return __SYSCALL4(SYS_MAP_PHYSMEM, (sysarg_t) pf, (sysarg_t)vp, pages, flags); |
} |
/** Enable I/O space range to task. |
* |
* Caller of this function must have the IO_MEM_MANAGER capability. |
* |
* @param id Task ID. |
* @param ioaddr Starting address of the I/O range. |
* @param size Size of the range. |
* |
* @return 0 on success, EPERM if the caller lacks the CAP_IO_MANAGER capability, |
* ENOENT if there is no task with specified ID and ENOMEM if there |
* was some problem in allocating memory. |
*/ |
int iospace_enable(task_id_t id, void *ioaddr, unsigned long size) |
{ |
task_id_t task_id; |
ddi_ioarg_t arg; |
arg.task_id = id; |
arg.ioaddr = ioaddr; |
arg.size = size; |
return __SYSCALL1(SYS_IOSPACE_ENABLE, (sysarg_t) &arg); |
} |
/** Interrupt control |
* |
* @param enable 1 - enable interrupts, 0 - disable interrupts |
*/ |
int preemption_control(int enable) |
{ |
return __SYSCALL1(SYS_PREEMPT_CONTROL, (sysarg_t) enable); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/task.c |
---|
0,0 → 1,51 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <task.h> |
#include <libc.h> |
task_id_t task_get_id(void) |
{ |
task_id_t task_id; |
(void) __SYSCALL1(SYS_TASK_GET_ID, (sysarg_t) &task_id); |
return task_id; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/cap.c |
---|
0,0 → 1,78 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** |
* @file cap.c |
* @brief Functions to grant/revoke capabilities to/from a task. |
*/ |
#include <cap.h> |
#include <task.h> |
#include <libc.h> |
#include <kernel/syscall/sysarg64.h> |
/** Grant capabilities to a task. |
* |
* @param id Destination task ID. |
* @param caps Capabilities to grant. |
* |
* @return Zero on success or a value from @ref errno.h on failure. |
*/ |
int cap_grant(task_id_t id, unsigned int caps) |
{ |
sysarg64_t arg; |
arg.value = (unsigned long long) id; |
__SYSCALL2(SYS_CAP_GRANT, (sysarg_t) &arg, (sysarg_t) caps); |
} |
/** Revoke capabilities from a task. |
* |
* @param id Destination task ID. |
* @param caps Capabilities to revoke. |
* |
* @return Zero on success or a value from @ref errno.h on failure. |
*/ |
int cap_revoke(task_id_t id, unsigned int caps) |
{ |
sysarg64_t arg; |
arg.value = (unsigned long long) id; |
__SYSCALL2(SYS_CAP_REVOKE, (sysarg_t) &arg, (sysarg_t) caps); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/as.c |
---|
0,0 → 1,154 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <as.h> |
#include <libc.h> |
#include <unistd.h> |
#include <align.h> |
/** Create address space area. |
* |
* @param address Virtual address where to place new address space area. |
* @param size Size of the area. |
* @param flags Flags describing type of the area. |
* |
* @return address on success, (void *) -1 otherwise. |
*/ |
void *as_area_create(void *address, size_t size, int flags) |
{ |
return (void *) __SYSCALL3(SYS_AS_AREA_CREATE, (sysarg_t ) address, (sysarg_t) size, (sysarg_t) flags); |
} |
/** Resize address space area. |
* |
* @param address Virtual address pointing into already existing address space area. |
* @param size New requested size of the area. |
* @param flags Currently unused. |
* |
* @return Zero on success or a code from @ref errno.h on failure. |
*/ |
int as_area_resize(void *address, size_t size, int flags) |
{ |
return __SYSCALL3(SYS_AS_AREA_RESIZE, (sysarg_t ) address, (sysarg_t) size, (sysarg_t) flags); |
} |
/** Destroy address space area. |
* |
* @param address Virtual address pointing into the address space area being destroyed. |
* |
* @return Zero on success or a code from @ref errno.h on failure. |
*/ |
int as_area_destroy(void *address) |
{ |
return __SYSCALL1(SYS_AS_AREA_DESTROY, (sysarg_t ) address); |
} |
static size_t heapsize = 0; |
static size_t maxheapsize = (size_t)(-1); |
static void * last_allocated = 0; |
/* Start of heap linker symbol */ |
extern char _heap; |
/** Sbrk emulation |
* |
* @param incr New area that should be allocated or negative, |
if it should be shrinked |
* @return Pointer to newly allocated area |
*/ |
void *sbrk(ssize_t incr) |
{ |
int rc; |
void *res; |
/* Check for invalid values */ |
if (incr < 0 && -incr > heapsize) |
return NULL; |
/* Check for too large value */ |
if (incr > 0 && incr+heapsize < heapsize) |
return NULL; |
/* Check for too small values */ |
if (incr < 0 && incr+heapsize > heapsize) |
return NULL; |
/* Check for user limit */ |
if ((maxheapsize!=(size_t)(-1)) && (heapsize + incr)>maxheapsize) return NULL; |
rc = as_area_resize(&_heap, heapsize + incr,0); |
if (rc != 0) |
return NULL; |
/* Compute start of new area */ |
res = (void *)&_heap + heapsize; |
heapsize += incr; |
return res; |
} |
/** Set maximum heap size and return pointer just after the heap */ |
void *set_maxheapsize(size_t mhs) |
{ |
maxheapsize=mhs; |
/* Return pointer to area not managed by sbrk */ |
return (void *)&_heap + maxheapsize; |
} |
/** Return pointer to some unmapped area, where fits new as_area |
* |
* TODO: make some first_fit/... algorithm, we are now just incrementing |
* the pointer to last area |
*/ |
void * as_get_mappable_page(size_t sz) |
{ |
void *res; |
/* Set heapsize to some meaningful value */ |
if (maxheapsize == -1) |
set_maxheapsize(ALIGN_UP(USER_ADDRESS_SPACE_SIZE_ARCH>>1,PAGE_SIZE)); |
if (!last_allocated) |
last_allocated = ALIGN_UP((void *)&_heap + maxheapsize, PAGE_SIZE); |
sz = ALIGN_UP(sz, PAGE_SIZE); |
res = last_allocated; |
last_allocated += sz; |
return res; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/string.c |
---|
0,0 → 1,314 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <string.h> |
#include <unistd.h> |
#include <ctype.h> |
#include <limits.h> |
#include <align.h> |
/* Dummy implementation of mem/ functions */ |
void * memset(void *s, int c, size_t n) |
{ |
char *os = s; |
while (n--) |
*(os++) = c; |
return s; |
} |
struct along {unsigned long n; } __attribute__ ((packed)); |
static void * unaligned_memcpy(void *dst, const void *src, size_t n) |
{ |
int i, j; |
struct along *adst = dst; |
const struct along *asrc = src; |
for (i = 0; i < n/sizeof(unsigned long); i++) |
adst[i].n = asrc[i].n; |
for (j = 0; j < n%sizeof(unsigned long); j++) |
((unsigned char *)(((unsigned long *) dst) + i))[j] = ((unsigned char *)(((unsigned long *) src) + i))[j]; |
return (char *)src; |
} |
void * memcpy(void *dst, const void *src, size_t n) |
{ |
int i, j; |
if (((long)dst & (sizeof(long)-1)) || ((long)src & (sizeof(long)-1))) |
return unaligned_memcpy(dst, src, n); |
for (i = 0; i < n/sizeof(unsigned long); i++) |
((unsigned long *) dst)[i] = ((unsigned long *) src)[i]; |
for (j = 0; j < n%sizeof(unsigned long); j++) |
((unsigned char *)(((unsigned long *) dst) + i))[j] = ((unsigned char *)(((unsigned long *) src) + i))[j]; |
return (char *)src; |
} |
void * memmove(void *dst, const void *src, size_t n) |
{ |
int i, j; |
if (src > dst) |
return memcpy(dst, src, n); |
for (j = (n%sizeof(unsigned long))-1; j >= 0; j--) |
((unsigned char *)(((unsigned long *) dst) + i))[j] = ((unsigned char *)(((unsigned long *) src) + i))[j]; |
for (i = n/sizeof(unsigned long)-1; i >=0 ; i--) |
((unsigned long *) dst)[i] = ((unsigned long *) src)[i]; |
return (char *)src; |
} |
/** Count the number of characters in the string, not including terminating 0. |
* @param str string |
* @return number of characters in string. |
*/ |
size_t strlen(const char *str) |
{ |
size_t counter = 0; |
while (str[counter] != 0) { |
counter++; |
} |
return counter; |
} |
int strcmp(const char *a,const char *b) |
{ |
int c=0; |
while(a[c]&&b[c]&&(!(a[c]-b[c]))) c++; |
return a[c]-b[c]; |
} |
/** Return pointer to the first occurence of character c in string |
* @param str scanned string |
* @param c searched character (taken as one byte) |
* @return pointer to the matched character or NULL if it is not found in given string. |
*/ |
char *strchr(const char *str, int c) |
{ |
while (*str != '\0') { |
if (*str == (char)c) |
return (char *)str; |
str++; |
} |
return NULL; |
} |
/** Return pointer to the last occurence of character c in string |
* @param str scanned string |
* @param c searched character (taken as one byte) |
* @return pointer to the matched character or NULL if it is not found in given string. |
*/ |
char *strrchr(const char *str, int c) |
{ |
char *retval = NULL; |
while (*str != '\0') { |
if (*str == (char)c) |
retval = (char *)str; |
str++; |
} |
return (char *)retval; |
} |
/** Convert string to a number. |
* Core of strtol and strtoul functions. |
* @param nptr pointer to string |
* @param endptr if not NULL, function stores here pointer to the first invalid character |
* @param base zero or number between 2 and 36 inclusive |
* @param sgn its set to 1 if minus found |
* @return result of conversion. |
*/ |
static unsigned long _strtoul(const char *nptr, char **endptr, int base, char *sgn) |
{ |
unsigned char c; |
unsigned long result = 0; |
unsigned long a, b; |
const char *str = nptr; |
const char *tmpptr; |
while (isspace(*str)) |
str++; |
if (*str == '-') { |
*sgn = 1; |
++str; |
} else if (*str == '+') |
++str; |
if (base) { |
if ((base == 1) || (base > 36)) { |
/* FIXME: set errno to EINVAL */ |
return 0; |
} |
if ((base == 16) && (*str == '0') && ((str[1] == 'x') || (str[1] == 'X'))) { |
str += 2; |
} |
} else { |
base = 10; |
if (*str == '0') { |
base = 8; |
if ((str[1] == 'X') || (str[1] == 'x')) { |
base = 16; |
str += 2; |
} |
} |
} |
tmpptr = str; |
while (*str) { |
c = *str; |
c = ( c >= 'a'? c-'a'+10:(c >= 'A'?c-'A'+10:(c <= '9'?c-'0':0xff))); |
if (c > base) { |
break; |
} |
a = (result & 0xff) * base + c; |
b = (result >> 8) * base + (a >> 8); |
if (b > (ULONG_MAX >> 8)) { |
/* overflow */ |
/* FIXME: errno = ERANGE*/ |
return ULONG_MAX; |
} |
result = (b << 8) + (a & 0xff); |
++str; |
} |
if (str == tmpptr) { |
/* no number was found => first invalid character is the first character of the string */ |
/* FIXME: set errno to EINVAL */ |
str = nptr; |
result = 0; |
} |
if (endptr) |
*endptr = (char *)str; |
if (nptr == str) { |
/*FIXME: errno = EINVAL*/ |
return 0; |
} |
return result; |
} |
/** Convert initial part of string to long int according to given base. |
* The number may begin with an arbitrary number of whitespaces followed by optional sign (`+' or `-'). |
* If the base is 0 or 16, the prefix `0x' may be inserted and the number will be taken as hexadecimal one. |
* If the base is 0 and the number begin with a zero, number will be taken as octal one (as with base 8). |
* Otherwise the base 0 is taken as decimal. |
* @param nptr pointer to string |
* @param endptr if not NULL, function stores here pointer to the first invalid character |
* @param base zero or number between 2 and 36 inclusive |
* @return result of conversion. |
*/ |
long int strtol(const char *nptr, char **endptr, int base) |
{ |
char sgn = 0; |
unsigned long number = 0; |
number = _strtoul(nptr, endptr, base, &sgn); |
if (number > LONG_MAX) { |
if ((sgn) && (number == (unsigned long)(LONG_MAX) + 1)) { |
/* FIXME: set 0 to errno */ |
return number; |
} |
/* FIXME: set ERANGE to errno */ |
return (sgn?LONG_MIN:LONG_MAX); |
} |
return (sgn?-number:number); |
} |
/** Convert initial part of string to unsigned long according to given base. |
* The number may begin with an arbitrary number of whitespaces followed by optional sign (`+' or `-'). |
* If the base is 0 or 16, the prefix `0x' may be inserted and the number will be taken as hexadecimal one. |
* If the base is 0 and the number begin with a zero, number will be taken as octal one (as with base 8). |
* Otherwise the base 0 is taken as decimal. |
* @param nptr pointer to string |
* @param endptr if not NULL, function stores here pointer to the first invalid character |
* @param base zero or number between 2 and 36 inclusive |
* @return result of conversion. |
*/ |
unsigned long strtoul(const char *nptr, char **endptr, int base) |
{ |
char sgn = 0; |
unsigned long number = 0; |
number = _strtoul(nptr, endptr, base, &sgn); |
return (sgn?-number:number); |
} |
char *strcpy(char *dest, const char *src) |
{ |
while (*(dest++) = *(src++)) |
; |
} |
char *strncpy(char *dest, const char *src, size_t n) |
{ |
while ((*(dest++) = *(src++)) && --n) |
; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/thread.c |
---|
0,0 → 1,160 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <thread.h> |
#include <libc.h> |
#include <stdlib.h> |
#include <arch/faddr.h> |
#include <kernel/proc/uarg.h> |
#include <psthread.h> |
#include <string.h> |
#include <async.h> |
#include <stdio.h> |
#ifndef THREAD_INITIAL_STACK_PAGES_NO |
#define THREAD_INITIAL_STACK_PAGES_NO 1 |
#endif |
static LIST_INITIALIZE(thread_garbage); |
extern char _tdata_start; |
extern char _tdata_end; |
extern char _tbss_start; |
extern char _tbss_end; |
/** Create Thread Local storage area, return pointer to TCB(ThreadControlBlock) |
* |
* !! The code requires, that sections .tdata and .tbss are adjacent. |
* It may be changed in the future. |
*/ |
tcb_t * __make_tls(void) |
{ |
void *data; |
tcb_t *tcb; |
size_t tls_size = &_tbss_end - &_tdata_start; |
tcb = __alloc_tls(&data, tls_size); |
memcpy(data, &_tdata_start, &_tdata_end - &_tdata_start); |
memset(data + (&_tbss_start-&_tdata_start), 0, &_tbss_end-&_tbss_start); |
return tcb; |
} |
void __free_tls(tcb_t *tcb) |
{ |
size_t tls_size = &_tbss_end - &_tdata_start; |
__free_tls_arch(tcb, tls_size); |
} |
/** Main thread function. |
* |
* This function is called from __thread_entry() and is used |
* to call the thread's implementing function and perform cleanup |
* and exit when thread returns back. Do not call this function |
* directly. |
* |
* @param uarg Pointer to userspace argument structure. |
* |
* TODO: Thread stack pages memory leak |
*/ |
void __thread_main(uspace_arg_t *uarg) |
{ |
psthread_data_t *pt; |
pt = psthread_setup(); |
__tcb_set(pt->tcb); |
uarg->uspace_thread_function(uarg->uspace_thread_arg); |
free(uarg->uspace_stack); |
free(uarg); |
/* If there is a manager, destroy it */ |
async_destroy_manager(); |
psthread_teardown(pt); |
thread_exit(0); |
} |
/** Create userspace thread. |
* |
* This function creates new userspace thread and allocates userspace |
* stack and userspace argument structure for it. |
* |
* @param function Function implementing the thread. |
* @param arg Argument to be passed to thread. |
* @param name Symbolic name of the thread. |
* |
* @param TID of the new thread on success or -1 on failure. |
*/ |
int thread_create(void (* function)(void *), void *arg, char *name) |
{ |
char *stack; |
uspace_arg_t *uarg; |
stack = (char *) malloc(getpagesize()*THREAD_INITIAL_STACK_PAGES_NO); |
if (!stack) |
return -1; |
uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t)); |
if (!uarg) { |
free(stack); |
return -1; |
} |
uarg->uspace_entry = (void *) FADDR(__thread_entry); |
uarg->uspace_stack = (void *) stack; |
uarg->uspace_thread_function = function; |
uarg->uspace_thread_arg = arg; |
uarg->uspace_uarg = uarg; |
return __SYSCALL2(SYS_THREAD_CREATE, (sysarg_t) uarg, (sysarg_t) name); |
} |
/** Terminate current thread. |
* |
* @param stat Exit status. Currently not used. |
*/ |
void thread_exit(int status) |
{ |
__SYSCALL1(SYS_THREAD_EXIT, (sysarg_t) status); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/psthread.c |
---|
0,0 → 1,315 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <libadt/list.h> |
#include <psthread.h> |
#include <malloc.h> |
#include <unistd.h> |
#include <thread.h> |
#include <stdio.h> |
#include <kernel/arch/faddr.h> |
#include <futex.h> |
#include <assert.h> |
#include <async.h> |
#ifndef PSTHREAD_INITIAL_STACK_PAGES_NO |
#define PSTHREAD_INITIAL_STACK_PAGES_NO 1 |
#endif |
static LIST_INITIALIZE(ready_list); |
static LIST_INITIALIZE(serialized_list); |
static LIST_INITIALIZE(manager_list); |
static void psthread_exit(void) __attribute__ ((noinline)); |
static void psthread_main(void); |
static atomic_t psthread_futex = FUTEX_INITIALIZER; |
/** Count of real threads that are in async_serialized mode */ |
static int serialized_threads; /* Protected by async_futex */ |
/** Thread-local count of serialization. If >0, we must not preempt */ |
static __thread int serialization_count; |
/** Counter of threads residing in async_manager */ |
static int threads_in_manager; |
/** Setup PSthread information into TCB structure */ |
psthread_data_t * psthread_setup() |
{ |
psthread_data_t *pt; |
tcb_t *tcb; |
tcb = __make_tls(); |
if (!tcb) |
return NULL; |
pt = malloc(sizeof(*pt)); |
if (!pt) { |
__free_tls(tcb); |
return NULL; |
} |
tcb->pst_data = pt; |
pt->tcb = tcb; |
return pt; |
} |
void psthread_teardown(psthread_data_t *pt) |
{ |
__free_tls(pt->tcb); |
free(pt); |
} |
/** Function that is called on entry to new uspace thread */ |
void psthread_main(void) |
{ |
psthread_data_t *pt = __tcb_get()->pst_data; |
pt->retval = pt->func(pt->arg); |
pt->finished = 1; |
if (pt->waiter) |
list_append(&pt->waiter->link, &ready_list); |
psthread_schedule_next_adv(PS_FROM_DEAD); |
} |
/** Schedule next userspace pseudo thread. |
* |
* If calling with PS_TO_MANAGER parameter, the async_futex should be |
* held. |
* |
* @param tomanager If true, we are switching to next ready manager thread |
* (if none is found, thread is exited) |
* @param frommanager If true, we are switching from manager thread |
* @return 0 if there is no ready pseudo thread, 1 otherwise. |
*/ |
int psthread_schedule_next_adv(pschange_type ctype) |
{ |
psthread_data_t *srcpt, *dstpt; |
int retval = 0; |
futex_down(&psthread_futex); |
if (ctype == PS_PREEMPT && list_empty(&ready_list)) |
goto ret_0; |
if (ctype == PS_FROM_MANAGER) { |
if (list_empty(&ready_list) && list_empty(&serialized_list)) |
goto ret_0; |
/* Do not preempt if there is not sufficient count of thread managers */ |
if (list_empty(&serialized_list) && threads_in_manager <= serialized_threads) { |
goto ret_0; |
} |
} |
/* If we are going to manager and none exists, create it */ |
if (ctype == PS_TO_MANAGER || ctype == PS_FROM_DEAD) { |
while (list_empty(&manager_list)) { |
futex_up(&psthread_futex); |
async_create_manager(); |
futex_down(&psthread_futex); |
} |
} |
if (ctype != PS_FROM_DEAD) { |
/* Save current state */ |
srcpt = __tcb_get()->pst_data; |
if (!context_save(&srcpt->ctx)) { |
if (serialization_count) |
srcpt->flags &= ~PSTHREAD_SERIALIZED; |
return 1; // futex_up already done here |
} |
/* Save myself to correct run list */ |
if (ctype == PS_PREEMPT) |
list_append(&srcpt->link, &ready_list); |
else if (ctype == PS_FROM_MANAGER) { |
list_append(&srcpt->link, &manager_list); |
threads_in_manager--; |
} /* If ctype == PS_TO_MANAGER, don't save ourselves to any list, we should |
* already be somewhere, or we will be lost */ |
} |
/* Choose new thread to run */ |
if (ctype == PS_TO_MANAGER || ctype == PS_FROM_DEAD) { |
dstpt = list_get_instance(manager_list.next,psthread_data_t, link); |
if (serialization_count && ctype == PS_TO_MANAGER) { |
serialized_threads++; |
srcpt->flags |= PSTHREAD_SERIALIZED; |
} |
threads_in_manager++; |
} else { |
if (!list_empty(&serialized_list)) { |
dstpt = list_get_instance(serialized_list.next, psthread_data_t, link); |
serialized_threads--; |
} else |
dstpt = list_get_instance(ready_list.next, psthread_data_t, link); |
} |
list_remove(&dstpt->link); |
futex_up(&psthread_futex); |
context_restore(&dstpt->ctx); |
ret_0: |
futex_up(&psthread_futex); |
return retval; |
} |
/** Wait for uspace pseudo thread to finish. |
* |
* @param psthrid Pseudo thread to wait for. |
* |
* @return Value returned by the finished thread. |
*/ |
int psthread_join(pstid_t psthrid) |
{ |
volatile psthread_data_t *pt, *mypt; |
volatile int retval; |
/* Handle psthrid = Kernel address -> it is wait for call */ |
pt = (psthread_data_t *) psthrid; |
/* TODO */ |
printf("join unsupported\n"); |
_exit(1); |
retval = pt->retval; |
free(pt->stack); |
psthread_teardown((void *)pt); |
return retval; |
} |
/** |
* Create a userspace thread |
* |
* @param func Pseudo thread function. |
* @param arg Argument to pass to func. |
* |
* @return 0 on failure, TLS of the new pseudo thread. |
*/ |
pstid_t psthread_create(int (*func)(void *), void *arg) |
{ |
psthread_data_t *pt; |
pt = psthread_setup(); |
if (!pt) |
return 0; |
pt->stack = (char *) malloc(PSTHREAD_INITIAL_STACK_PAGES_NO*getpagesize()); |
if (!pt->stack) { |
psthread_teardown(pt); |
return 0; |
} |
pt->arg= arg; |
pt->func = func; |
pt->finished = 0; |
pt->waiter = NULL; |
pt->flags = 0; |
context_save(&pt->ctx); |
context_set(&pt->ctx, FADDR(psthread_main), pt->stack, PSTHREAD_INITIAL_STACK_PAGES_NO*getpagesize(), |
pt->tcb); |
return (pstid_t )pt; |
} |
/** Add a thread to ready list */ |
void psthread_add_ready(pstid_t psthrid) |
{ |
psthread_data_t *pt; |
pt = (psthread_data_t *) psthrid; |
futex_down(&psthread_futex); |
if ((pt->flags & PSTHREAD_SERIALIZED)) |
list_append(&pt->link, &serialized_list); |
else |
list_append(&pt->link, &ready_list); |
futex_up(&psthread_futex); |
} |
/** Add a thread to manager list */ |
void psthread_add_manager(pstid_t psthrid) |
{ |
psthread_data_t *pt; |
pt = (psthread_data_t *) psthrid; |
futex_down(&psthread_futex); |
list_append(&pt->link, &manager_list); |
futex_up(&psthread_futex); |
} |
/** Remove one manager from manager list */ |
void psthread_remove_manager() |
{ |
futex_down(&psthread_futex); |
if (list_empty(&manager_list)) { |
futex_up(&psthread_futex); |
return; |
} |
list_remove(manager_list.next); |
futex_up(&psthread_futex); |
} |
/** Return thread id of current running thread */ |
pstid_t psthread_get_id(void) |
{ |
return (pstid_t)__tcb_get()->pst_data; |
} |
/** Disable preemption |
* |
* If the thread wants to send several message in row and does not want |
* to be preempted, it should start async_serialize_start() in the beginning |
* of communication and async_serialize_end() in the end. If it is a |
* true multithreaded application, it should protect the communication channel |
* by a futex as well. Interrupt messages will can still be preempted. |
*/ |
void psthread_inc_sercount(void) |
{ |
serialization_count++; |
} |
void psthread_dec_sercount(void) |
{ |
serialization_count--; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/ipc.c |
---|
0,0 → 1,458 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
* @} |
*/ |
/** @addtogroup libcipc IPC |
* @brief HelenOS uspace IPC |
* @{ |
* @ingroup libc |
*/ |
/** @file |
*/ |
#include <ipc/ipc.h> |
#include <libc.h> |
#include <malloc.h> |
#include <errno.h> |
#include <libadt/list.h> |
#include <stdio.h> |
#include <unistd.h> |
#include <futex.h> |
#include <kernel/synch/synch.h> |
#include <async.h> |
#include <psthread.h> |
/** Structure used for keeping track of sent async msgs |
* and queing unsent msgs |
* |
*/ |
typedef struct { |
link_t list; |
ipc_async_callback_t callback; |
void *private; |
union { |
ipc_callid_t callid; |
struct { |
ipc_call_t data; |
int phoneid; |
} msg; |
}u; |
pstid_t ptid; /**< Thread waiting for sending this msg */ |
} async_call_t; |
LIST_INITIALIZE(dispatched_calls); |
/* queued_calls is protcted by async_futex, because if the |
* call cannot be sent into kernel, async framework is used |
* automatically |
*/ |
LIST_INITIALIZE(queued_calls); /**< List of async calls that were not accepted |
* by kernel */ |
static atomic_t ipc_futex = FUTEX_INITIALIZER; |
int ipc_call_sync(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t *result) |
{ |
ipc_call_t resdata; |
int callres; |
callres = __SYSCALL4(SYS_IPC_CALL_SYNC_FAST, phoneid, method, arg1, |
(sysarg_t)&resdata); |
if (callres) |
return callres; |
if (result) |
*result = IPC_GET_ARG1(resdata); |
return IPC_GET_RETVAL(resdata); |
} |
int ipc_call_sync_3(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, |
ipcarg_t *result1, ipcarg_t *result2, ipcarg_t *result3) |
{ |
ipc_call_t data; |
int callres; |
IPC_SET_METHOD(data, method); |
IPC_SET_ARG1(data, arg1); |
IPC_SET_ARG2(data, arg2); |
IPC_SET_ARG3(data, arg3); |
callres = __SYSCALL3(SYS_IPC_CALL_SYNC, phoneid, (sysarg_t)&data, |
(sysarg_t)&data); |
if (callres) |
return callres; |
if (result1) |
*result1 = IPC_GET_ARG1(data); |
if (result2) |
*result2 = IPC_GET_ARG2(data); |
if (result3) |
*result3 = IPC_GET_ARG3(data); |
return IPC_GET_RETVAL(data); |
} |
/** Syscall to send asynchronous message */ |
static ipc_callid_t _ipc_call_async(int phoneid, ipc_call_t *data) |
{ |
return __SYSCALL2(SYS_IPC_CALL_ASYNC, phoneid, (sysarg_t)data); |
} |
/** Prolog to ipc_async_send functions */ |
static inline async_call_t *ipc_prepare_async(void *private, ipc_async_callback_t callback) |
{ |
async_call_t *call; |
call = malloc(sizeof(*call)); |
if (!call) { |
if (callback) |
callback(private, ENOMEM, NULL); |
return NULL; |
} |
call->callback = callback; |
call->private = private; |
return call; |
} |
/** Epilogue of ipc_async_send functions */ |
static inline void ipc_finish_async(ipc_callid_t callid, int phoneid, |
async_call_t *call, int can_preempt) |
{ |
if (callid == IPC_CALLRET_FATAL) { |
futex_up(&ipc_futex); |
/* Call asynchronous handler with error code */ |
if (call->callback) |
call->callback(call->private, ENOENT, NULL); |
free(call); |
return; |
} |
if (callid == IPC_CALLRET_TEMPORARY) { |
futex_up(&ipc_futex); |
call->u.msg.phoneid = phoneid; |
futex_down(&async_futex); |
list_append(&call->list, &queued_calls); |
if (can_preempt) { |
call->ptid = psthread_get_id(); |
psthread_schedule_next_adv(PS_TO_MANAGER); |
/* Async futex unlocked by previous call */ |
} else { |
call->ptid = 0; |
futex_up(&async_futex); |
} |
return; |
} |
call->u.callid = callid; |
/* Add call to list of dispatched calls */ |
list_append(&call->list, &dispatched_calls); |
futex_up(&ipc_futex); |
} |
/** Send asynchronous message |
* |
* - if fatal error, call callback handler with proper error code |
* - if message cannot be temporarily sent, add to queue |
*/ |
void ipc_call_async_2(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, void *private, |
ipc_async_callback_t callback, int can_preempt) |
{ |
async_call_t *call; |
ipc_callid_t callid; |
call = ipc_prepare_async(private, callback); |
if (!call) |
return; |
/* We need to make sure that we get callid before |
* another thread accesses the queue again */ |
futex_down(&ipc_futex); |
callid = __SYSCALL4(SYS_IPC_CALL_ASYNC_FAST, phoneid, method, arg1, arg2); |
if (callid == IPC_CALLRET_TEMPORARY) { |
IPC_SET_METHOD(call->u.msg.data, method); |
IPC_SET_ARG1(call->u.msg.data, arg1); |
IPC_SET_ARG2(call->u.msg.data, arg2); |
} |
ipc_finish_async(callid, phoneid, call, can_preempt); |
} |
/** Send asynchronous message |
* |
* - if fatal error, call callback handler with proper error code |
* - if message cannot be temporarily sent, add to queue |
*/ |
void ipc_call_async_3(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, void *private, |
ipc_async_callback_t callback, int can_preempt) |
{ |
async_call_t *call; |
ipc_callid_t callid; |
call = ipc_prepare_async(private, callback); |
if (!call) |
return; |
IPC_SET_METHOD(call->u.msg.data, method); |
IPC_SET_ARG1(call->u.msg.data, arg1); |
IPC_SET_ARG2(call->u.msg.data, arg2); |
IPC_SET_ARG3(call->u.msg.data, arg3); |
/* We need to make sure that we get callid before |
* another thread accesses the queue again */ |
futex_down(&ipc_futex); |
callid = _ipc_call_async(phoneid, &call->u.msg.data); |
ipc_finish_async(callid, phoneid, call, can_preempt); |
} |
/** Send a fast answer to a received call. |
* |
* The fast answer makes use of passing retval and first two arguments in registers. |
* If you need to return more, use the ipc_answer() instead. |
* |
* @param callid ID of the call being answered. |
* @param retval Return value. |
* @param arg1 First return argument. |
* @param arg2 Second return argument. |
* |
* @return Zero on success or a value from @ref errno.h on failure. |
*/ |
ipcarg_t ipc_answer_fast(ipc_callid_t callid, ipcarg_t retval, ipcarg_t arg1, |
ipcarg_t arg2) |
{ |
return __SYSCALL4(SYS_IPC_ANSWER_FAST, callid, retval, arg1, arg2); |
} |
/** Send a full answer to a received call. |
* |
* @param callid ID of the call being answered. |
* @param call Call data. Must be already initialized by the responder. |
* |
* @return Zero on success or a value from @ref errno.h on failure. |
*/ |
ipcarg_t ipc_answer(ipc_callid_t callid, ipc_call_t *call) |
{ |
return __SYSCALL2(SYS_IPC_ANSWER, callid, (sysarg_t) call); |
} |
/** Try to dispatch queed calls from async queue */ |
static void try_dispatch_queued_calls(void) |
{ |
async_call_t *call; |
ipc_callid_t callid; |
/* TODO: integrate intelligently ipc_futex, so that it |
* is locked during ipc_call_async, until it is added |
* to dispatched_calls |
*/ |
futex_down(&async_futex); |
while (!list_empty(&queued_calls)) { |
call = list_get_instance(queued_calls.next, async_call_t, |
list); |
callid = _ipc_call_async(call->u.msg.phoneid, |
&call->u.msg.data); |
if (callid == IPC_CALLRET_TEMPORARY) { |
break; |
} |
list_remove(&call->list); |
futex_up(&async_futex); |
if (call->ptid) |
psthread_add_ready(call->ptid); |
if (callid == IPC_CALLRET_FATAL) { |
if (call->callback) |
call->callback(call->private, ENOENT, NULL); |
free(call); |
} else { |
call->u.callid = callid; |
futex_down(&ipc_futex); |
list_append(&call->list, &dispatched_calls); |
futex_up(&ipc_futex); |
} |
futex_down(&async_futex); |
} |
futex_up(&async_futex); |
} |
/** Handle received answer |
* |
* TODO: Make it use hash table |
* |
* @param callid Callid (with first bit set) of the answered call |
*/ |
static void handle_answer(ipc_callid_t callid, ipc_call_t *data) |
{ |
link_t *item; |
async_call_t *call; |
callid &= ~IPC_CALLID_ANSWERED; |
futex_down(&ipc_futex); |
for (item = dispatched_calls.next; item != &dispatched_calls; |
item = item->next) { |
call = list_get_instance(item, async_call_t, list); |
if (call->u.callid == callid) { |
list_remove(&call->list); |
futex_up(&ipc_futex); |
if (call->callback) |
call->callback(call->private, |
IPC_GET_RETVAL(*data), |
data); |
free(call); |
return; |
} |
} |
futex_up(&ipc_futex); |
printf("Received unidentified answer: %P!!!\n", callid); |
} |
/** One cycle of ipc wait for call call |
* |
* - dispatch ASYNC reoutines in the background |
* @param call Space where the message is stored |
* @param usec Timeout in microseconds |
* @param flags Flags passed to SYS_IPC_WAIT (blocking, nonblocking) |
* @return Callid of the answer. |
*/ |
ipc_callid_t ipc_wait_cycle(ipc_call_t *call, uint32_t usec, int flags) |
{ |
ipc_callid_t callid; |
callid = __SYSCALL3(SYS_IPC_WAIT, (sysarg_t) call, usec, flags); |
/* Handle received answers */ |
if (callid & IPC_CALLID_ANSWERED) { |
handle_answer(callid, call); |
try_dispatch_queued_calls(); |
} |
return callid; |
} |
/** Wait some time for an IPC call. |
* |
* - dispatch ASYNC reoutines in the background |
* @param call Space where the message is stored |
* @param usec Timeout in microseconds. |
* @return Callid of the answer. |
*/ |
ipc_callid_t ipc_wait_for_call_timeout(ipc_call_t *call, uint32_t usec) |
{ |
ipc_callid_t callid; |
do { |
callid = ipc_wait_cycle(call, usec, SYNCH_FLAGS_NONE); |
} while (callid & IPC_CALLID_ANSWERED); |
return callid; |
} |
/** Check if there is an IPC call waiting to be picked up. |
* |
* - dispatch ASYNC reoutines in the background |
* @param call Space where the message is stored |
* @return Callid of the answer. |
*/ |
ipc_callid_t ipc_trywait_for_call(ipc_call_t *call) |
{ |
ipc_callid_t callid; |
do { |
callid = ipc_wait_cycle(call, SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NON_BLOCKING); |
} while (callid & IPC_CALLID_ANSWERED); |
return callid; |
} |
/** Ask destination to do a callback connection |
* |
* @return 0 - OK, error code |
*/ |
int ipc_connect_to_me(int phoneid, int arg1, int arg2, ipcarg_t *phone) |
{ |
return ipc_call_sync_3(phoneid, IPC_M_CONNECT_TO_ME, arg1, |
arg2, 0, 0, 0, phone); |
} |
/** Ask through phone for a new connection to some service |
* |
* @return new phoneid - OK, error code |
*/ |
int ipc_connect_me_to(int phoneid, int arg1, int arg2) |
{ |
ipcarg_t newphid; |
int res; |
res = ipc_call_sync_3(phoneid, IPC_M_CONNECT_ME_TO, arg1, |
arg2, 0, 0, 0, &newphid); |
if (res) |
return res; |
return newphid; |
} |
/* Hang up specified phone */ |
int ipc_hangup(int phoneid) |
{ |
return __SYSCALL1(SYS_IPC_HANGUP, phoneid); |
} |
int ipc_register_irq(int irq, irq_code_t *ucode) |
{ |
return __SYSCALL2(SYS_IPC_REGISTER_IRQ, irq, (sysarg_t) ucode); |
} |
int ipc_unregister_irq(int irq) |
{ |
return __SYSCALL1(SYS_IPC_UNREGISTER_IRQ, irq); |
} |
int ipc_forward_fast(ipc_callid_t callid, int phoneid, int method, ipcarg_t arg1) |
{ |
return __SYSCALL4(SYS_IPC_FORWARD_FAST, callid, phoneid, method, arg1); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/async.c |
---|
0,0 → 1,806 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
/** |
* Asynchronous library |
* |
* The aim of this library is facilitating writing programs utilizing |
* the asynchronous nature of Helenos IPC, yet using a normal way |
* of programming. |
* |
* You should be able to write very simple multithreaded programs, |
* the async framework will automatically take care of most synchronization |
* problems. |
* |
* Default semantics: |
* - send() - send asynchronously. If the kernel refuses to send more |
* messages, [ try to get responses from kernel, if nothing |
* found, might try synchronous ] |
* |
* Example of use: |
* |
* 1) Multithreaded client application |
* create_thread(thread1); |
* create_thread(thread2); |
* ... |
* |
* thread1() { |
* conn = ipc_connect_me_to(); |
* c1 = send(conn); |
* c2 = send(conn); |
* wait_for(c1); |
* wait_for(c2); |
* } |
* |
* |
* 2) Multithreaded server application |
* main() { |
* async_manager(); |
* } |
* |
* |
* client_connection(icallid, *icall) { |
* if (want_refuse) { |
* ipc_answer_fast(icallid, ELIMIT, 0, 0); |
* return; |
* } |
* ipc_answer_fast(icallid, 0, 0, 0); |
* |
* callid = async_get_call(&call); |
* handle(callid, call); |
* ipc_answer_fast(callid, 1,2,3); |
* |
* callid = async_get_call(&call); |
* .... |
* } |
* |
* TODO: Detaching/joining dead psthreads? |
*/ |
#include <futex.h> |
#include <async.h> |
#include <psthread.h> |
#include <stdio.h> |
#include <libadt/hash_table.h> |
#include <libadt/list.h> |
#include <ipc/ipc.h> |
#include <assert.h> |
#include <errno.h> |
#include <time.h> |
#include <arch/barrier.h> |
atomic_t async_futex = FUTEX_INITIALIZER; |
static hash_table_t conn_hash_table; |
static LIST_INITIALIZE(timeout_list); |
typedef struct { |
struct timeval expires; /**< Expiration time for waiting thread */ |
int inlist; /**< If true, this struct is in timeout list */ |
link_t link; |
pstid_t ptid; /**< Thread waiting for this message */ |
int active; /**< If this thread is currently active */ |
int timedout; /**< If true, we timed out */ |
} awaiter_t; |
typedef struct { |
awaiter_t wdata; |
int done; /**< If reply was received */ |
ipc_call_t *dataptr; /**< Pointer where the answer data |
* is stored */ |
ipcarg_t retval; |
} amsg_t; |
typedef struct { |
link_t link; |
ipc_callid_t callid; |
ipc_call_t call; |
} msg_t; |
typedef struct { |
awaiter_t wdata; |
link_t link; /**< Hash table link */ |
ipcarg_t in_phone_hash; /**< Incoming phone hash. */ |
link_t msg_queue; /**< Messages that should be delivered to this thread */ |
/* Structures for connection opening packet */ |
ipc_callid_t callid; |
ipc_call_t call; |
ipc_callid_t close_callid; /* Identification of closing packet */ |
void (*cthread)(ipc_callid_t,ipc_call_t *); |
} connection_t; |
/** Identifier of incoming connection handled by current thread */ |
__thread connection_t *PS_connection; |
/** If true, it is forbidden to use async_req functions and |
* all preemption is disabled */ |
__thread int in_interrupt_handler; |
static void default_client_connection(ipc_callid_t callid, ipc_call_t *call); |
static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call); |
static async_client_conn_t client_connection = default_client_connection; |
static async_client_conn_t interrupt_received = default_interrupt_received; |
/** Add microseconds to give timeval */ |
static void tv_add(struct timeval *tv, suseconds_t usecs) |
{ |
tv->tv_sec += usecs / 1000000; |
tv->tv_usec += usecs % 1000000; |
if (tv->tv_usec > 1000000) { |
tv->tv_sec++; |
tv->tv_usec -= 1000000; |
} |
} |
/** Subtract 2 timevals, return microseconds difference */ |
static suseconds_t tv_sub(struct timeval *tv1, struct timeval *tv2) |
{ |
suseconds_t result; |
result = tv1->tv_usec - tv2->tv_usec; |
result += (tv1->tv_sec - tv2->tv_sec) * 1000000; |
return result; |
} |
/** Compare timeval |
* |
* @return 1 if tv1 > tv2, otherwise 0 |
*/ |
static int tv_gt(struct timeval *tv1, struct timeval *tv2) |
{ |
if (tv1->tv_sec > tv2->tv_sec) |
return 1; |
if (tv1->tv_sec == tv2->tv_sec && tv1->tv_usec > tv2->tv_usec) |
return 1; |
return 0; |
} |
static int tv_gteq(struct timeval *tv1, struct timeval *tv2) |
{ |
if (tv1->tv_sec > tv2->tv_sec) |
return 1; |
if (tv1->tv_sec == tv2->tv_sec && tv1->tv_usec >= tv2->tv_usec) |
return 1; |
return 0; |
} |
/* Hash table functions */ |
#define CONN_HASH_TABLE_CHAINS 32 |
static hash_index_t conn_hash(unsigned long *key) |
{ |
assert(key); |
return ((*key) >> 4) % CONN_HASH_TABLE_CHAINS; |
} |
static int conn_compare(unsigned long key[], hash_count_t keys, link_t *item) |
{ |
connection_t *hs; |
hs = hash_table_get_instance(item, connection_t, link); |
return key[0] == hs->in_phone_hash; |
} |
static void conn_remove(link_t *item) |
{ |
free(hash_table_get_instance(item, connection_t, link)); |
} |
/** Operations for NS hash table. */ |
static hash_table_operations_t conn_hash_table_ops = { |
.hash = conn_hash, |
.compare = conn_compare, |
.remove_callback = conn_remove |
}; |
/** Insert sort timeout msg into timeouts list |
* |
*/ |
static void insert_timeout(awaiter_t *wd) |
{ |
link_t *tmp; |
awaiter_t *cur; |
wd->timedout = 0; |
wd->inlist = 1; |
tmp = timeout_list.next; |
while (tmp != &timeout_list) { |
cur = list_get_instance(tmp, awaiter_t, link); |
if (tv_gteq(&cur->expires, &wd->expires)) |
break; |
tmp = tmp->next; |
} |
list_append(&wd->link, tmp); |
} |
/*************************************************/ |
/** Try to route a call to an appropriate connection thread |
* |
*/ |
static int route_call(ipc_callid_t callid, ipc_call_t *call) |
{ |
connection_t *conn; |
msg_t *msg; |
link_t *hlp; |
unsigned long key; |
futex_down(&async_futex); |
key = call->in_phone_hash; |
hlp = hash_table_find(&conn_hash_table, &key); |
if (!hlp) { |
futex_up(&async_futex); |
return 0; |
} |
conn = hash_table_get_instance(hlp, connection_t, link); |
msg = malloc(sizeof(*msg)); |
msg->callid = callid; |
msg->call = *call; |
list_append(&msg->link, &conn->msg_queue); |
if (IPC_GET_METHOD(*call) == IPC_M_PHONE_HUNGUP) |
conn->close_callid = callid; |
/* If the call is waiting for event, run it */ |
if (!conn->wdata.active) { |
/* If in timeout list, remove it */ |
if (conn->wdata.inlist) { |
conn->wdata.inlist = 0; |
list_remove(&conn->wdata.link); |
} |
conn->wdata.active = 1; |
psthread_add_ready(conn->wdata.ptid); |
} |
futex_up(&async_futex); |
return 1; |
} |
/** Return new incoming message for current(thread-local) connection */ |
ipc_callid_t async_get_call_timeout(ipc_call_t *call, suseconds_t usecs) |
{ |
msg_t *msg; |
ipc_callid_t callid; |
connection_t *conn; |
assert(PS_connection); |
/* GCC 4.1.0 coughs on PS_connection-> dereference, |
* GCC 4.1.1 happilly puts the rdhwr instruction in delay slot. |
* I would never expect to find so many errors in |
* compiler *($&$(*&$ |
*/ |
conn = PS_connection; |
futex_down(&async_futex); |
if (usecs) { |
gettimeofday(&conn->wdata.expires, NULL); |
tv_add(&conn->wdata.expires, usecs); |
} else { |
conn->wdata.inlist = 0; |
} |
/* If nothing in queue, wait until something appears */ |
while (list_empty(&conn->msg_queue)) { |
if (usecs) |
insert_timeout(&conn->wdata); |
conn->wdata.active = 0; |
psthread_schedule_next_adv(PS_TO_MANAGER); |
/* Futex is up after getting back from async_manager |
* get it again */ |
futex_down(&async_futex); |
if (usecs && conn->wdata.timedout && \ |
list_empty(&conn->msg_queue)) { |
/* If we timed out-> exit */ |
futex_up(&async_futex); |
return 0; |
} |
} |
msg = list_get_instance(conn->msg_queue.next, msg_t, link); |
list_remove(&msg->link); |
callid = msg->callid; |
*call = msg->call; |
free(msg); |
futex_up(&async_futex); |
return callid; |
} |
/** Thread function that gets created on new connection |
* |
* This function is defined as a weak symbol - to be redefined in |
* user code. |
*/ |
static void default_client_connection(ipc_callid_t callid, ipc_call_t *call) |
{ |
ipc_answer_fast(callid, ENOENT, 0, 0); |
} |
static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call) |
{ |
} |
/** Wrapper for client connection thread |
* |
* When new connection arrives, thread with this function is created. |
* It calls client_connection and does final cleanup. |
* |
* @param arg Connection structure pointer |
*/ |
static int connection_thread(void *arg) |
{ |
unsigned long key; |
msg_t *msg; |
int close_answered = 0; |
/* Setup thread local connection pointer */ |
PS_connection = (connection_t *)arg; |
PS_connection->cthread(PS_connection->callid, &PS_connection->call); |
/* Remove myself from connection hash table */ |
futex_down(&async_futex); |
key = PS_connection->in_phone_hash; |
hash_table_remove(&conn_hash_table, &key, 1); |
futex_up(&async_futex); |
/* Answer all remaining messages with ehangup */ |
while (!list_empty(&PS_connection->msg_queue)) { |
msg = list_get_instance(PS_connection->msg_queue.next, msg_t, link); |
list_remove(&msg->link); |
if (msg->callid == PS_connection->close_callid) |
close_answered = 1; |
ipc_answer_fast(msg->callid, EHANGUP, 0, 0); |
free(msg); |
} |
if (PS_connection->close_callid) |
ipc_answer_fast(PS_connection->close_callid, 0, 0, 0); |
} |
/** Create new thread for a new connection |
* |
* Creates new thread for connection, fills in connection |
* structures and inserts it into the hash table, so that |
* later we can easily do routing of messages to particular |
* threads. |
* |
* @param in_phone_hash Identification of the incoming connection |
* @param callid Callid of the IPC_M_CONNECT_ME_TO packet |
* @param call Call data of the opening packet |
* @param cthread Thread function that should be called upon |
* opening the connection |
* @return New thread id |
*/ |
pstid_t async_new_connection(ipcarg_t in_phone_hash,ipc_callid_t callid, |
ipc_call_t *call, |
void (*cthread)(ipc_callid_t,ipc_call_t *)) |
{ |
pstid_t ptid; |
connection_t *conn; |
unsigned long key; |
conn = malloc(sizeof(*conn)); |
if (!conn) { |
ipc_answer_fast(callid, ENOMEM, 0, 0); |
return NULL; |
} |
conn->in_phone_hash = in_phone_hash; |
list_initialize(&conn->msg_queue); |
conn->callid = callid; |
conn->close_callid = 0; |
if (call) |
conn->call = *call; |
conn->wdata.active = 1; /* We will activate it asap */ |
conn->cthread = cthread; |
conn->wdata.ptid = psthread_create(connection_thread, conn); |
if (!conn->wdata.ptid) { |
free(conn); |
ipc_answer_fast(callid, ENOMEM, 0, 0); |
return NULL; |
} |
/* Add connection to hash table */ |
key = conn->in_phone_hash; |
futex_down(&async_futex); |
hash_table_insert(&conn_hash_table, &key, &conn->link); |
futex_up(&async_futex); |
psthread_add_ready(conn->wdata.ptid); |
return conn->wdata.ptid; |
} |
/** Handle call that was received */ |
static void handle_call(ipc_callid_t callid, ipc_call_t *call) |
{ |
/* Unrouted call - do some default behaviour */ |
switch (IPC_GET_METHOD(*call)) { |
case IPC_M_INTERRUPT: |
in_interrupt_handler = 1; |
(*interrupt_received)(callid,call); |
in_interrupt_handler = 0; |
return; |
case IPC_M_CONNECT_ME_TO: |
/* Open new connection with thread etc. */ |
async_new_connection(IPC_GET_ARG3(*call), callid, call, client_connection); |
return; |
} |
/* Try to route call through connection tables */ |
if (route_call(callid, call)) |
return; |
/* Unknown call from unknown phone - hang it up */ |
ipc_answer_fast(callid, EHANGUP, 0, 0); |
} |
/** Fire all timeouts that expired |
* |
*/ |
static void handle_expired_timeouts(void) |
{ |
struct timeval tv; |
awaiter_t *waiter; |
link_t *cur; |
gettimeofday(&tv,NULL); |
futex_down(&async_futex); |
cur = timeout_list.next; |
while (cur != &timeout_list) { |
waiter = list_get_instance(cur,awaiter_t,link); |
if (tv_gt(&waiter->expires, &tv)) |
break; |
cur = cur->next; |
list_remove(&waiter->link); |
waiter->inlist = 0; |
waiter->timedout = 1; |
/* Redundant condition? The thread should not |
* be active when it gets here. |
*/ |
if (!waiter->active) { |
waiter->active = 1; |
psthread_add_ready(waiter->ptid); |
} |
} |
futex_up(&async_futex); |
} |
/** Endless loop dispatching incoming calls and answers */ |
static int async_manager_worker(void) |
{ |
ipc_call_t call; |
ipc_callid_t callid; |
int timeout; |
awaiter_t *waiter; |
struct timeval tv; |
while (1) { |
if (psthread_schedule_next_adv(PS_FROM_MANAGER)) { |
futex_up(&async_futex); /* async_futex is always held |
* when entering manager thread |
*/ |
continue; |
} |
futex_down(&async_futex); |
if (!list_empty(&timeout_list)) { |
waiter = list_get_instance(timeout_list.next,awaiter_t,link); |
gettimeofday(&tv,NULL); |
if (tv_gteq(&tv, &waiter->expires)) { |
futex_up(&async_futex); |
handle_expired_timeouts(); |
continue; |
} else |
timeout = tv_sub(&waiter->expires, &tv); |
} else |
timeout = SYNCH_NO_TIMEOUT; |
futex_up(&async_futex); |
callid = ipc_wait_cycle(&call, timeout, SYNCH_FLAGS_NONE); |
if (!callid) { |
handle_expired_timeouts(); |
continue; |
} |
if (callid & IPC_CALLID_ANSWERED) { |
continue; |
} |
handle_call(callid, &call); |
} |
} |
/** Function to start async_manager as a standalone thread |
* |
* When more kernel threads are used, one async manager should |
* exist per thread. The particular implementation may change, |
* currently one async_manager is started automatically per kernel |
* thread except main thread. |
*/ |
static int async_manager_thread(void *arg) |
{ |
futex_up(&async_futex); /* async_futex is always locked when entering |
* manager */ |
async_manager_worker(); |
} |
/** Add one manager to manager list */ |
void async_create_manager(void) |
{ |
pstid_t ptid; |
ptid = psthread_create(async_manager_thread, NULL); |
psthread_add_manager(ptid); |
} |
/** Remove one manager from manager list */ |
void async_destroy_manager(void) |
{ |
psthread_remove_manager(); |
} |
/** Initialize internal structures needed for async manager */ |
int _async_init(void) |
{ |
if (!hash_table_create(&conn_hash_table, CONN_HASH_TABLE_CHAINS, 1, &conn_hash_table_ops)) { |
printf("%s: cannot create hash table\n", "async"); |
return ENOMEM; |
} |
} |
/** IPC handler for messages in async framework |
* |
* Notify thread that is waiting for this message, that it arrived |
*/ |
static void reply_received(void *private, int retval, |
ipc_call_t *data) |
{ |
amsg_t *msg = (amsg_t *) private; |
msg->retval = retval; |
futex_down(&async_futex); |
/* Copy data after futex_down, just in case the |
* call was detached |
*/ |
if (msg->dataptr) |
*msg->dataptr = *data; |
write_barrier(); |
/* Remove message from timeout list */ |
if (msg->wdata.inlist) |
list_remove(&msg->wdata.link); |
msg->done = 1; |
if (! msg->wdata.active) { |
msg->wdata.active = 1; |
psthread_add_ready(msg->wdata.ptid); |
} |
futex_up(&async_futex); |
} |
/** Send message and return id of the sent message |
* |
* The return value can be used as input for async_wait() to wait |
* for completion. |
*/ |
aid_t async_send_2(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2, |
ipc_call_t *dataptr) |
{ |
amsg_t *msg; |
if (in_interrupt_handler) { |
printf("Cannot send asynchronou request in interrupt handler.\n"); |
_exit(1); |
} |
msg = malloc(sizeof(*msg)); |
msg->done = 0; |
msg->dataptr = dataptr; |
msg->wdata.active = 1; /* We may sleep in next method, but it |
* will use it's own mechanism */ |
ipc_call_async_2(phoneid,method,arg1,arg2,msg,reply_received,1); |
return (aid_t) msg; |
} |
/** Send message and return id of the sent message |
* |
* The return value can be used as input for async_wait() to wait |
* for completion. |
*/ |
aid_t async_send_3(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2, |
ipcarg_t arg3, ipc_call_t *dataptr) |
{ |
amsg_t *msg; |
if (in_interrupt_handler) { |
printf("Cannot send asynchronou request in interrupt handler.\n"); |
_exit(1); |
} |
msg = malloc(sizeof(*msg)); |
msg->done = 0; |
msg->dataptr = dataptr; |
msg->wdata.active = 1; /* We may sleep in next method, but it |
* will use it's own mechanism */ |
ipc_call_async_3(phoneid,method,arg1,arg2,arg3, msg,reply_received,1); |
return (aid_t) msg; |
} |
/** Wait for a message sent by async framework |
* |
* @param amsgid Message ID to wait for |
* @param retval Pointer to variable where will be stored retval |
* of the answered message. If NULL, it is ignored. |
* |
*/ |
void async_wait_for(aid_t amsgid, ipcarg_t *retval) |
{ |
amsg_t *msg = (amsg_t *) amsgid; |
connection_t *conn; |
futex_down(&async_futex); |
if (msg->done) { |
futex_up(&async_futex); |
goto done; |
} |
msg->wdata.ptid = psthread_get_id(); |
msg->wdata.active = 0; |
msg->wdata.inlist = 0; |
/* Leave locked async_futex when entering this function */ |
psthread_schedule_next_adv(PS_TO_MANAGER); |
/* futex is up automatically after psthread_schedule_next...*/ |
done: |
if (retval) |
*retval = msg->retval; |
free(msg); |
} |
/** Wait for a message sent by async framework with timeout |
* |
* @param amsgid Message ID to wait for |
* @param retval Pointer to variable where will be stored retval |
* of the answered message. If NULL, it is ignored. |
* @param timeout Timeout in usecs |
* @return 0 on success, ETIMEOUT if timeout expired |
* |
*/ |
int async_wait_timeout(aid_t amsgid, ipcarg_t *retval, suseconds_t timeout) |
{ |
amsg_t *msg = (amsg_t *) amsgid; |
connection_t *conn; |
/* TODO: Let it go through the event read at least once */ |
if (timeout < 0) |
return ETIMEOUT; |
futex_down(&async_futex); |
if (msg->done) { |
futex_up(&async_futex); |
goto done; |
} |
gettimeofday(&msg->wdata.expires, NULL); |
tv_add(&msg->wdata.expires, timeout); |
msg->wdata.ptid = psthread_get_id(); |
msg->wdata.active = 0; |
insert_timeout(&msg->wdata); |
/* Leave locked async_futex when entering this function */ |
psthread_schedule_next_adv(PS_TO_MANAGER); |
/* futex is up automatically after psthread_schedule_next...*/ |
if (!msg->done) |
return ETIMEOUT; |
done: |
if (retval) |
*retval = msg->retval; |
free(msg); |
return 0; |
} |
/** Wait specified time, but in the meantime handle incoming events |
* |
* @param timeout Time in microseconds to wait |
*/ |
void async_usleep(suseconds_t timeout) |
{ |
amsg_t *msg; |
if (in_interrupt_handler) { |
printf("Cannot call async_usleep in interrupt handler.\n"); |
_exit(1); |
} |
msg = malloc(sizeof(*msg)); |
if (!msg) |
return; |
msg->wdata.ptid = psthread_get_id(); |
msg->wdata.active = 0; |
gettimeofday(&msg->wdata.expires, NULL); |
tv_add(&msg->wdata.expires, timeout); |
futex_down(&async_futex); |
insert_timeout(&msg->wdata); |
/* Leave locked async_futex when entering this function */ |
psthread_schedule_next_adv(PS_TO_MANAGER); |
/* futex is up automatically after psthread_schedule_next...*/ |
free(msg); |
} |
/** Set function that is called, IPC_M_CONNECT_ME_TO is received |
* |
* @param conn Function that will form new psthread. |
*/ |
void async_set_client_connection(async_client_conn_t conn) |
{ |
client_connection = conn; |
} |
void async_set_interrupt_received(async_client_conn_t conn) |
{ |
interrupt_received = conn; |
} |
/* Primitive functions for simple communication */ |
void async_msg_3(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3) |
{ |
ipc_call_async_3(phoneid, method, arg1, arg2, arg3, NULL, NULL, !in_interrupt_handler); |
} |
void async_msg_2(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2) |
{ |
ipc_call_async_2(phoneid, method, arg1, arg2, NULL, NULL, !in_interrupt_handler); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/libadt/hash_table.c |
---|
0,0 → 1,182 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
/* |
* This is an implementation of generic chained hash table. |
*/ |
#include <libadt/hash_table.h> |
#include <libadt/list.h> |
#include <unistd.h> |
#include <malloc.h> |
#include <assert.h> |
#include <stdio.h> |
#include <string.h> |
/** Create chained hash table. |
* |
* @param h Hash table structure. Will be initialized by this call. |
* @param m Number of slots in the hash table. |
* @param max_keys Maximal number of keys needed to identify an item. |
* @param op Hash table operations structure. |
* @return true on success |
*/ |
int hash_table_create(hash_table_t *h, hash_count_t m, hash_count_t max_keys, hash_table_operations_t *op) |
{ |
hash_count_t i; |
assert(h); |
assert(op && op->hash && op->compare); |
assert(max_keys > 0); |
h->entry = malloc(m * sizeof(link_t)); |
if (!h->entry) { |
printf("cannot allocate memory for hash table\n"); |
return false; |
} |
memset((void *) h->entry, 0, m * sizeof(link_t)); |
for (i = 0; i < m; i++) |
list_initialize(&h->entry[i]); |
h->entries = m; |
h->max_keys = max_keys; |
h->op = op; |
return true; |
} |
/** Insert item into hash table. |
* |
* @param h Hash table. |
* @param hey Array of all keys necessary to compute hash index. |
* @param item Item to be inserted into the hash table. |
*/ |
void hash_table_insert(hash_table_t *h, unsigned long key[], link_t *item) |
{ |
hash_index_t chain; |
assert(item); |
assert(h && h->op && h->op->hash && h->op->compare); |
chain = h->op->hash(key); |
assert(chain < h->entries); |
list_append(item, &h->entry[chain]); |
} |
/** Search hash table for an item matching keys. |
* |
* @param h Hash table. |
* @param key Array of all keys needed to compute hash index. |
* |
* @return Matching item on success, NULL if there is no such item. |
*/ |
link_t *hash_table_find(hash_table_t *h, unsigned long key[]) |
{ |
link_t *cur; |
hash_index_t chain; |
assert(h && h->op && h->op->hash && h->op->compare); |
chain = h->op->hash(key); |
assert(chain < h->entries); |
for (cur = h->entry[chain].next; cur != &h->entry[chain]; cur = cur->next) { |
if (h->op->compare(key, h->max_keys, cur)) { |
/* |
* The entry is there. |
*/ |
return cur; |
} |
} |
return NULL; |
} |
/** Remove all matching items from hash table. |
* |
* For each removed item, h->remove_callback() is called. |
* |
* @param h Hash table. |
* @param key Array of keys that will be compared against items of the hash table. |
* @param keys Number of keys in the 'key' array. |
*/ |
void hash_table_remove(hash_table_t *h, unsigned long key[], hash_count_t keys) |
{ |
hash_index_t chain; |
link_t *cur; |
assert(h && h->op && h->op->hash && h->op->compare && h->op->remove_callback); |
assert(keys <= h->max_keys); |
if (keys == h->max_keys) { |
/* |
* All keys are known, hash_table_find() can be used to find the entry. |
*/ |
cur = hash_table_find(h, key); |
if (cur) { |
list_remove(cur); |
h->op->remove_callback(cur); |
} |
return; |
} |
/* |
* Fewer keys were passed. |
* Any partially matching entries are to be removed. |
*/ |
for (chain = 0; chain < h->entries; chain++) { |
for (cur = h->entry[chain].next; cur != &h->entry[chain]; cur = cur->next) { |
if (h->op->compare(key, keys, cur)) { |
link_t *hlp; |
hlp = cur; |
cur = cur->prev; |
list_remove(hlp); |
h->op->remove_callback(hlp); |
continue; |
} |
} |
} |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/libadt/list.c |
---|
0,0 → 1,92 |
/* |
* Copyright (C) 2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <libadt/list.h> |
/** Check for membership |
* |
* Check whether link is contained in the list head. |
* The membership is defined as pointer equivalence. |
* |
* @param link Item to look for. |
* @param head List to look in. |
* |
* @return true if link is contained in head, false otherwise. |
* |
*/ |
int list_member(const link_t *link, const link_t *head) |
{ |
int found = false; |
link_t *hlp = head->next; |
while (hlp != head) { |
if (hlp == link) { |
found = true; |
break; |
} |
hlp = hlp->next; |
} |
return found; |
} |
/** Concatenate two lists |
* |
* Concatenate lists head1 and head2, producing a single |
* list head1 containing items from both (in head1, head2 |
* order) and empty list head2. |
* |
* @param head1 First list and concatenated output |
* @param head2 Second list and empty output. |
* |
*/ |
void list_concat(link_t *head1, link_t *head2) |
{ |
if (list_empty(head2)) |
return; |
head2->next->prev = head1->prev; |
head2->prev->next = head1; |
head1->prev->next = head2->next; |
head1->prev = head2->prev; |
list_initialize(head2); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/stdlib.c |
---|
0,0 → 1,53 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdlib.h> |
static long glbl_seed = 1; |
long int random(void) |
{ |
return glbl_seed = ((1366*glbl_seed + 150889) % RAND_MAX); |
} |
void srandom(unsigned int seed) |
{ |
glbl_seed = seed; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/io/printf.c |
---|
0,0 → 1,64 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <io/printf_core.h> |
#include <stdio.h> |
#include <stdio.h> |
/** Print formatted text. |
* @param fmt format string |
* \see For more details about format string see printf_core. |
*/ |
int printf(const char *fmt, ...) |
{ |
int ret; |
va_list args; |
va_start(args, fmt); |
ret = vprintf(fmt, args); |
va_end(args); |
return ret; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/io/snprintf.c |
---|
0,0 → 1,62 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdarg.h> |
#include <stdio.h> |
#include <io/printf_core.h> |
/** Print formatted to the given buffer with limited size. |
* @param str buffer |
* @param size buffer size |
* @param fmt format string |
* \see For more details about format string see printf_core. |
*/ |
int snprintf(char *str, size_t size, const char *fmt, ...) |
{ |
int ret; |
va_list args; |
va_start(args, fmt); |
ret = vsnprintf(str, size, fmt, args); |
va_end(args); |
return ret; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/io/sprintf.c |
---|
0,0 → 1,61 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdarg.h> |
#include <stdio.h> |
#include <io/printf_core.h> |
/** Print formatted to the given buffer. |
* @param str buffer |
* @param fmt format string |
* \see For more details about format string see printf_core. |
*/ |
int sprintf(char *str, const char *fmt, ...) |
{ |
int ret; |
va_list args; |
va_start(args, fmt); |
ret = vsprintf(str, fmt, args); |
va_end(args); |
return ret; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/io/io.c |
---|
0,0 → 1,118 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <libc.h> |
#include <unistd.h> |
#include <stdio.h> |
#include <io/io.h> |
static char nl = '\n'; |
int puts(const char * str) |
{ |
size_t count; |
if (str == NULL) { |
return putnchars("(NULL)",6 ); |
} |
for (count = 0; str[count] != 0; count++); |
if (write(1, (void * ) str, count) == count) { |
if (write(1, &nl, 1) == 1) |
return 0; |
} |
return EOF; |
} |
/** Put count chars from buffer to stdout without adding newline |
* @param buf Buffer with size at least count bytes - NULL pointer NOT allowed! |
* @param count |
* @return 0 on succes, EOF on fail |
*/ |
int putnchars(const char * buf, size_t count) |
{ |
if (write(1, (void * ) buf, count) == count) { |
return 0; |
} |
return EOF; |
} |
/** Same as puts, but does not print newline at end |
* |
*/ |
int putstr(const char * str) |
{ |
size_t count; |
if (str == NULL) { |
return putnchars("(NULL)",6 ); |
} |
for (count = 0; str[count] != 0; count++); |
if (write(1, (void * ) str, count) == count) { |
return 0; |
} |
return EOF; |
} |
int putchar(int c) |
{ |
unsigned char ch = c; |
if (write(1, (void *)&ch , 1) == 1) { |
return c; |
} |
return EOF; |
} |
int getchar(void) |
{ |
unsigned char c; |
if (read(0, (void *)&c , 1) == 1) { |
return c; |
} |
return EOF; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/io/vprintf.c |
---|
0,0 → 1,65 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdarg.h> |
#include <stdio.h> |
#include <unistd.h> |
#include <io/printf_core.h> |
int vprintf_write(const char *str, size_t count, void *unused); |
int vprintf_write(const char *str, size_t count, void *unused) |
{ |
return write(1, str, count); |
} |
/** Print formatted text. |
* @param fmt format string |
* @param ap format parameters |
* \see For more details about format string see printf_core. |
*/ |
int vprintf(const char *fmt, va_list ap) |
{ |
struct printf_spec ps = {(int(*)(void *, size_t, void *))vprintf_write, NULL}; |
return printf_core(fmt, &ps, ap); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/io/vsnprintf.c |
---|
0,0 → 1,117 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdarg.h> |
#include <stdio.h> |
#include <string.h> |
#include <io/printf_core.h> |
struct vsnprintf_data { |
size_t size; /* total space for string */ |
size_t len; /* count of currently used characters */ |
char *string; /* destination string */ |
}; |
int vsnprintf_write(const char *str, size_t count, struct vsnprintf_data *data); |
/** Write string to given buffer. |
* Write at most data->size characters including trailing zero. According to C99 has snprintf to return number |
* of characters that would have been written if enough space had been available. Hence the return value is not |
* number of really printed characters but size of input string. Number of really used characters |
* is stored in data->len. |
* @param str source string to print |
* @param count size of source string |
* @param data structure with destination string, counter of used space and total string size. |
* @return number of characters to print (not characters really printed!) |
*/ |
int vsnprintf_write(const char *str, size_t count, struct vsnprintf_data *data) |
{ |
size_t i; |
i = data->size - data->len; |
if (i == 0) { |
return count; |
} |
if (i == 1) { |
/* We have only one free byte left in buffer => write there trailing zero */ |
data->string[data->size - 1] = 0; |
data->len = data->size; |
return count; |
} |
if (i <= count) { |
/* We have not enought space for whole string with the trailing zero => print only a part of string */ |
memcpy((void *)(data->string + data->len), (void *)str, i - 1); |
data->string[data->size - 1] = 0; |
data->len = data->size; |
return count; |
} |
/* Buffer is big enought to print whole string */ |
memcpy((void *)(data->string + data->len), (void *)str, count); |
data->len += count; |
/* Put trailing zero at end, but not count it into data->len so it could be rewritten next time */ |
data->string[data->len] = 0; |
return count; |
} |
/** Print formatted to the given buffer with limited size. |
* @param str buffer |
* @param size buffer size |
* @param fmt format string |
* \see For more details about format string see printf_core. |
*/ |
int vsnprintf(char *str, size_t size, const char *fmt, va_list ap) |
{ |
struct vsnprintf_data data = {size, 0, str}; |
struct printf_spec ps = {(int(*)(void *, size_t, void *))vsnprintf_write, &data}; |
/* Print 0 at end of string - fix the case that nothing will be printed */ |
if (size > 0) |
str[0] = 0; |
/* vsnprintf_write ensures that str will be terminated by zero. */ |
return printf_core(fmt, &ps, ap); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/io/printf_core.c |
---|
0,0 → 1,696 |
/* |
* Copyright (C) 2001-2004 Jakub Jermar |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** |
* @file |
* @brief Printing functions. |
*/ |
#include <unistd.h> |
#include <stdio.h> |
#include <io/printf_core.h> |
#include <ctype.h> |
#include <string.h> |
/* For serialization */ |
#include <async.h> |
#define __PRINTF_FLAG_PREFIX 0x00000001 /**< show prefixes 0x or 0*/ |
#define __PRINTF_FLAG_SIGNED 0x00000002 /**< signed / unsigned number */ |
#define __PRINTF_FLAG_ZEROPADDED 0x00000004 /**< print leading zeroes */ |
#define __PRINTF_FLAG_LEFTALIGNED 0x00000010 /**< align to left */ |
#define __PRINTF_FLAG_SHOWPLUS 0x00000020 /**< always show + sign */ |
#define __PRINTF_FLAG_SPACESIGN 0x00000040 /**< print space instead of plus */ |
#define __PRINTF_FLAG_BIGCHARS 0x00000080 /**< show big characters */ |
#define __PRINTF_FLAG_NEGATIVE 0x00000100 /**< number has - sign */ |
#define PRINT_NUMBER_BUFFER_SIZE (64+5) /**< Buffer big enought for 64 bit number |
* printed in base 2, sign, prefix and |
* 0 to terminate string.. (last one is only for better testing |
* end of buffer by zero-filling subroutine) |
*/ |
/** Enumeration of possible arguments types. |
*/ |
typedef enum { |
PrintfQualifierByte = 0, |
PrintfQualifierShort, |
PrintfQualifierInt, |
PrintfQualifierLong, |
PrintfQualifierLongLong, |
PrintfQualifierSizeT, |
PrintfQualifierPointer |
} qualifier_t; |
static char digits_small[] = "0123456789abcdef"; /**< Small hexadecimal characters */ |
static char digits_big[] = "0123456789ABCDEF"; /**< Big hexadecimal characters */ |
/** Print count chars from buffer without adding newline |
* @param buf Buffer with size at least count bytes - NULL pointer NOT allowed! |
* @param count |
* @param ps output method and its data |
* @return number of printed characters |
*/ |
static int printf_putnchars(const char * buf, size_t count, struct printf_spec *ps) |
{ |
return ps->write((void *)buf, count, ps->data); |
} |
/** Print string without added newline |
* @param str string to print |
* @param ps write function specification and support data |
* @return number of printed characters |
*/ |
static int printf_putstr(const char * str, struct printf_spec *ps) |
{ |
size_t count; |
if (str == NULL) { |
return printf_putnchars("(NULL)", 6, ps); |
} |
for (count = 0; str[count] != 0; count++); |
if (ps->write((void *) str, count, ps->data) == count) { |
return 0; |
} |
return EOF; |
} |
/** Print one character to output |
* @param c one character |
* @param ps output method |
* @return number of printed characters |
*/ |
static int printf_putchar(int c, struct printf_spec *ps) |
{ |
unsigned char ch = c; |
return ps->write((void *) &ch, 1, ps->data); |
} |
/** Print one formatted character |
* @param c character to print |
* @param width |
* @param flags |
* @return number of printed characters |
*/ |
static int print_char(char c, int width, uint64_t flags, struct printf_spec *ps) |
{ |
int counter = 0; |
if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) { |
while (--width > 0) { /* one space is consumed by character itself hence predecrement */ |
if (printf_putchar(' ', ps) > 0) |
++counter; |
} |
} |
if (printf_putchar(c, ps) > 0) |
counter++; |
while (--width > 0) { /* one space is consumed by character itself hence predecrement */ |
if (printf_putchar(' ', ps) > 0) |
++counter; |
} |
return ++counter; |
} |
/** Print one string |
* @param s string |
* @param width |
* @param precision |
* @param flags |
* @return number of printed characters |
*/ |
static int print_string(char *s, int width, int precision, uint64_t flags, struct printf_spec *ps) |
{ |
int counter = 0; |
size_t size; |
int retval; |
if (s == NULL) { |
return printf_putstr("(NULL)", ps); |
} |
size = strlen(s); |
/* print leading spaces */ |
if (precision == 0) |
precision = size; |
width -= precision; |
if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) { |
while (width-- > 0) { |
if (printf_putchar(' ', ps) == 1) |
counter++; |
} |
} |
while (precision > size) { |
precision--; |
if (printf_putchar(' ', ps) == 1) |
++counter; |
} |
if ((retval = printf_putnchars(s, precision, ps)) < 0) { |
return -counter; |
} |
counter += retval; |
while (width-- > 0) { |
if (printf_putchar(' ', ps) == 1) |
++counter; |
} |
return counter; |
} |
/** Print number in given base |
* |
* Print significant digits of a number in given |
* base. |
* |
* @param num Number to print. |
* @param width |
* @param precision |
* @param base Base to print the number in (should |
* be in range 2 .. 16). |
* @param flags output modifiers |
* @return number of printed characters |
* |
*/ |
static int print_number(uint64_t num, int width, int precision, int base , uint64_t flags, struct printf_spec *ps) |
{ |
char *digits = digits_small; |
char d[PRINT_NUMBER_BUFFER_SIZE]; /* this is good enough even for base == 2, prefix and sign */ |
char *ptr = &d[PRINT_NUMBER_BUFFER_SIZE - 1]; |
int size = 0; /* size of number with all prefixes and signs */ |
int number_size; /* size of plain number */ |
char sgn; |
int retval; |
int counter = 0; |
if (flags & __PRINTF_FLAG_BIGCHARS) |
digits = digits_big; |
*ptr-- = 0; /* Put zero at end of string */ |
if (num == 0) { |
*ptr-- = '0'; |
size++; |
} else { |
do { |
*ptr-- = digits[num % base]; |
size++; |
} while (num /= base); |
} |
number_size = size; |
/* Collect sum of all prefixes/signs/... to calculate padding and leading zeroes */ |
if (flags & __PRINTF_FLAG_PREFIX) { |
switch(base) { |
case 2: /* Binary formating is not standard, but usefull */ |
size += 2; |
break; |
case 8: |
size++; |
break; |
case 16: |
size += 2; |
break; |
} |
} |
sgn = 0; |
if (flags & __PRINTF_FLAG_SIGNED) { |
if (flags & __PRINTF_FLAG_NEGATIVE) { |
sgn = '-'; |
size++; |
} else if (flags & __PRINTF_FLAG_SHOWPLUS) { |
sgn = '+'; |
size++; |
} else if (flags & __PRINTF_FLAG_SPACESIGN) { |
sgn = ' '; |
size++; |
} |
} |
if (flags & __PRINTF_FLAG_LEFTALIGNED) { |
flags &= ~__PRINTF_FLAG_ZEROPADDED; |
} |
/* if number is leftaligned or precision is specified then zeropadding is ignored */ |
if (flags & __PRINTF_FLAG_ZEROPADDED) { |
if ((precision == 0) && (width > size)) { |
precision = width - size + number_size; |
} |
} |
/* print leading spaces */ |
if (number_size > precision) /* We must print whole number not only a part */ |
precision = number_size; |
width -= precision + size - number_size; |
if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) { |
while (width-- > 0) { |
if (printf_putchar(' ', ps) == 1) |
counter++; |
} |
} |
/* print sign */ |
if (sgn) { |
if (printf_putchar(sgn, ps) == 1) |
counter++; |
} |
/* print prefix */ |
if (flags & __PRINTF_FLAG_PREFIX) { |
switch(base) { |
case 2: /* Binary formating is not standard, but usefull */ |
if (printf_putchar('0', ps) == 1) |
counter++; |
if (flags & __PRINTF_FLAG_BIGCHARS) { |
if (printf_putchar('B', ps) == 1) |
counter++; |
} else { |
if (printf_putchar('b', ps) == 1) |
counter++; |
} |
break; |
case 8: |
if (printf_putchar('o', ps) == 1) |
counter++; |
break; |
case 16: |
if (printf_putchar('0', ps) == 1) |
counter++; |
if (flags & __PRINTF_FLAG_BIGCHARS) { |
if (printf_putchar('X', ps) == 1) |
counter++; |
} else { |
if (printf_putchar('x', ps) == 1) |
counter++; |
} |
break; |
} |
} |
/* print leading zeroes */ |
precision -= number_size; |
while (precision-- > 0) { |
if (printf_putchar('0', ps) == 1) |
counter++; |
} |
/* print number itself */ |
if ((retval = printf_putstr(++ptr, ps)) > 0) { |
counter += retval; |
} |
/* print ending spaces */ |
while (width-- > 0) { |
if (printf_putchar(' ', ps) == 1) |
counter++; |
} |
return counter; |
} |
/** Print formatted string. |
* |
* Print string formatted according to the fmt parameter |
* and variadic arguments. Each formatting directive |
* must have the following form: |
* |
* \% [ FLAGS ] [ WIDTH ] [ .PRECISION ] [ TYPE ] CONVERSION |
* |
* FLAGS:@n |
* - "#" Force to print prefix. |
* For conversion \%o the prefix is 0, for %x and \%X prefixes are 0x and 0X |
* and for conversion \%b the prefix is 0b. |
* |
* - "-" Align to left. |
* |
* - "+" Print positive sign just as negative. |
* |
* - " " If the printed number is positive and "+" flag is not set, print space in |
* place of sign. |
* |
* - "0" Print 0 as padding instead of spaces. Zeroes are placed between sign and the |
* rest of the number. This flag is ignored if "-" flag is specified. |
* |
* WIDTH:@n |
* - Specify minimal width of printed argument. If it is bigger, width is ignored. |
* If width is specified with a "*" character instead of number, width is taken from |
* parameter list. And integer parameter is expected before parameter for processed |
* conversion specification. If this value is negative its absolute value is taken |
* and the "-" flag is set. |
* |
* PRECISION:@n |
* - Value precision. For numbers it specifies minimum valid numbers. |
* Smaller numbers are printed with leading zeroes. Bigger numbers are not affected. |
* Strings with more than precision characters are cut off. |
* Just as with width, an "*" can be used used instead of a number. |
* An integer value is then expected in parameters. When both width and precision |
* are specified using "*", the first parameter is used for width and the second one |
* for precision. |
* |
* TYPE:@n |
* - "hh" Signed or unsigned char.@n |
* - "h" Signed or usigned short.@n |
* - "" Signed or usigned int (default value).@n |
* - "l" Signed or usigned long int.@n |
* - "ll" Signed or usigned long long int.@n |
* - "z" Type size_t.@n |
* |
* |
* CONVERSION:@n |
* - % Print percentile character itself. |
* |
* - c Print single character. |
* |
* - s Print zero terminated string. If a NULL value is passed as value, "(NULL)" is printed instead. |
* |
* - P, p Print value of a pointer. Void * value is expected and it is printed in hexadecimal notation with prefix |
* (as with '\%#X' or '\%#x' for 32bit or '\%#X' or '\%#x' for 64bit long pointers). |
* |
* - b Print value as unsigned binary number. Prefix is not printed by default. (Nonstandard extension.) |
* |
* - o Print value as unsigned octal number. Prefix is not printed by default. |
* |
* - d,i Print signed decimal number. There is no difference between d and i conversion. |
* |
* - u Print unsigned decimal number. |
* |
* - X, x Print hexadecimal number with upper- or lower-case. Prefix is not printed by default. |
* |
* All other characters from fmt except the formatting directives |
* are printed in verbatim. |
* |
* @param fmt Formatting NULL terminated string. |
* @return Number of printed characters or negative value on failure. |
*/ |
int printf_core(const char *fmt, struct printf_spec *ps, va_list ap) |
{ |
int i = 0, j = 0; /* i is index of currently processed char from fmt, j is index to the first not printed nonformating character */ |
int end; |
int counter; /* counter of printed characters */ |
int retval; /* used to store return values from called functions */ |
char c; |
qualifier_t qualifier; /* type of argument */ |
int base; /* base in which will be parameter (numbers only) printed */ |
uint64_t number; /* argument value */ |
size_t size; /* byte size of integer parameter */ |
int width, precision; |
uint64_t flags; |
/* Don't let other threads interfere */ |
async_serialize_start(); |
counter = 0; |
while ((c = fmt[i])) { |
/* control character */ |
if (c == '%' ) { |
/* print common characters if any processed */ |
if (i > j) { |
if ((retval = printf_putnchars(&fmt[j], (size_t)(i - j), ps)) < 0) { /* error */ |
goto minus_out; |
} |
counter += retval; |
} |
j = i; |
/* parse modifiers */ |
flags = 0; |
end = 0; |
do { |
++i; |
switch (c = fmt[i]) { |
case '#': flags |= __PRINTF_FLAG_PREFIX; break; |
case '-': flags |= __PRINTF_FLAG_LEFTALIGNED; break; |
case '+': flags |= __PRINTF_FLAG_SHOWPLUS; break; |
case ' ': flags |= __PRINTF_FLAG_SPACESIGN; break; |
case '0': flags |= __PRINTF_FLAG_ZEROPADDED; break; |
default: end = 1; |
}; |
} while (end == 0); |
/* width & '*' operator */ |
width = 0; |
if (isdigit(fmt[i])) { |
while (isdigit(fmt[i])) { |
width *= 10; |
width += fmt[i++] - '0'; |
} |
} else if (fmt[i] == '*') { |
/* get width value from argument list*/ |
i++; |
width = (int)va_arg(ap, int); |
if (width < 0) { |
/* negative width means to set '-' flag */ |
width *= -1; |
flags |= __PRINTF_FLAG_LEFTALIGNED; |
} |
} |
/* precision and '*' operator */ |
precision = 0; |
if (fmt[i] == '.') { |
++i; |
if (isdigit(fmt[i])) { |
while (isdigit(fmt[i])) { |
precision *= 10; |
precision += fmt[i++] - '0'; |
} |
} else if (fmt[i] == '*') { |
/* get precision value from argument list*/ |
i++; |
precision = (int)va_arg(ap, int); |
if (precision < 0) { |
/* negative precision means to ignore it */ |
precision = 0; |
} |
} |
} |
switch (fmt[i++]) { |
/** TODO: unimplemented qualifiers: |
* t ptrdiff_t - ISO C 99 |
*/ |
case 'h': /* char or short */ |
qualifier = PrintfQualifierShort; |
if (fmt[i] == 'h') { |
i++; |
qualifier = PrintfQualifierByte; |
} |
break; |
case 'l': /* long or long long*/ |
qualifier = PrintfQualifierLong; |
if (fmt[i] == 'l') { |
i++; |
qualifier = PrintfQualifierLongLong; |
} |
break; |
case 'z': /* size_t */ |
qualifier = PrintfQualifierSizeT; |
break; |
default: |
qualifier = PrintfQualifierInt; /* default type */ |
--i; |
} |
base = 10; |
switch (c = fmt[i]) { |
/* |
* String and character conversions. |
*/ |
case 's': |
if ((retval = print_string(va_arg(ap, char*), width, precision, flags, ps)) < 0) { |
goto minus_out; |
}; |
counter += retval; |
j = i + 1; |
goto next_char; |
case 'c': |
c = va_arg(ap, unsigned int); |
if ((retval = print_char(c, width, flags, ps)) < 0) { |
goto minus_out; |
}; |
counter += retval; |
j = i + 1; |
goto next_char; |
/* |
* Integer values |
*/ |
case 'P': /* pointer */ |
flags |= __PRINTF_FLAG_BIGCHARS; |
case 'p': |
flags |= __PRINTF_FLAG_PREFIX; |
base = 16; |
qualifier = PrintfQualifierPointer; |
break; |
case 'b': |
base = 2; |
break; |
case 'o': |
base = 8; |
break; |
case 'd': |
case 'i': |
flags |= __PRINTF_FLAG_SIGNED; |
case 'u': |
break; |
case 'X': |
flags |= __PRINTF_FLAG_BIGCHARS; |
case 'x': |
base = 16; |
break; |
/* percentile itself */ |
case '%': |
j = i; |
goto next_char; |
/* |
* Bad formatting. |
*/ |
default: |
/* Unknown format |
* now, the j is index of '%' so we will |
* print whole bad format sequence |
*/ |
goto next_char; |
} |
/* Print integers */ |
/* print number */ |
switch (qualifier) { |
case PrintfQualifierByte: |
size = sizeof(unsigned char); |
number = (uint64_t)va_arg(ap, unsigned int); |
break; |
case PrintfQualifierShort: |
size = sizeof(unsigned short); |
number = (uint64_t)va_arg(ap, unsigned int); |
break; |
case PrintfQualifierInt: |
size = sizeof(unsigned int); |
number = (uint64_t)va_arg(ap, unsigned int); |
break; |
case PrintfQualifierLong: |
size = sizeof(unsigned long); |
number = (uint64_t)va_arg(ap, unsigned long); |
break; |
case PrintfQualifierLongLong: |
size = sizeof(unsigned long long); |
number = (uint64_t)va_arg(ap, unsigned long long); |
break; |
case PrintfQualifierPointer: |
size = sizeof(void *); |
number = (uint64_t)(unsigned long)va_arg(ap, void *); |
break; |
case PrintfQualifierSizeT: |
size = sizeof(size_t); |
number = (uint64_t)va_arg(ap, size_t); |
break; |
default: /* Unknown qualifier */ |
goto minus_out; |
} |
if (flags & __PRINTF_FLAG_SIGNED) { |
if (number & (0x1 << (size*8 - 1))) { |
flags |= __PRINTF_FLAG_NEGATIVE; |
if (size == sizeof(uint64_t)) { |
number = -((int64_t)number); |
} else { |
number = ~number; |
number &= (~((0xFFFFFFFFFFFFFFFFll) << (size * 8))); |
number++; |
} |
} |
} |
if ((retval = print_number(number, width, precision, base, flags, ps)) < 0 ) { |
goto minus_out; |
}; |
counter += retval; |
j = i + 1; |
} |
next_char: |
++i; |
} |
if (i > j) { |
if ((retval = printf_putnchars(&fmt[j], (size_t)(i - j), ps)) < 0) { /* error */ |
goto minus_out; |
} |
counter += retval; |
} |
async_serialize_end(); |
return counter; |
minus_out: |
async_serialize_end(); |
return -counter; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/io/stream.c |
---|
0,0 → 1,195 |
/* |
* Copyright (C) 2006 Josef Cejka |
* Copyright (C) 2006 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <io/io.h> |
#include <io/stream.h> |
#include <string.h> |
#include <malloc.h> |
#include <libc.h> |
#include <ipc/ipc.h> |
#include <ipc/ns.h> |
#include <ipc/fb.h> |
#include <ipc/services.h> |
#include <console.h> |
#include <unistd.h> |
#include <async.h> |
#define FDS 32 |
typedef struct stream_t { |
pwritefn_t w; |
preadfn_t r; |
void * param; |
int phone; |
} stream_t; |
static int console_phone = -1; |
static stream_t streams[FDS]; |
static ssize_t write_stderr(void *param, const void *buf, size_t count) |
{ |
return count; |
} |
static ssize_t read_stdin(void *param, void *buf, size_t count) |
{ |
ipcarg_t r0,r1; |
size_t i = 0; |
while (i < count) { |
if (async_req_2(streams[0].phone, CONSOLE_GETCHAR, 0, 0, &r0, &r1) < 0) { |
return -1; |
} |
((char *)buf)[i++] = r0; |
} |
return i; |
} |
static ssize_t write_stdout(void *param, const void *buf, size_t count) |
{ |
int i; |
ipcarg_t r0,r1; |
for (i = 0; i < count; i++) |
async_msg(streams[1].phone, CONSOLE_PUTCHAR, ((const char *)buf)[i]); |
return count; |
} |
static stream_t open_stdin(void) |
{ |
stream_t stream; |
int phoneid; |
int res; |
if (console_phone < 0) { |
while ((console_phone = ipc_connect_me_to(PHONE_NS, SERVICE_CONSOLE, 0)) < 0) { |
usleep(10000); |
} |
} |
stream.r = read_stdin; |
stream.param = 0; |
stream.phone = console_phone; |
return stream; |
} |
static stream_t open_stdout(void) |
{ |
stream_t stream; |
int res; |
if (console_phone < 0) { |
while ((console_phone = ipc_connect_me_to(PHONE_NS, SERVICE_CONSOLE, 0)) < 0) { |
usleep(10000); |
} |
} |
stream.w = write_stdout; |
stream.phone = console_phone; |
stream.param = 0; |
return stream; |
} |
static ssize_t write_null(void *param, const void *buf, size_t count) |
{ |
return count; |
} |
fd_t open(const char *fname, int flags) |
{ |
int c = 0; |
while (((streams[c].w) || (streams[c].r)) && (c < FDS)) |
c++; |
if (c == FDS) |
return EMFILE; |
if (!strcmp(fname, "stdin")) { |
streams[c] = open_stdin(); |
return c; |
} |
if (!strcmp(fname, "stdout")) { |
streams[c] = open_stdout(); |
return c; |
} |
if (!strcmp(fname, "stderr")) { |
streams[c].w = write_stderr; |
return c; |
} |
if (!strcmp(fname, "null")) { |
streams[c].w = write_null; |
return c; |
} |
} |
ssize_t write(int fd, const void *buf, size_t count) |
{ |
// __SYSCALL3(SYS_IO, 1, (sysarg_t)buf, (sysarg_t) count); |
// return count; |
if (fd < FDS) |
return streams[fd].w(streams[fd].param, buf, count); |
return 0; |
} |
ssize_t read(int fd, void *buf, size_t count) |
{ |
if (fd < FDS) |
return streams[fd].r(streams[fd].param, buf, count); |
return 0; |
} |
int get_fd_phone(int fd) |
{ |
if (fd >= FDS || fd < 0) |
return -1; |
return streams[fd].phone; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/io/vsprintf.c |
---|
0,0 → 1,55 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdarg.h> |
#include <stdio.h> |
#include <io/printf_core.h> |
/** Print formatted to the given buffer. |
* @param str buffer |
* @param fmt format string |
* @param ap argument list |
* \see For more details about format string see printf_core. |
*/ |
int vsprintf(char *str, const char *fmt, va_list ap) |
{ |
return vsnprintf(str, (size_t)-1, fmt, ap); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/err.c |
---|
0,0 → 1,48 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdio.h> |
#include <stdlib.h> |
void errx (int __status, __const char *__format, ...) |
{ |
printf("TODO...errx\n"); |
_exit(0); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/sysinfo.c |
---|
0,0 → 1,49 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <libc.h> |
#include <sysinfo.h> |
#include <string.h> |
sysarg_t sysinfo_value(char *name) |
{ |
return __SYSCALL2(SYS_SYSINFO_VALUE, (sysarg_t ) name, (sysarg_t) strlen(name) ); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/mmap.c |
---|
0,0 → 1,64 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <sys/mman.h> |
#include <as.h> |
#include <unistd.h> |
void *mmap(void *start, size_t length, int prot, int flags, int fd, |
off_t offset) |
{ |
int rc; |
if (!start) |
start = as_get_mappable_page(length); |
// if (! ((flags & MAP_SHARED) ^ (flags & MAP_PRIVATE))) |
// return MAP_FAILED; |
if (! (flags & MAP_ANONYMOUS)) |
return MAP_FAILED; |
return as_area_create(start, length, prot); |
} |
int munmap(void *start, size_t length) |
{ |
return as_area_destroy(start); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/generic/futex.c |
---|
0,0 → 1,180 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <futex.h> |
#include <atomic.h> |
#include <libc.h> |
#include <stdio.h> |
#include <types.h> |
#include <kernel/synch/synch.h> |
/* |
* Note about race conditions. |
* Because of non-atomic nature of operations performed sequentially on the futex |
* counter and the futex wait queue, there is a race condition: |
* |
* (wq->missed_wakeups == 1) && (futex->count = 1) |
* |
* Scenario 1 (wait queue timeout vs. futex_up()): |
* 1. assume wq->missed_wakeups == 0 && futex->count == -1 |
* (ie. thread A sleeping, thread B in the critical section) |
* 2. A receives timeout and gets removed from the wait queue |
* 3. B wants to leave the critical section and calls futex_up() |
* 4. B thus changes futex->count from -1 to 0 |
* 5. B has to call SYS_FUTEX_WAKEUP syscall to wake up the sleeping thread |
* 6. B finds the wait queue empty and changes wq->missed_wakeups from 0 to 1 |
* 7. A fixes futex->count (i.e. the number of waiting threads) by changing it from 0 to 1 |
* |
* Scenario 2 (conditional down operation vs. futex_up) |
* 1. assume wq->missed_wakeups == 0 && futex->count == 0 |
* (i.e. thread A is in the critical section) |
* 2. thread B performs futex_trydown() operation and changes futex->count from 0 to -1 |
* B is now obliged to call SYS_FUTEX_SLEEP syscall |
* 3. A wants to leave the critical section and does futex_up() |
* 4. A thus changes futex->count from -1 to 0 and must call SYS_FUTEX_WAKEUP syscall |
* 5. B finds the wait queue empty and immediatelly aborts the conditional sleep |
* 6. No thread is queueing in the wait queue so wq->missed_wakeups changes from 0 to 1 |
* 6. B fixes futex->count (i.e. the number of waiting threads) by changing it from 0 to 1 |
* |
* Both scenarios allow two threads to be in the critical section simultaneously. |
* One without kernel intervention and the other through wq->missed_wakeups being 1. |
* |
* To mitigate this problem, futex_down_timeout() detects that the syscall didn't sleep |
* in the wait queue, fixes the futex counter and RETRIES the whole operation again. |
* |
*/ |
/** Initialize futex counter. |
* |
* @param futex Futex. |
* @param val Initialization value. |
*/ |
void futex_initialize(atomic_t *futex, int val) |
{ |
atomic_set(futex, val); |
} |
int futex_down(atomic_t *futex) |
{ |
return futex_down_timeout(futex, SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE); |
} |
int futex_trydown(atomic_t *futex) |
{ |
return futex_down_timeout(futex, SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NON_BLOCKING); |
} |
/** Try to down the futex. |
* |
* @param futex Futex. |
* @param usec Microseconds to wait. Zero value means sleep without timeout. |
* @param flags Select mode of operation. See comment for waitq_sleep_timeout(). |
* |
* @return ENOENT if there is no such virtual address. One of ESYNCH_OK_ATOMIC |
* and ESYNCH_OK_BLOCKED on success or ESYNCH_TIMEOUT if the lock was |
* not acquired because of a timeout or ESYNCH_WOULD_BLOCK if the |
* operation could not be carried out atomically (if requested so). |
*/ |
int futex_down_timeout(atomic_t *futex, uint32_t usec, int flags) |
{ |
int rc; |
while (atomic_predec(futex) < 0) { |
rc = __SYSCALL3(SYS_FUTEX_SLEEP, (sysarg_t) &futex->count, (sysarg_t) usec, (sysarg_t) flags); |
switch (rc) { |
case ESYNCH_OK_ATOMIC: |
/* |
* Because of a race condition between timeout and futex_up() |
* and between conditional futex_down_timeout() and futex_up(), |
* we have to give up and try again in this special case. |
*/ |
atomic_inc(futex); |
break; |
case ESYNCH_TIMEOUT: |
atomic_inc(futex); |
return ESYNCH_TIMEOUT; |
break; |
case ESYNCH_WOULD_BLOCK: |
/* |
* The conditional down operation should be implemented this way. |
* The userspace-only variant tends to accumulate missed wakeups |
* in the kernel futex wait queue. |
*/ |
atomic_inc(futex); |
return ESYNCH_WOULD_BLOCK; |
break; |
case ESYNCH_OK_BLOCKED: |
/* |
* Enter the critical section. |
* The futex counter has already been incremented for us. |
*/ |
return ESYNCH_OK_BLOCKED; |
break; |
default: |
return rc; |
} |
} |
/* |
* Enter the critical section. |
*/ |
return ESYNCH_OK_ATOMIC; |
} |
/** Up the futex. |
* |
* @param futex Futex. |
* |
* @return ENOENT if there is no such virtual address. Otherwise zero. |
*/ |
int futex_up(atomic_t *futex) |
{ |
long val; |
val = atomic_postinc(futex); |
if (val < 0) |
return __SYSCALL1(SYS_FUTEX_WAKEUP, (sysarg_t) &futex->count); |
return 0; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/align.h |
---|
0,0 → 1,59 |
/* |
* Copyright (C) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ALIGN_H__ |
#define __ALIGN_H__ |
/** Align to the nearest lower address. |
* |
* @param s Address or size to be aligned. |
* @param a Size of alignment, must be power of 2. |
*/ |
#define ALIGN_DOWN(s, a) ((s) & ~((a) - 1)) |
/** Align to the nearest higher address. |
* |
* @param s Address or size to be aligned. |
* @param a Size of alignment, must be power of 2. |
*/ |
#define ALIGN_UP(s, a) ((long)((s) + ((a) - 1)) & ~((long) (a) - 1)) |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/futex.h |
---|
0,0 → 1,55 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__FUTEX_H__ |
#define __LIBC__FUTEX_H__ |
#include <atomic.h> |
#include <types.h> |
#define FUTEX_INITIALIZER {1} |
extern void futex_initialize(atomic_t *futex, int value); |
extern int futex_down(atomic_t *futex); |
extern int futex_trydown(atomic_t *futex); |
extern int futex_down_timeout(atomic_t *futex, uint32_t usec, int flags); |
extern int futex_up(atomic_t *futex); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/endian.h |
---|
0,0 → 1,51 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__ENDIAN_H__ |
#define __LIBC__ENDIAN_H__ |
#define __LITTLE_ENDIAN 1234 |
#define __BIG_ENDIAN 4321 |
#define __PDP_ENDIAN 3412 |
#include <libarch/endian.h> |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/ddi.h |
---|
0,0 → 1,50 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC_DDI_H__ |
#define __LIBC_DDI_H__ |
#include <task.h> |
extern int map_physmem(void *pf, void *vp, unsigned long pages, int flags); |
extern int iospace_enable(task_id_t id, void *ioaddr, unsigned long size); |
extern int preemption_control(int enable); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/limits.h |
---|
0,0 → 1,78 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__LIMITS_H__ |
#define __LIBC__LIMITS_H__ |
#include <stdint.h> |
#include <libarch/limits.h> |
/* char */ |
#define SCHAR_MIN MIN_INT8 |
#define SCHAR_MAX MAX_INT8 |
#define UCHAR_MIN MIN_UINT8 |
#define UCHAR_MAX MAX_UINT8 |
#ifdef __CHAR_UNSIGNED__ |
# define CHAR_MIN UCHAR_MIN |
# define CHAR_MAX UCHAR_MAX |
#else |
# define CHAR_MIN SCHAR_MIN |
# define CHAR_MAX SCHAR_MAX |
#endif |
/* short int */ |
#define SHRT_MIN MIN_INT16 |
#define SHRT_MAX MAX_INT16 |
#define USHRT_MIN MIN_UINT16 |
#define USHRT_MAX MAX_UINT16 |
#define INT_MIN MIN_INT32 |
#define INT_MAX MAX_INT32 |
#define UINT_MIN MIN_UINT32 |
#define UINT_MAX MAX_UINT32 |
#define LLONG_MIN MIN_INT64 |
#define LLONG_MAX MAX_INT64 |
#define ULLONG_MIN MIN_UINT64 |
#define ULLONG_MAX MAX_UINT64 |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/as.h |
---|
0,0 → 1,57 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __libc_AS_H__ |
#define __libc_AS_H__ |
#include <types.h> |
#include <task.h> |
#include <kernel/arch/mm/as.h> |
#include <kernel/mm/as.h> |
#define USER_ADDRESS_SPACE_SIZE_ARCH (USER_ADDRESS_SPACE_END_ARCH-USER_ADDRESS_SPACE_START_ARCH+1) |
extern void *as_area_create(void *address, size_t size, int flags); |
extern int as_area_resize(void *address, size_t size, int flags); |
extern int as_area_destroy(void *address); |
extern void *set_maxheapsize(size_t mhs); |
extern void * as_get_mappable_page(size_t sz); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/types.h |
---|
0,0 → 1,7 |
#include <libarch/types.h> |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/stdint.h |
---|
0,0 → 1,68 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__STDINT_H__ |
#define __LIBC__STDINT_H__ |
/* Definitions of types with fixed size*/ |
#include <types.h> |
#define MAX_INT8 (0x7F) |
#define MIN_INT8 (0x80) |
#define MAX_UINT8 (0xFFu) |
#define MIN_UINT8 (0u) |
#define MAX_INT16 (0x7FFF) |
#define MIN_INT16 (0x8000) |
#define MAX_UINT16 (0xFFFFu) |
#define MIN_UINT16 (0u) |
#define MAX_INT32 (0x7FFFFFFF) |
#define MIN_INT32 (0x80000000) |
#define MAX_UINT32 (0xFFFFFFFFu) |
#define MIN_UINT32 (0u) |
#define MAX_INT64 (0x7FFFFFFFFFFFFFFFll) |
#define MIN_INT64 (0x8000000000000000ll) |
#define MAX_UINT64 (0xFFFFFFFFFFFFFFFFull) |
#define MIN_UINT64 (0ull) |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/string.h |
---|
0,0 → 1,66 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__STRING_H__ |
#define __LIBC__STRING_H__ |
#include <types.h> |
#define bzero(ptr, len) memset((ptr), 0, (len)) |
void * memset(void *s, int c, size_t n); |
void * memcpy(void *dest, const void *src, size_t n); |
void * memmove(void *dest, const void *src, size_t n); |
int strcmp(const char *, const char *); |
char *strcpy(char *dest, const char *src); |
char *strncpy(char *dest, const char *src, size_t n); |
size_t strlen(const char *str); |
char *strchr(const char *str, int c); |
char *strrchr(const char *str, int c); |
long int strtol(const char *nptr, char **endptr, int base); |
unsigned long strtoul(const char *nptr, char **endptr, int base); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/malloc.h |
---|
0,0 → 1,537 |
/* |
Default header file for malloc-2.8.x, written by Doug Lea |
and released to the public domain, as explained at |
http://creativecommons.org/licenses/publicdomain. |
last update: Mon Aug 15 08:55:52 2005 Doug Lea (dl at gee) |
This header is for ANSI C/C++ only. You can set any of |
the following #defines before including: |
* If USE_DL_PREFIX is defined, it is assumed that malloc.c |
was also compiled with this option, so all routines |
have names starting with "dl". |
* If HAVE_USR_INCLUDE_MALLOC_H is defined, it is assumed that this |
file will be #included AFTER <malloc.h>. This is needed only if |
your system defines a struct mallinfo that is incompatible with the |
standard one declared here. Otherwise, you can include this file |
INSTEAD of your system system <malloc.h>. At least on ANSI, all |
declarations should be compatible with system versions |
* If MSPACES is defined, declarations for mspace versions are included. |
*/ |
#ifndef MALLOC_280_H |
#define MALLOC_280_H |
#ifdef __cplusplus |
extern "C" { |
#endif |
#include <stddef.h> /* for size_t */ |
#if !ONLY_MSPACES |
#ifndef USE_DL_PREFIX |
#define dlcalloc calloc |
#define dlfree free |
#define dlmalloc malloc |
#define dlmemalign memalign |
#define dlrealloc realloc |
#define dlvalloc valloc |
#define dlpvalloc pvalloc |
#define dlmallinfo mallinfo |
#define dlmallopt mallopt |
#define dlmalloc_trim malloc_trim |
#define dlmalloc_stats malloc_stats |
#define dlmalloc_usable_size malloc_usable_size |
#define dlmalloc_footprint malloc_footprint |
#define dlmalloc_max_footprint malloc_max_footprint |
#define dlindependent_calloc independent_calloc |
#define dlindependent_comalloc independent_comalloc |
#endif /* USE_DL_PREFIX */ |
/* |
malloc(size_t n) |
Returns a pointer to a newly allocated chunk of at least n bytes, or |
null if no space is available, in which case errno is set to ENOMEM |
on ANSI C systems. |
If n is zero, malloc returns a minimum-sized chunk. (The minimum |
size is 16 bytes on most 32bit systems, and 32 bytes on 64bit |
systems.) Note that size_t is an unsigned type, so calls with |
arguments that would be negative if signed are interpreted as |
requests for huge amounts of space, which will often fail. The |
maximum supported value of n differs across systems, but is in all |
cases less than the maximum representable value of a size_t. |
*/ |
void* dlmalloc(size_t); |
/* |
free(void* p) |
Releases the chunk of memory pointed to by p, that had been previously |
allocated using malloc or a related routine such as realloc. |
It has no effect if p is null. If p was not malloced or already |
freed, free(p) will by default cuase the current program to abort. |
*/ |
void dlfree(void*); |
/* |
calloc(size_t n_elements, size_t element_size); |
Returns a pointer to n_elements * element_size bytes, with all locations |
set to zero. |
*/ |
void* dlcalloc(size_t, size_t); |
/* |
realloc(void* p, size_t n) |
Returns a pointer to a chunk of size n that contains the same data |
as does chunk p up to the minimum of (n, p's size) bytes, or null |
if no space is available. |
The returned pointer may or may not be the same as p. The algorithm |
prefers extending p in most cases when possible, otherwise it |
employs the equivalent of a malloc-copy-free sequence. |
If p is null, realloc is equivalent to malloc. |
If space is not available, realloc returns null, errno is set (if on |
ANSI) and p is NOT freed. |
if n is for fewer bytes than already held by p, the newly unused |
space is lopped off and freed if possible. realloc with a size |
argument of zero (re)allocates a minimum-sized chunk. |
The old unix realloc convention of allowing the last-free'd chunk |
to be used as an argument to realloc is not supported. |
*/ |
void* dlrealloc(void*, size_t); |
/* |
memalign(size_t alignment, size_t n); |
Returns a pointer to a newly allocated chunk of n bytes, aligned |
in accord with the alignment argument. |
The alignment argument should be a power of two. If the argument is |
not a power of two, the nearest greater power is used. |
8-byte alignment is guaranteed by normal malloc calls, so don't |
bother calling memalign with an argument of 8 or less. |
Overreliance on memalign is a sure way to fragment space. |
*/ |
void* dlmemalign(size_t, size_t); |
/* |
valloc(size_t n); |
Equivalent to memalign(pagesize, n), where pagesize is the page |
size of the system. If the pagesize is unknown, 4096 is used. |
*/ |
void* dlvalloc(size_t); |
/* |
mallopt(int parameter_number, int parameter_value) |
Sets tunable parameters The format is to provide a |
(parameter-number, parameter-value) pair. mallopt then sets the |
corresponding parameter to the argument value if it can (i.e., so |
long as the value is meaningful), and returns 1 if successful else |
0. SVID/XPG/ANSI defines four standard param numbers for mallopt, |
normally defined in malloc.h. None of these are use in this malloc, |
so setting them has no effect. But this malloc also supports other |
options in mallopt: |
Symbol param # default allowed param values |
M_TRIM_THRESHOLD -1 2*1024*1024 any (-1U disables trimming) |
M_GRANULARITY -2 page size any power of 2 >= page size |
M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) |
*/ |
int dlmallopt(int, int); |
#define M_TRIM_THRESHOLD (-1) |
#define M_GRANULARITY (-2) |
#define M_MMAP_THRESHOLD (-3) |
/* |
malloc_footprint(); |
Returns the number of bytes obtained from the system. The total |
number of bytes allocated by malloc, realloc etc., is less than this |
value. Unlike mallinfo, this function returns only a precomputed |
result, so can be called frequently to monitor memory consumption. |
Even if locks are otherwise defined, this function does not use them, |
so results might not be up to date. |
*/ |
size_t dlmalloc_footprint(void); |
size_t dlmalloc_max_footprint(void); |
#if !NO_MALLINFO |
/* |
mallinfo() |
Returns (by copy) a struct containing various summary statistics: |
arena: current total non-mmapped bytes allocated from system |
ordblks: the number of free chunks |
smblks: always zero. |
hblks: current number of mmapped regions |
hblkhd: total bytes held in mmapped regions |
usmblks: the maximum total allocated space. This will be greater |
than current total if trimming has occurred. |
fsmblks: always zero |
uordblks: current total allocated space (normal or mmapped) |
fordblks: total free space |
keepcost: the maximum number of bytes that could ideally be released |
back to system via malloc_trim. ("ideally" means that |
it ignores page restrictions etc.) |
Because these fields are ints, but internal bookkeeping may |
be kept as longs, the reported values may wrap around zero and |
thus be inaccurate. |
*/ |
#ifndef HAVE_USR_INCLUDE_MALLOC_H |
#ifndef _MALLOC_H |
#ifndef MALLINFO_FIELD_TYPE |
#define MALLINFO_FIELD_TYPE size_t |
#endif /* MALLINFO_FIELD_TYPE */ |
struct mallinfo { |
MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ |
MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ |
MALLINFO_FIELD_TYPE smblks; /* always 0 */ |
MALLINFO_FIELD_TYPE hblks; /* always 0 */ |
MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ |
MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ |
MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ |
MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ |
MALLINFO_FIELD_TYPE fordblks; /* total free space */ |
MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ |
}; |
#endif /* _MALLOC_H */ |
#endif /* HAVE_USR_INCLUDE_MALLOC_H */ |
struct mallinfo dlmallinfo(void); |
#endif /* NO_MALLINFO */ |
/* |
independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); |
independent_calloc is similar to calloc, but instead of returning a |
single cleared space, it returns an array of pointers to n_elements |
independent elements that can hold contents of size elem_size, each |
of which starts out cleared, and can be independently freed, |
realloc'ed etc. The elements are guaranteed to be adjacently |
allocated (this is not guaranteed to occur with multiple callocs or |
mallocs), which may also improve cache locality in some |
applications. |
The "chunks" argument is optional (i.e., may be null, which is |
probably the most typical usage). If it is null, the returned array |
is itself dynamically allocated and should also be freed when it is |
no longer needed. Otherwise, the chunks array must be of at least |
n_elements in length. It is filled in with the pointers to the |
chunks. |
In either case, independent_calloc returns this pointer array, or |
null if the allocation failed. If n_elements is zero and "chunks" |
is null, it returns a chunk representing an array with zero elements |
(which should be freed if not wanted). |
Each element must be individually freed when it is no longer |
needed. If you'd like to instead be able to free all at once, you |
should instead use regular calloc and assign pointers into this |
space to represent elements. (In this case though, you cannot |
independently free elements.) |
independent_calloc simplifies and speeds up implementations of many |
kinds of pools. It may also be useful when constructing large data |
structures that initially have a fixed number of fixed-sized nodes, |
but the number is not known at compile time, and some of the nodes |
may later need to be freed. For example: |
struct Node { int item; struct Node* next; }; |
struct Node* build_list() { |
struct Node** pool; |
int n = read_number_of_nodes_needed(); |
if (n <= 0) return 0; |
pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); |
if (pool == 0) die(); |
// organize into a linked list... |
struct Node* first = pool[0]; |
for (i = 0; i < n-1; ++i) |
pool[i]->next = pool[i+1]; |
free(pool); // Can now free the array (or not, if it is needed later) |
return first; |
} |
*/ |
void** dlindependent_calloc(size_t, size_t, void**); |
/* |
independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); |
independent_comalloc allocates, all at once, a set of n_elements |
chunks with sizes indicated in the "sizes" array. It returns |
an array of pointers to these elements, each of which can be |
independently freed, realloc'ed etc. The elements are guaranteed to |
be adjacently allocated (this is not guaranteed to occur with |
multiple callocs or mallocs), which may also improve cache locality |
in some applications. |
The "chunks" argument is optional (i.e., may be null). If it is null |
the returned array is itself dynamically allocated and should also |
be freed when it is no longer needed. Otherwise, the chunks array |
must be of at least n_elements in length. It is filled in with the |
pointers to the chunks. |
In either case, independent_comalloc returns this pointer array, or |
null if the allocation failed. If n_elements is zero and chunks is |
null, it returns a chunk representing an array with zero elements |
(which should be freed if not wanted). |
Each element must be individually freed when it is no longer |
needed. If you'd like to instead be able to free all at once, you |
should instead use a single regular malloc, and assign pointers at |
particular offsets in the aggregate space. (In this case though, you |
cannot independently free elements.) |
independent_comallac differs from independent_calloc in that each |
element may have a different size, and also that it does not |
automatically clear elements. |
independent_comalloc can be used to speed up allocation in cases |
where several structs or objects must always be allocated at the |
same time. For example: |
struct Head { ... } |
struct Foot { ... } |
void send_message(char* msg) { |
int msglen = strlen(msg); |
size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; |
void* chunks[3]; |
if (independent_comalloc(3, sizes, chunks) == 0) |
die(); |
struct Head* head = (struct Head*)(chunks[0]); |
char* body = (char*)(chunks[1]); |
struct Foot* foot = (struct Foot*)(chunks[2]); |
// ... |
} |
In general though, independent_comalloc is worth using only for |
larger values of n_elements. For small values, you probably won't |
detect enough difference from series of malloc calls to bother. |
Overuse of independent_comalloc can increase overall memory usage, |
since it cannot reuse existing noncontiguous small chunks that |
might be available for some of the elements. |
*/ |
void** dlindependent_comalloc(size_t, size_t*, void**); |
/* |
pvalloc(size_t n); |
Equivalent to valloc(minimum-page-that-holds(n)), that is, |
round up n to nearest pagesize. |
*/ |
void* dlpvalloc(size_t); |
/* |
malloc_trim(size_t pad); |
If possible, gives memory back to the system (via negative arguments |
to sbrk) if there is unused memory at the `high' end of the malloc |
pool or in unused MMAP segments. You can call this after freeing |
large blocks of memory to potentially reduce the system-level memory |
requirements of a program. However, it cannot guarantee to reduce |
memory. Under some allocation patterns, some large free blocks of |
memory will be locked between two used chunks, so they cannot be |
given back to the system. |
The `pad' argument to malloc_trim represents the amount of free |
trailing space to leave untrimmed. If this argument is zero, only |
the minimum amount of memory to maintain internal data structures |
will be left. Non-zero arguments can be supplied to maintain enough |
trailing space to service future expected allocations without having |
to re-obtain memory from the system. |
Malloc_trim returns 1 if it actually released any memory, else 0. |
*/ |
int dlmalloc_trim(size_t); |
/* |
malloc_usable_size(void* p); |
Returns the number of bytes you can actually use in |
an allocated chunk, which may be more than you requested (although |
often not) due to alignment and minimum size constraints. |
You can use this many bytes without worrying about |
overwriting other allocated objects. This is not a particularly great |
programming practice. malloc_usable_size can be more useful in |
debugging and assertions, for example: |
p = malloc(n); |
assert(malloc_usable_size(p) >= 256); |
*/ |
size_t dlmalloc_usable_size(void*); |
/* |
malloc_stats(); |
Prints on stderr the amount of space obtained from the system (both |
via sbrk and mmap), the maximum amount (which may be more than |
current if malloc_trim and/or munmap got called), and the current |
number of bytes allocated via malloc (or realloc, etc) but not yet |
freed. Note that this is the number of bytes allocated, not the |
number requested. It will be larger than the number requested |
because of alignment and bookkeeping overhead. Because it includes |
alignment wastage as being in use, this figure may be greater than |
zero even when no user-level chunks are allocated. |
The reported current and maximum system memory can be inaccurate if |
a program makes other calls to system memory allocation functions |
(normally sbrk) outside of malloc. |
malloc_stats prints only the most commonly interesting statistics. |
More information can be obtained by calling mallinfo. |
*/ |
void dlmalloc_stats(void); |
#endif /* !ONLY_MSPACES */ |
#if MSPACES |
/* |
mspace is an opaque type representing an independent |
region of space that supports mspace_malloc, etc. |
*/ |
typedef void* mspace; |
/* |
create_mspace creates and returns a new independent space with the |
given initial capacity, or, if 0, the default granularity size. It |
returns null if there is no system memory available to create the |
space. If argument locked is non-zero, the space uses a separate |
lock to control access. The capacity of the space will grow |
dynamically as needed to service mspace_malloc requests. You can |
control the sizes of incremental increases of this space by |
compiling with a different DEFAULT_GRANULARITY or dynamically |
setting with mallopt(M_GRANULARITY, value). |
*/ |
mspace create_mspace(size_t capacity, int locked); |
/* |
destroy_mspace destroys the given space, and attempts to return all |
of its memory back to the system, returning the total number of |
bytes freed. After destruction, the results of access to all memory |
used by the space become undefined. |
*/ |
size_t destroy_mspace(mspace msp); |
/* |
create_mspace_with_base uses the memory supplied as the initial base |
of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this |
space is used for bookkeeping, so the capacity must be at least this |
large. (Otherwise 0 is returned.) When this initial space is |
exhausted, additional memory will be obtained from the system. |
Destroying this space will deallocate all additionally allocated |
space (if possible) but not the initial base. |
*/ |
mspace create_mspace_with_base(void* base, size_t capacity, int locked); |
/* |
mspace_malloc behaves as malloc, but operates within |
the given space. |
*/ |
void* mspace_malloc(mspace msp, size_t bytes); |
/* |
mspace_free behaves as free, but operates within |
the given space. |
If compiled with FOOTERS==1, mspace_free is not actually needed. |
free may be called instead of mspace_free because freed chunks from |
any space are handled by their originating spaces. |
*/ |
void mspace_free(mspace msp, void* mem); |
/* |
mspace_realloc behaves as realloc, but operates within |
the given space. |
If compiled with FOOTERS==1, mspace_realloc is not actually |
needed. realloc may be called instead of mspace_realloc because |
realloced chunks from any space are handled by their originating |
spaces. |
*/ |
void* mspace_realloc(mspace msp, void* mem, size_t newsize); |
/* |
mspace_calloc behaves as calloc, but operates within |
the given space. |
*/ |
void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); |
/* |
mspace_memalign behaves as memalign, but operates within |
the given space. |
*/ |
void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); |
/* |
mspace_independent_calloc behaves as independent_calloc, but |
operates within the given space. |
*/ |
void** mspace_independent_calloc(mspace msp, size_t n_elements, |
size_t elem_size, void* chunks[]); |
/* |
mspace_independent_comalloc behaves as independent_comalloc, but |
operates within the given space. |
*/ |
void** mspace_independent_comalloc(mspace msp, size_t n_elements, |
size_t sizes[], void* chunks[]); |
/* |
mspace_footprint() returns the number of bytes obtained from the |
system for this space. |
*/ |
size_t mspace_footprint(mspace msp); |
#if !NO_MALLINFO |
/* |
mspace_mallinfo behaves as mallinfo, but reports properties of |
the given space. |
*/ |
struct mallinfo mspace_mallinfo(mspace msp); |
#endif /* NO_MALLINFO */ |
/* |
mspace_malloc_stats behaves as malloc_stats, but reports |
properties of the given space. |
*/ |
void mspace_malloc_stats(mspace msp); |
/* |
mspace_trim behaves as malloc_trim, but |
operates within the given space. |
*/ |
int mspace_trim(mspace msp, size_t pad); |
/* |
An alias for mallopt. |
*/ |
int mspace_mallopt(int, int); |
#endif /* MSPACES */ |
#ifdef __cplusplus |
}; /* end of extern "C" */ |
#endif |
#endif /* MALLOC_280_H */ |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/stddef.h |
---|
0,0 → 1,47 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__STDDEF_H__ |
#define __LIBC__STDDEF_H__ |
#include <types.h> |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/psthread.h |
---|
0,0 → 1,101 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__PSTHREAD_H__ |
#define __LIBC__PSTHREAD_H__ |
#include <libarch/psthread.h> |
#include <libadt/list.h> |
#include <libarch/thread.h> |
#ifndef context_set |
#define context_set(c, _pc, stack, size, ptls) \ |
(c)->pc = (sysarg_t) (_pc); \ |
(c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ |
(c)->tls = (sysarg_t) (ptls); |
#endif /* context_set */ |
#define PSTHREAD_SERIALIZED 1 |
typedef enum { |
PS_TO_MANAGER, |
PS_FROM_MANAGER, |
PS_PREEMPT, |
PS_FROM_DEAD |
} pschange_type; |
typedef sysarg_t pstid_t; |
struct psthread_data { |
link_t link; |
context_t ctx; |
void *stack; |
void *arg; |
int (*func)(void *); |
tcb_t *tcb; |
struct psthread_data *waiter; |
int finished; |
int retval; |
int flags; |
}; |
typedef struct psthread_data psthread_data_t; |
extern int context_save(context_t *c); |
extern void context_restore(context_t *c) __attribute__ ((noreturn)); |
pstid_t psthread_create(int (*func)(void *), void *arg); |
int psthread_join(pstid_t psthrid); |
psthread_data_t * psthread_setup(void); |
void psthread_teardown(psthread_data_t *pt); |
int psthread_schedule_next_adv(pschange_type ctype); |
void psthread_add_ready(pstid_t ptid); |
void psthread_add_manager(pstid_t psthrid); |
void psthread_remove_manager(void); |
pstid_t psthread_get_id(void); |
void psthread_inc_sercount(void); |
void psthread_dec_sercount(void); |
static inline int psthread_schedule_next() { |
return psthread_schedule_next_adv(PS_PREEMPT); |
} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/async.h |
---|
0,0 → 1,137 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef _libc_ASYNC_H_ |
#define _libc_ASYNC_H_ |
#include <ipc/ipc.h> |
#include <psthread.h> |
#include <sys/time.h> |
#include <atomic.h> |
typedef ipc_callid_t aid_t; |
typedef void (*async_client_conn_t)(ipc_callid_t callid, ipc_call_t *call); |
static inline void async_manager(void) |
{ |
psthread_schedule_next_adv(PS_TO_MANAGER); |
} |
ipc_callid_t async_get_call_timeout(ipc_call_t *call, suseconds_t usecs); |
static inline ipc_callid_t async_get_call(ipc_call_t *data) |
{ |
return async_get_call_timeout(data, 0); |
} |
aid_t async_send_2(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2, |
ipc_call_t *dataptr); |
aid_t async_send_3(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2, |
ipcarg_t arg3, ipc_call_t *dataptr); |
void async_wait_for(aid_t amsgid, ipcarg_t *result); |
int async_wait_timeout(aid_t amsgid, ipcarg_t *retval, suseconds_t timeout); |
/** Pseudo-synchronous message sending |
* |
* Send message through IPC, wait in the event loop, until it is received |
* |
* @return Return code of message |
*/ |
static inline ipcarg_t async_req_2(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2, ipcarg_t *r1, ipcarg_t *r2) |
{ |
ipc_call_t result; |
ipcarg_t rc; |
aid_t eid = async_send_2(phoneid, method, arg1, arg2, &result); |
async_wait_for(eid, &rc); |
if (r1) |
*r1 = IPC_GET_ARG1(result); |
if (r2) |
*r2 = IPC_GET_ARG2(result); |
return rc; |
} |
#define async_req(phoneid, method, arg1, r1) async_req_2(phoneid, method, arg1, 0, r1, 0) |
static inline ipcarg_t async_req_3(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t *r1, |
ipcarg_t *r2, ipcarg_t *r3) |
{ |
ipc_call_t result; |
ipcarg_t rc; |
aid_t eid = async_send_3(phoneid, method, arg1, arg2, arg3, &result); |
async_wait_for(eid, &rc); |
if (r1) |
*r1 = IPC_GET_ARG1(result); |
if (r2) |
*r2 = IPC_GET_ARG2(result); |
if (r3) |
*r3 = IPC_GET_ARG3(result); |
return rc; |
} |
pstid_t async_new_connection(ipcarg_t in_phone_hash,ipc_callid_t callid, |
ipc_call_t *call, |
void (*cthread)(ipc_callid_t,ipc_call_t *)); |
void async_usleep(suseconds_t timeout); |
void async_create_manager(void); |
void async_destroy_manager(void); |
void async_set_client_connection(async_client_conn_t conn); |
void async_set_interrupt_received(async_client_conn_t conn); |
int _async_init(void); |
/* Primitve functions for IPC communication */ |
void async_msg_3(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2, |
ipcarg_t arg3); |
void async_msg_2(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2); |
#define async_msg(ph,m,a1) async_msg_2(ph,m,a1,0) |
static inline void async_serialize_start(void) |
{ |
psthread_inc_sercount(); |
} |
static inline void async_serialize_end(void) |
{ |
psthread_dec_sercount(); |
} |
extern atomic_t async_futex; |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/stdlib.h |
---|
0,0 → 1,65 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__STDLIB_H__ |
#define __LIBC__STDLIB_H__ |
#include <unistd.h> |
#include <malloc.h> |
#define abort() _exit(1) |
#define exit(status) _exit((status)) |
#define RAND_MAX 714025 |
extern long int random(void); |
extern void srandom(unsigned int seed); |
static inline int rand(void) |
{ |
return random(); |
} |
static inline void srand(unsigned int seed) |
{ |
srandom(seed); |
} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/stdio.h |
---|
0,0 → 1,66 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__STDIO_H__ |
#define __LIBC__STDIO_H__ |
#include <types.h> |
#include <stdarg.h> |
#define EOF (-1) |
#include <io/stream.h> |
extern int getchar(void); |
extern int puts(const char * str); |
extern int putchar(int c); |
extern int printf(const char *fmt, ...); |
extern int sprintf(char *str, const char *fmt, ...); |
extern int snprintf(char *str, size_t size, const char *fmt, ...); |
extern int vprintf(const char *fmt, va_list ap); |
extern int vsprintf(char *str, const char *fmt, va_list ap); |
extern int vsnprintf(char *str, size_t size, const char *fmt, va_list ap); |
#define fprintf(f, fmt, ...) printf(fmt, ##__VA_ARGS__) |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/err.h |
---|
0,0 → 1,46 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef _libc__ERR_H_ |
#define _libc__ERR_H_ |
#define errx(status,fmt,...) { printf((fmt),##__VA_ARGS__);_exit(status);} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/sysinfo.h |
---|
0,0 → 1,52 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC_SYSINFO_H__ |
#define __LIBC_SYSINFO_H__ |
#include <libc.h> |
#include <sysinfo.h> |
#include <string.h> |
sysarg_t sysinfo_value(char *name); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/time.h |
---|
0,0 → 1,44 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __libc_TIME_H__ |
#define __libc_TIME_H__ |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/assert.h |
---|
0,0 → 1,62 |
/* |
* Copyright (C) 2005 Martin Decky |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__ASSERT_H__ |
#define __LIBC__ASSERT_H__ |
/** Debugging assert macro |
* |
* If NDEBUG is not set, the assert() macro |
* evaluates expr and if it is false prints |
* error message and terminate program. |
* |
* @param expr Expression which is expected to be true. |
* |
*/ |
#include <stdlib.h> |
#ifndef NDEBUG |
# define assert(expr) if (!(expr)) { printf("Assertion failed (%s) at file '%s', line %d.\n", #expr, __FILE__, __LINE__); abort();} |
#else |
# define assert(expr) |
#endif |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/task.h |
---|
0,0 → 1,50 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__TASK_H__ |
#define __LIBC__TASK_H__ |
#include <types.h> |
typedef uint64_t task_id_t; |
extern task_id_t task_get_id(void); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/cap.h |
---|
0,0 → 1,49 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __CAP_H__ |
#define __CAP_H__ |
#include <task.h> |
extern int cap_grant(task_id_t id, unsigned int caps); |
extern int cap_revoke(task_id_t id, unsigned int caps); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/unistd.h |
---|
0,0 → 1,56 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__UNISTD_H__ |
#define __LIBC__UNISTD_H__ |
#include <types.h> |
#include <arch/mm/page.h> |
#define NULL 0 |
#define getpagesize() (PAGE_SIZE) |
extern ssize_t write(int fd, const void * buf, size_t count); |
extern ssize_t read(int fd, void * buf, size_t count); |
extern void _exit(int status); |
void *sbrk(ssize_t incr); |
void usleep(unsigned long usec); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/thread.h |
---|
0,0 → 1,58 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__THREAD_H__ |
#define __LIBC__THREAD_H__ |
#include <kernel/proc/uarg.h> |
#include <libarch/thread.h> |
#include <types.h> |
extern void __thread_entry(void); |
extern void __thread_main(uspace_arg_t *uarg); |
extern int thread_create(void (* function)(void *arg), void *arg, char *name); |
extern void thread_exit(int status); |
extern tcb_t * __make_tls(void); |
extern tcb_t * __alloc_tls(void **data, size_t size); |
extern void __free_tls(tcb_t *); |
extern void __free_tls_arch(tcb_t *, size_t size); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/libadt/hash_table.h |
---|
0,0 → 1,92 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __HASH_TABLE_H__ |
#define __HASH_TABLE_H__ |
#include <libadt/list.h> |
#include <unistd.h> |
typedef unsigned long hash_count_t; |
typedef unsigned long hash_index_t; |
typedef struct hash_table hash_table_t; |
typedef struct hash_table_operations hash_table_operations_t; |
/** Hash table structure. */ |
struct hash_table { |
link_t *entry; |
hash_count_t entries; |
hash_count_t max_keys; |
hash_table_operations_t *op; |
}; |
/** Set of operations for hash table. */ |
struct hash_table_operations { |
/** Hash function. |
* |
* @param key Array of keys needed to compute hash index. All keys must be passed. |
* |
* @return Index into hash table. |
*/ |
hash_index_t (* hash)(unsigned long key[]); |
/** Hash table item comparison function. |
* |
* @param key Array of keys that will be compared with item. It is not necessary to pass all keys. |
* |
* @return true if the keys match, false otherwise. |
*/ |
int (*compare)(unsigned long key[], hash_count_t keys, link_t *item); |
/** Hash table item removal callback. |
* |
* @param item Item that was removed from the hash table. |
*/ |
void (*remove_callback)(link_t *item); |
}; |
#define hash_table_get_instance(item, type, member) list_get_instance((item), type, member) |
extern int hash_table_create(hash_table_t *h, hash_count_t m, hash_count_t max_keys, hash_table_operations_t *op); |
extern void hash_table_insert(hash_table_t *h, unsigned long key[], link_t *item); |
extern link_t *hash_table_find(hash_table_t *h, unsigned long key[]); |
extern void hash_table_remove(hash_table_t *h, unsigned long key[], hash_count_t keys); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/libadt/list.h |
---|
0,0 → 1,197 |
/* |
* Copyright (C) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIST_H__ |
#define __LIST_H__ |
#include<unistd.h> |
#ifndef true |
# define true 1 |
#endif |
#ifndef false |
# define false 0 |
#endif |
typedef struct link link_t; |
/** Doubly linked list head and link type. */ |
struct link { |
link_t *prev; /**< Pointer to the previous item in the list. */ |
link_t *next; /**< Pointer to the next item in the list. */ |
}; |
/** Declare and initialize statically allocated list. |
* |
* @param name Name of the new statically allocated list. |
*/ |
#define LIST_INITIALIZE(name) link_t name = { .prev = &name, .next = &name } |
/** Initialize doubly-linked circular list link |
* |
* Initialize doubly-linked list link. |
* |
* @param link Pointer to link_t structure to be initialized. |
*/ |
static inline void link_initialize(link_t *link) |
{ |
link->prev = NULL; |
link->next = NULL; |
} |
/** Initialize doubly-linked circular list |
* |
* Initialize doubly-linked circular list. |
* |
* @param head Pointer to link_t structure representing head of the list. |
*/ |
static inline void list_initialize(link_t *head) |
{ |
head->prev = head; |
head->next = head; |
} |
/** Add item to the beginning of doubly-linked circular list |
* |
* Add item to the beginning of doubly-linked circular list. |
* |
* @param link Pointer to link_t structure to be added. |
* @param head Pointer to link_t structure representing head of the list. |
*/ |
static inline void list_prepend(link_t *link, link_t *head) |
{ |
link->next = head->next; |
link->prev = head; |
head->next->prev = link; |
head->next = link; |
} |
/** Add item to the end of doubly-linked circular list |
* |
* Add item to the end of doubly-linked circular list. |
* |
* @param link Pointer to link_t structure to be added. |
* @param head Pointer to link_t structure representing head of the list. |
*/ |
static inline void list_append(link_t *link, link_t *head) |
{ |
link->prev = head->prev; |
link->next = head; |
head->prev->next = link; |
head->prev = link; |
} |
/** Remove item from doubly-linked circular list |
* |
* Remove item from doubly-linked circular list. |
* |
* @param link Pointer to link_t structure to be removed from the list it is contained in. |
*/ |
static inline void list_remove(link_t *link) |
{ |
link->next->prev = link->prev; |
link->prev->next = link->next; |
link_initialize(link); |
} |
/** Query emptiness of doubly-linked circular list |
* |
* Query emptiness of doubly-linked circular list. |
* |
* @param head Pointer to link_t structure representing head of the list. |
*/ |
static inline int list_empty(link_t *head) |
{ |
return head->next == head ? true : false; |
} |
/** Split or concatenate headless doubly-linked circular list |
* |
* Split or concatenate headless doubly-linked circular list. |
* |
* Note that the algorithm works both directions: |
* concatenates splitted lists and splits concatenated lists. |
* |
* @param part1 Pointer to link_t structure leading the first (half of the headless) list. |
* @param part2 Pointer to link_t structure leading the second (half of the headless) list. |
*/ |
static inline void headless_list_split_or_concat(link_t *part1, link_t *part2) |
{ |
link_t *hlp; |
part1->prev->next = part2; |
part2->prev->next = part1; |
hlp = part1->prev; |
part1->prev = part2->prev; |
part2->prev = hlp; |
} |
/** Split headless doubly-linked circular list |
* |
* Split headless doubly-linked circular list. |
* |
* @param part1 Pointer to link_t structure leading the first half of the headless list. |
* @param part2 Pointer to link_t structure leading the second half of the headless list. |
*/ |
static inline void headless_list_split(link_t *part1, link_t *part2) |
{ |
headless_list_split_or_concat(part1, part2); |
} |
/** Concatenate two headless doubly-linked circular lists |
* |
* Concatenate two headless doubly-linked circular lists. |
* |
* @param part1 Pointer to link_t structure leading the first headless list. |
* @param part2 Pointer to link_t structure leading the second headless list. |
*/ |
static inline void headless_list_concat(link_t *part1, link_t *part2) |
{ |
headless_list_split_or_concat(part1, part2); |
} |
#define list_get_instance(link,type,member) (type *)(((char *)(link))-((char *)&(((type *)NULL)->member))) |
extern int list_member(const link_t *link, const link_t *head); |
extern void list_concat(link_t *head1, link_t *head2); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/libadt/fifo.h |
---|
0,0 → 1,130 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
/* |
* This implementation of FIFO stores values in an array |
* (static or dynamic). As such, these FIFOs have upper bound |
* on number of values they can store. Push and pop operations |
* are done via accessing the array through head and tail indices. |
* Because of better operation ordering in fifo_pop(), the access |
* policy for these two indices is to 'increment (mod size of FIFO) |
* and use'. |
*/ |
#ifndef __FIFO_H__ |
#define __FIFO_H__ |
#include <malloc.h> |
typedef unsigned long fifo_count_t; |
typedef unsigned long fifo_index_t; |
#define FIFO_CREATE_STATIC(name, t, itms) \ |
struct { \ |
t fifo[(itms)]; \ |
fifo_count_t items; \ |
fifo_index_t head; \ |
fifo_index_t tail; \ |
} name |
/** Create and initialize static FIFO. |
* |
* FIFO is allocated statically. |
* This macro is suitable for creating smaller FIFOs. |
* |
* @param name Name of FIFO. |
* @param t Type of values stored in FIFO. |
* @param itms Number of items that can be stored in FIFO. |
*/ |
#define FIFO_INITIALIZE_STATIC(name, t, itms) \ |
FIFO_CREATE_STATIC(name, t, itms) = { \ |
.items = (itms), \ |
.head = 0, \ |
.tail = 0 \ |
} |
/** Create and prepare dynamic FIFO. |
* |
* FIFO is allocated dynamically. |
* This macro is suitable for creating larger FIFOs. |
* |
* @param name Name of FIFO. |
* @param t Type of values stored in FIFO. |
* @param itms Number of items that can be stored in FIFO. |
*/ |
#define FIFO_INITIALIZE_DYNAMIC(name, t, itms) \ |
struct { \ |
t *fifo; \ |
fifo_count_t items; \ |
fifo_index_t head; \ |
fifo_index_t tail; \ |
} name = { \ |
.fifo = NULL, \ |
.items = (itms), \ |
.head = 0, \ |
.tail = 0 \ |
} |
/** Pop value from head of FIFO. |
* |
* @param name FIFO name. |
* |
* @return Leading value in FIFO. |
*/ |
#define fifo_pop(name) \ |
name.fifo[name.head = (name.head + 1) < name.items ? (name.head + 1) : 0] |
/** Push value to tail of FIFO. |
* |
* @param name FIFO name. |
* @param value Value to be appended to FIFO. |
* |
*/ |
#define fifo_push(name, value) \ |
name.fifo[name.tail = (name.tail + 1) < name.items ? (name.tail + 1) : 0] = (value) |
/** Allocate memory for dynamic FIFO. |
* |
* @param name FIFO name. |
*/ |
#define fifo_create(name) \ |
name.fifo = malloc(sizeof(*name.fifo) * name.items) |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/libc.h |
---|
0,0 → 1,60 |
/* |
* Copyright (C) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__LIBC_H__ |
#define __LIBC__LIBC_H__ |
#include <types.h> |
#include <kernel/syscall/syscall.h> |
#define __SYSCALL0(id) __syscall(0, 0, 0, 0, id) |
#define __SYSCALL1(id, p1) __syscall(p1, 0, 0, 0, id) |
#define __SYSCALL2(id, p1, p2) __syscall(p1, p2, 0, 0, id) |
#define __SYSCALL3(id, p1, p2, p3) __syscall(p1,p2,p3, 0, id) |
#define __SYSCALL4(id, p1, p2, p3, p4) __syscall(p1,p2,p3,p4,id) |
extern void __main(void); |
extern void __exit(void); |
extern sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, |
const sysarg_t p3, const sysarg_t p4, |
const syscall_t id); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/atomic.h |
---|
0,0 → 1,60 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ATOMIC_H__ |
#define __ATOMIC_H__ |
typedef struct atomic { |
volatile long count; |
} atomic_t; |
#include <libarch/atomic.h> |
static inline void atomic_set(atomic_t *val, long i) |
{ |
val->count = i; |
} |
static inline long atomic_get(atomic_t *val) |
{ |
return val->count; |
} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/io/printf_core.h |
---|
0,0 → 1,58 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__PRINTF_CORE_H__ |
#define __LIBC__PRINTF_CORE_H__ |
#include <libarch/types.h> |
#include <stdarg.h> |
/** Structure for specifying output methods for different printf clones. */ |
struct printf_spec { |
/* Output function, returns count of printed characters or EOF */ |
int (*write)(void *, size_t, void *); |
/* Support data - output stream specification, its state, locks,... */ |
void *data; |
}; |
int printf_core(const char *fmt, struct printf_spec *ps ,va_list ap); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/io/stream.h |
---|
0,0 → 1,57 |
/* |
* Copyright (C) 2006 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __libc_STREAM_H_ |
#define __libc_STREAM_H_ |
#include <libarch/types.h> |
#define EMFILE -17 |
typedef int fd_t; |
typedef ssize_t (*pwritefn_t)(void *, const void *, size_t); |
typedef ssize_t (*preadfn_t)(void *, void *, size_t); |
fd_t open(const char *fname, int flags); |
int get_fd_phone(int fd); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/io/io.h |
---|
0,0 → 1,51 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__IO_H__ |
#define __LIBC__IO_H__ |
#include <libarch/types.h> |
int putnchars(const char * buf, size_t count); |
int putstr(const char * str); |
int putchar(int c); |
int getchar(void); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/stdarg.h |
---|
0,0 → 1,59 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__STDARG_H__ |
#define __LIBC__STDARG_H__ |
#include <types.h> |
#include <libarch/stackarg.h> |
#ifndef __VARARGS_DEFINED |
# define __VARARGS_DEFINED |
typedef __builtin_va_list va_list; |
# define va_start(ap, last) __builtin_va_start(ap, last) |
# define va_arg(ap, type) __builtin_va_arg(ap, type) |
# define va_end(ap) __builtin_va_end(ap) |
# endif |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/ctype.h |
---|
0,0 → 1,66 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __CTYPE_H__ |
#define __CTYPE_H__ |
static inline int isdigit(int c) |
{ |
return ((c >= '0' )&&( c <= '9')); |
} |
static inline int isspace(int c) |
{ |
switch(c) { |
case ' ': |
case '\n': |
case '\t': |
case '\f': |
case '\r': |
case '\v': |
return 1; |
break; |
default: |
return 0; |
} |
} |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/errno.h |
---|
0,0 → 1,48 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__ERRNO_H__ |
#define __LIBC__ERRNO_H__ |
#include <kernel/errno.h> |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/ipc/ipc.h |
---|
0,0 → 1,96 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcipc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBIPC_IPC_H__ |
#define __LIBIPC_IPC_H__ |
#include <kernel/ipc/ipc.h> |
#include <kernel/ipc/irq.h> |
#include <libc.h> |
#include <types.h> |
#include <kernel/synch/synch.h> |
typedef sysarg_t ipcarg_t; |
typedef struct { |
ipcarg_t args[IPC_CALL_LEN]; |
ipcarg_t in_phone_hash; |
} ipc_call_t ; |
typedef sysarg_t ipc_callid_t; |
typedef void (* ipc_async_callback_t)(void *private, int retval, |
ipc_call_t *data); |
#define ipc_call_sync_2(phoneid, method, arg1, arg2, res1, res2) ipc_call_sync_3((phoneid), (method), (arg1), (arg2), 0, (res1), (res2), 0) |
extern int ipc_call_sync_3(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, |
ipcarg_t *result1, ipcarg_t *result2, |
ipcarg_t *result3); |
extern int ipc_call_sync(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t *result); |
extern ipc_callid_t ipc_wait_cycle(ipc_call_t *call, uint32_t usec, int flags); |
extern ipc_callid_t ipc_wait_for_call_timeout(ipc_call_t *data, uint32_t usec); |
static inline ipc_callid_t ipc_wait_for_call(ipc_call_t *data) |
{ |
return ipc_wait_for_call_timeout(data, SYNCH_NO_TIMEOUT); |
} |
extern ipc_callid_t ipc_trywait_for_call(ipc_call_t *data); |
extern ipcarg_t ipc_answer_fast(ipc_callid_t callid, ipcarg_t retval, ipcarg_t arg1, |
ipcarg_t arg2); |
extern ipcarg_t ipc_answer(ipc_callid_t callid, ipc_call_t *call); |
#define ipc_call_async(phoneid,method,arg1,private, callback,can_preempt) (ipc_call_async_2(phoneid, method, arg1, 0, private, callback, can_preempt)) |
extern void ipc_call_async_2(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, void *private, |
ipc_async_callback_t callback, int can_preempt); |
extern void ipc_call_async_3(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, void *private, |
ipc_async_callback_t callback, int can_preempt); |
extern int ipc_connect_to_me(int phoneid, int arg1, int arg2, ipcarg_t *phone); |
extern int ipc_connect_me_to(int phoneid, int arg1, int arg2); |
extern int ipc_hangup(int phoneid); |
extern int ipc_register_irq(int irq, irq_code_t *code); |
extern int ipc_unregister_irq(int irq); |
extern int ipc_forward_fast(ipc_callid_t callid, int phoneid, int method, ipcarg_t arg1); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/ipc/ns.h |
---|
0,0 → 1,44 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcipc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBIPC__NS_H__ |
#define __LIBIPC__NS_H__ |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/ipc/services.h |
---|
0,0 → 1,55 |
/* |
* Copyright (C) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcipc |
* @{ |
*/ |
/** |
* @file services.h |
* @brief List of all known services and their codes. |
*/ |
#ifndef __LIBIPC__SERVICES_H__ |
#define __LIBIPC__SERVICES_H__ |
#define SERVICE_PCI 1 |
#define SERVICE_KEYBOARD 2 |
#define SERVICE_VIDEO 3 |
#define SERVICE_CONSOLE 4 |
/* Memory area to be received from NS */ |
#define SERVICE_MEM_REALTIME 1 |
#define SERVICE_MEM_KLOG 2 |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/ipc/fb.h |
---|
0,0 → 1,79 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libcipc |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/types.h> |
#include <types.h> |
#ifndef __libc__FB_H__ |
#define __libc__FB_H__ |
#define FB_PUTCHAR 1025 |
#define FB_CLEAR 1026 |
#define FB_GET_CSIZE 1027 |
#define FB_CURSOR_VISIBILITY 1028 |
#define FB_CURSOR_GOTO 1029 |
#define FB_SCROLL 1030 |
#define FB_VIEWPORT_SWITCH 1031 |
#define FB_VIEWPORT_CREATE 1032 |
#define FB_VIEWPORT_DELETE 1033 |
#define FB_SET_STYLE 1034 |
#define FB_GET_RESOLUTION 1035 |
#define FB_DRAW_TEXT_DATA 1036 |
#define FB_FLUSH 1037 |
#define FB_DRAW_PPM 1038 |
#define FB_PREPARE_SHM 1039 |
#define FB_DROP_SHM 1040 |
#define FB_SHM2PIXMAP 1041 |
#define FB_VP_DRAW_PIXMAP 1042 |
#define FB_VP2PIXMAP 1043 |
#define FB_DROP_PIXMAP 1044 |
#define FB_TRANS_PUTCHAR 1045 |
#define FB_ANIM_CREATE 1046 |
#define FB_ANIM_DROP 1047 |
#define FB_ANIM_ADDPIXMAP 1048 |
#define FB_ANIM_CHGVP 1049 |
#define FB_ANIM_START 1050 |
#define FB_ANIM_STOP 1051 |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/sys/time.h |
---|
0,0 → 1,63 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __libc_sys_TIME_H__ |
#define __libc_sys_TIME_H__ |
#include <types.h> |
#define DST_NONE 0 |
typedef long time_t; |
typedef long suseconds_t; |
struct timeval { |
time_t tv_sec; /* seconds */ |
suseconds_t tv_usec; /* microseconds */ |
}; |
struct timezone { |
int tz_minuteswest; /* minutes W of Greenwich */ |
int tz_dsttime; /* type of dst correction */ |
}; |
int gettimeofday(struct timeval *tv, struct timezone *tz); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/sys/types.h |
---|
0,0 → 1,47 |
/* |
* Copyright (C) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __LIBC__SYS_TYPES_H__ |
#define __LIBC__SYS_TYPES_H__ |
#include <types.h> |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/include/sys/mman.h |
---|
0,0 → 1,61 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __libc_MMAN_H_ |
#define __libc_MMAN_H_ |
#include <as.h> |
#define MAP_FAILED ((void *) -1) |
#define MAP_SHARED (1 << 0) |
#define MAP_PRIVATE (1 << 1) |
#define MAP_FIXED (1 << 2) |
#define MAP_ANONYMOUS (1 << 3) |
#define PROTO_READ AS_AREA_READ |
#define PROTO_WRITE AS_AREA_WRITE |
#define PROTO_EXEC AS_AREA_EXEC |
extern void *mmap(void *start, size_t length, int prot, int flags, int fd, |
off_t offset); |
extern int munmap(void *start, size_t length); |
#endif |
/** @} |
*/ |
/tags/0.2.0/uspace/libc/Makefile |
---|
0,0 → 1,115 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Common compiler flags |
# |
LIBC_PREFIX = . |
SOFTINT_PREFIX = ../softint |
CONSOLE_PREFIX = ../console |
## Setup toolchain |
# |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I$(CONSOLE_PREFIX) |
## Sources |
# |
GENERIC_SOURCES = \ |
generic/libc.c \ |
generic/ddi.c \ |
generic/as.c \ |
generic/cap.c \ |
generic/string.c \ |
generic/thread.c \ |
generic/task.c \ |
generic/futex.c \ |
generic/io/io.c \ |
generic/io/printf.c \ |
generic/io/stream.c \ |
generic/io/sprintf.c \ |
generic/io/snprintf.c \ |
generic/io/vprintf.c \ |
generic/io/vsprintf.c \ |
generic/io/vsnprintf.c \ |
generic/io/printf_core.c \ |
malloc/malloc.c \ |
generic/psthread.c \ |
generic/sysinfo.c \ |
generic/ipc.c \ |
generic/async.c \ |
generic/libadt/list.o \ |
generic/libadt/hash_table.o \ |
generic/time.c \ |
generic/err.c \ |
generic/stdlib.c \ |
generic/mmap.c |
ARCH_SOURCES += \ |
arch/$(ARCH)/src/entry.s \ |
arch/$(ARCH)/src/thread_entry.s |
GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES))) |
ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES))) |
.PHONY: all clean depend kerninc |
all: kerninc libc.a arch/$(ARCH)/_link.ld |
kerninc: |
ln -sfn ../../../kernel/generic/include include/kernel |
ln -sfn kernel/arch include/arch |
ln -sfn ../arch/$(ARCH)/include include/libarch |
-include Makefile.depend |
clean: |
-rm -f include/kernel include/arch include/libarch libc.a arch/$(ARCH)/_link.ld Makefile.depend |
find generic/ arch/$(ARCH)/ -name '*.o' -follow -exec rm \{\} \; |
depend: kerninc |
-makedepend $(DEFS) $(CFLAGS) -f - $(ARCH_SOURCES) $(GENERIC_SOURCES) > Makefile.depend 2> /dev/null |
libc.a: depend $(ARCH_OBJECTS) $(GENERIC_OBJECTS) |
$(AR) rc libc.a $(LIBS) $(ARCH_OBJECTS) $(GENERIC_OBJECTS) |
arch/$(ARCH)/_link.ld: arch/$(ARCH)/_link.ld.in |
$(CC) $(DEFS) $(CFLAGS) -E -x c $< | grep -v "^\#" > $@ |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.2.0/uspace/libc/Makefile.toolchain |
---|
0,0 → 1,57 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
DEFS = -DARCH=$(ARCH) |
CFLAGS = -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -O3 -nostdlib -nostdinc -I$(LIBC_PREFIX)/include |
LFLAGS = -M -N $(SOFTINT_PREFIX)/softint.a |
AFLAGS = |
#-Werror |
## Setup platform configuration |
# |
include $(LIBC_PREFIX)/arch/$(ARCH)/Makefile.inc |
## Toolchain configuration |
# |
ifeq ($(COMPILER),native) |
CC = gcc |
AS = as |
LD = ld |
AR = ar |
OBJCOPY = objcopy |
OBJDUMP = objdump |
else |
CC = $(TOOLCHAIN_DIR)/$(TARGET)-gcc |
AS = $(TOOLCHAIN_DIR)/$(TARGET)-as |
LD = $(TOOLCHAIN_DIR)/$(TARGET)-ld |
AR = $(TOOLCHAIN_DIR)/$(TARGET)-ar |
OBJCOPY = $(TOOLCHAIN_DIR)/$(TARGET)-objcopy |
OBJDUMP = $(TOOLCHAIN_DIR)/$(TARGET)-objdump |
endif |
/tags/0.2.0/uspace/tetris/scores.c |
---|
0,0 → 1,543 |
/* $OpenBSD: scores.c,v 1.11 2006/04/20 03:25:36 ray Exp $ */ |
/* $NetBSD: scores.c,v 1.2 1995/04/22 07:42:38 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* 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. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. |
* |
* @(#)scores.c 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Score code for Tetris, by Darren Provine (kilroy@gboro.glassboro.edu) |
* modified 22 January 1992, to limit the number of entries any one |
* person has. |
* |
* Major whacks since then. |
*/ |
#include <errno.h> |
/* #include <err.h> */ |
/* #include <fcntl.h> */ |
/* #include <pwd.h> */ |
#include <stdio.h> |
/* #include <stdlib.h> */ |
#include <string.h> |
/* #include <time.h> */ |
/* #include <term.h> */ |
/* #include <unistd.h> */ |
/* #include <sys/param.h> */ |
/* #include <sys/stat.h> */ |
/* #include <sys/types.h> */ |
#include "pathnames.h" |
#include "screen.h" |
#include "tetris.h" |
#include "scores.h" |
/* |
* Within this code, we can hang onto one extra "high score", leaving |
* room for our current score (whether or not it is high). |
* |
* We also sometimes keep tabs on the "highest" score on each level. |
* As long as the scores are kept sorted, this is simply the first one at |
* that level. |
*/ |
#define NUMSPOTS (MAXHISCORES + 1) |
#define NLEVELS (MAXLEVEL + 1) |
/* static time_t now; */ |
/* static int nscores; */ |
/* static int gotscores; */ |
/* static struct highscore scores[NUMSPOTS]; */ |
static struct highscore scores[NUMSPOTS]; |
/* static int checkscores(struct highscore *, int); */ |
/* static int cmpscores(const void *, const void *); */ |
/* static void getscores(FILE **); */ |
/* static void printem(int, int, struct highscore *, int, const char *); */ |
/* static char *thisuser(void); */ |
void showscores(int firstgame) |
{ |
int i; |
clear_screen(); |
moveto(10, 0); |
printf("\tRank \tLevel \tName\t points\n"); |
printf("\t========================================================\n"); |
for (i = 0; i < NUMSPOTS - 1; i++) { |
printf("\t%6d %6d %-16s %20d\n", i+1, scores[i].hs_level, scores[i].hs_name, scores[i].hs_score); |
} |
if (!firstgame) { |
printf("\t========================================================\n"); |
printf("\t Last %6d %-16s %20d\n", scores[NUMSPOTS - 1].hs_level, scores[NUMSPOTS - 1].hs_name, scores[NUMSPOTS - 1].hs_score); |
} |
printf("\n\n\n\n\tPress any key to return to main menu."); |
getchar(); |
} |
/** Copy from hiscore table score with index src to dest |
* |
*/ |
static void copyhiscore(int dest, int src) |
{ |
strcpy(scores[dest].hs_name, scores[src].hs_name); |
scores[dest].hs_score = scores[src].hs_score; |
scores[dest].hs_level = scores[src].hs_level; |
} |
void insertscore(int score, int level) |
{ |
int i,j; |
int key; |
clear_screen(); |
moveto(10 , 10); |
puts("Insert your name: "); |
strncpy(scores[NUMSPOTS - 1].hs_name, "Player", MAXLOGNAME); |
i = 6; |
moveto(10 , 28); |
printf("%s%.*s",scores[NUMSPOTS - 1].hs_name,MAXLOGNAME-i,"........................................"); |
key = getchar(); |
while(key != '\n') { |
if (key == '\b') { |
if (i > 0) |
scores[NUMSPOTS - 1].hs_name[--i] = '\0'; |
} else { |
if (i < (MAXLOGNAME - 1)) |
scores[NUMSPOTS - 1].hs_name[i++] = key; |
scores[NUMSPOTS - 1].hs_name[i] = '\0'; |
} |
moveto(10 , 28); |
printf("%s%.*s",scores[NUMSPOTS - 1].hs_name,MAXLOGNAME-i,"........................................"); |
key = getchar(); |
} |
scores[NUMSPOTS - 1].hs_score = score; |
scores[NUMSPOTS - 1].hs_level = level; |
i = NUMSPOTS-1; |
while ((i > 0) && (scores[i - 1].hs_score < score)) |
i--; |
for (j = NUMSPOTS - 2; j > i; j--) { |
copyhiscore(j,j-1); |
} |
copyhiscore(i, NUMSPOTS - 1); |
} |
void initscores(void) |
{ |
int i; |
for(i = 0; i < NUMSPOTS; i++) { |
strncpy(scores[i].hs_name, "HelenOS Team", MAXLOGNAME); |
scores[i].hs_score = (NUMSPOTS - i) * 200; |
scores[i].hs_level = (i + 1 > MAXLEVEL?MAXLEVEL:i + 1); |
} |
} |
/* |
* Read the score file. Can be called from savescore (before showscores) |
* or showscores (if savescore will not be called). If the given pointer |
* is not NULL, sets *fpp to an open file pointer that corresponds to a |
* read/write score file that is locked with LOCK_EX. Otherwise, the |
* file is locked with LOCK_SH for the read and closed before return. |
* |
* Note, we assume closing the stdio file releases the lock. |
*/ |
/* static void */ |
/* getscores(FILE **fpp) */ |
/* { */ |
/* int sd, mint, lck, mask, i; */ |
/* char *mstr, *human; */ |
/* FILE *sf; */ |
/* if (fpp != NULL) { */ |
/* mint = O_RDWR | O_CREAT; */ |
/* mstr = "r+"; */ |
/* human = "read/write"; */ |
/* lck = LOCK_EX; */ |
/* } else { */ |
/* mint = O_RDONLY; */ |
/* mstr = "r"; */ |
/* human = "reading"; */ |
/* lck = LOCK_SH; */ |
/* } */ |
/* setegid(egid); */ |
/* mask = umask(S_IWOTH); */ |
/* sd = open(_PATH_SCOREFILE, mint, 0666); */ |
/* (void)umask(mask); */ |
/* setegid(gid); */ |
/* if (sd < 0) { */ |
/* if (fpp == NULL) { */ |
/* nscores = 0; */ |
/* return; */ |
/* } */ |
/* err(1, "cannot open %s for %s", _PATH_SCOREFILE, human); */ |
/* } */ |
/* setegid(egid); */ |
/* if ((sf = fdopen(sd, mstr)) == NULL) */ |
/* err(1, "cannot fdopen %s for %s", _PATH_SCOREFILE, human); */ |
/* setegid(gid); */ |
/* /\* */ |
/* * Grab a lock. */ |
/* *\/ */ |
/* if (flock(sd, lck)) */ |
/* warn("warning: score file %s cannot be locked", */ |
/* _PATH_SCOREFILE); */ |
/* nscores = fread(scores, sizeof(scores[0]), MAXHISCORES, sf); */ |
/* if (ferror(sf)) */ |
/* err(1, "error reading %s", _PATH_SCOREFILE); */ |
/* for (i = 0; i < nscores; i++) */ |
/* if (scores[i].hs_level < MINLEVEL || */ |
/* scores[i].hs_level > MAXLEVEL) */ |
/* errx(1, "scorefile %s corrupt", _PATH_SCOREFILE); */ |
/* if (fpp) */ |
/* *fpp = sf; */ |
/* else */ |
/* (void)fclose(sf); */ |
/* } */ |
void |
savescore(int level) |
{ |
return; |
} |
/* struct highscore *sp; */ |
/* int i; */ |
/* int change; */ |
/* FILE *sf; */ |
/* const char *me; */ |
/* getscores(&sf); */ |
/* gotscores = 1; */ |
/* (void)time(&now); */ |
/* /\* */ |
/* * Allow at most one score per person per level -- see if we */ |
/* * can replace an existing score, or (easiest) do nothing. */ |
/* * Otherwise add new score at end (there is always room). */ |
/* *\/ */ |
/* change = 0; */ |
/* me = thisuser(); */ |
/* for (i = 0, sp = &scores[0]; i < nscores; i++, sp++) { */ |
/* if (sp->hs_level != level || strcmp(sp->hs_name, me) != 0) */ |
/* continue; */ |
/* if (score > sp->hs_score) { */ |
/* (void)printf("%s bettered %s %d score of %d!\n", */ |
/* "\nYou", "your old level", level, */ |
/* sp->hs_score * sp->hs_level); */ |
/* sp->hs_score = score; /\* new score *\/ */ |
/* sp->hs_time = now; /\* and time *\/ */ |
/* change = 1; */ |
/* } else if (score == sp->hs_score) { */ |
/* (void)printf("%s tied %s %d high score.\n", */ |
/* "\nYou", "your old level", level); */ |
/* sp->hs_time = now; /\* renew it *\/ */ |
/* change = 1; /\* gotta rewrite, sigh *\/ */ |
/* } /\* else new score < old score: do nothing *\/ */ |
/* break; */ |
/* } */ |
/* if (i >= nscores) { */ |
/* strlcpy(sp->hs_name, me, sizeof sp->hs_name); */ |
/* sp->hs_level = level; */ |
/* sp->hs_score = score; */ |
/* sp->hs_time = now; */ |
/* nscores++; */ |
/* change = 1; */ |
/* } */ |
/* if (change) { */ |
/* /\* */ |
/* * Sort & clean the scores, then rewrite. */ |
/* *\/ */ |
/* nscores = checkscores(scores, nscores); */ |
/* rewind(sf); */ |
/* if (fwrite(scores, sizeof(*sp), nscores, sf) != nscores || */ |
/* fflush(sf) == EOF) */ |
/* warnx("error writing %s: %s\n\t-- %s", */ |
/* _PATH_SCOREFILE, strerror(errno), */ |
/* "high scores may be damaged"); */ |
/* } */ |
/* (void)fclose(sf); /\* releases lock *\/ */ |
/* } */ |
/* |
* Get login name, or if that fails, get something suitable. |
* The result is always trimmed to fit in a score. |
*/ |
/* static char * */ |
/* thisuser(void) */ |
/* { */ |
/* const char *p; */ |
/* struct passwd *pw; */ |
/* static char u[sizeof(scores[0].hs_name)]; */ |
/* if (u[0]) */ |
/* return (u); */ |
/* p = getlogin(); */ |
/* if (p == NULL || *p == '\0') { */ |
/* pw = getpwuid(getuid()); */ |
/* if (pw != NULL) */ |
/* p = pw->pw_name; */ |
/* else */ |
/* p = " ???"; */ |
/* } */ |
/* strlcpy(u, p, sizeof(u)); */ |
/* return (u); */ |
/* } */ |
/* |
* Score comparison function for qsort. |
* |
* If two scores are equal, the person who had the score first is |
* listed first in the highscore file. |
*/ |
/* static int */ |
/* cmpscores(const void *x, const void *y) */ |
/* { */ |
/* const struct highscore *a, *b; */ |
/* long l; */ |
/* a = x; */ |
/* b = y; */ |
/* l = (long)b->hs_level * b->hs_score - (long)a->hs_level * a->hs_score; */ |
/* if (l < 0) */ |
/* return (-1); */ |
/* if (l > 0) */ |
/* return (1); */ |
/* if (a->hs_time < b->hs_time) */ |
/* return (-1); */ |
/* if (a->hs_time > b->hs_time) */ |
/* return (1); */ |
/* return (0); */ |
/* } */ |
/* |
* If we've added a score to the file, we need to check the file and ensure |
* that this player has only a few entries. The number of entries is |
* controlled by MAXSCORES, and is to ensure that the highscore file is not |
* monopolised by just a few people. People who no longer have accounts are |
* only allowed the highest score. Scores older than EXPIRATION seconds are |
* removed, unless they are someone's personal best. |
* Caveat: the highest score on each level is always kept. |
*/ |
/* static int */ |
/* checkscores(struct highscore *hs, int num) */ |
/* { */ |
/* struct highscore *sp; */ |
/* int i, j, k, numnames; */ |
/* int levelfound[NLEVELS]; */ |
/* struct peruser { */ |
/* char *name; */ |
/* int times; */ |
/* } count[NUMSPOTS]; */ |
/* struct peruser *pu; */ |
/* /\* */ |
/* * Sort so that highest totals come first. */ |
/* * */ |
/* * levelfound[i] becomes set when the first high score for that */ |
/* * level is encountered. By definition this is the highest score. */ |
/* *\/ */ |
/* qsort((void *)hs, nscores, sizeof(*hs), cmpscores); */ |
/* for (i = MINLEVEL; i < NLEVELS; i++) */ |
/* levelfound[i] = 0; */ |
/* numnames = 0; */ |
/* for (i = 0, sp = hs; i < num;) { */ |
/* /\* */ |
/* * This is O(n^2), but do you think we care? */ |
/* *\/ */ |
/* for (j = 0, pu = count; j < numnames; j++, pu++) */ |
/* if (strcmp(sp->hs_name, pu->name) == 0) */ |
/* break; */ |
/* if (j == numnames) { */ |
/* /\* */ |
/* * Add new user, set per-user count to 1. */ |
/* *\/ */ |
/* pu->name = sp->hs_name; */ |
/* pu->times = 1; */ |
/* numnames++; */ |
/* } else { */ |
/* /\* */ |
/* * Two ways to keep this score: */ |
/* * - Not too many (per user), still has acct, & */ |
/* * score not dated; or */ |
/* * - High score on this level. */ |
/* *\/ */ |
/* if ((pu->times < MAXSCORES && */ |
/* getpwnam(sp->hs_name) != NULL && */ |
/* sp->hs_time + EXPIRATION >= now) || */ |
/* levelfound[sp->hs_level] == 0) */ |
/* pu->times++; */ |
/* else { */ |
/* /\* */ |
/* * Delete this score, do not count it, */ |
/* * do not pass go, do not collect $200. */ |
/* *\/ */ |
/* num--; */ |
/* for (k = i; k < num; k++) */ |
/* hs[k] = hs[k + 1]; */ |
/* continue; */ |
/* } */ |
/* } */ |
/* levelfound[sp->hs_level] = 1; */ |
/* i++, sp++; */ |
/* } */ |
/* return (num > MAXHISCORES ? MAXHISCORES : num); */ |
/* } */ |
/* |
* Show current scores. This must be called after savescore, if |
* savescore is called at all, for two reasons: |
* - Showscores munches the time field. |
* - Even if that were not the case, a new score must be recorded |
* before it can be shown anyway. |
*/ |
/* |
void |
showscores(int level) |
{ |
return; |
} |
*/ |
/* struct highscore *sp; */ |
/* int i, n, c; */ |
/* const char *me; */ |
/* int levelfound[NLEVELS]; */ |
/* if (!gotscores) */ |
/* getscores((FILE **)NULL); */ |
/* (void)printf("\n\t\t Tetris High Scores\n"); */ |
/* /\* */ |
/* * If level == 0, the person has not played a game but just asked for */ |
/* * the high scores; we do not need to check for printing in highlight */ |
/* * mode. If SOstr is null, we can't do highlighting anyway. */ |
/* *\/ */ |
/* me = level && SOstr ? thisuser() : NULL; */ |
/* /\* */ |
/* * Set times to 0 except for high score on each level. */ |
/* *\/ */ |
/* for (i = MINLEVEL; i < NLEVELS; i++) */ |
/* levelfound[i] = 0; */ |
/* for (i = 0, sp = scores; i < nscores; i++, sp++) { */ |
/* if (levelfound[sp->hs_level]) */ |
/* sp->hs_time = 0; */ |
/* else { */ |
/* sp->hs_time = 1; */ |
/* levelfound[sp->hs_level] = 1; */ |
/* } */ |
/* } */ |
/* /\* */ |
/* * Page each screenful of scores. */ |
/* *\/ */ |
/* for (i = 0, sp = scores; i < nscores; sp += n) { */ |
/* n = 20; */ |
/* if (i + n > nscores) */ |
/* n = nscores - i; */ |
/* printem(level, i + 1, sp, n, me); */ |
/* if ((i += n) < nscores) { */ |
/* (void)printf("\nHit RETURN to continue."); */ |
/* (void)fflush(stdout); */ |
/* while ((c = getchar()) != '\n') */ |
/* if (c == EOF) */ |
/* break; */ |
/* (void)printf("\n"); */ |
/* } */ |
/* } */ |
/* if (nscores == 0) */ |
/* printf("\t\t\t - none to date.\n"); */ |
/* } */ |
/* static void */ |
/* printem(int level, int offset, struct highscore *hs, int n, const char *me) */ |
/* { */ |
/* struct highscore *sp; */ |
/* int row, highlight, i; */ |
/* char buf[100]; */ |
/* #define TITLE "Rank Score Name (points/level)" */ |
/* #define TITL2 "==========================================================" */ |
/* printf("%s\n%s\n", TITLE, TITL2); */ |
/* highlight = 0; */ |
/* for (row = 0; row < n; row++) { */ |
/* sp = &hs[row]; */ |
/* (void)snprintf(buf, sizeof(buf), */ |
/* "%3d%c %6d %-31s (%6d on %d)\n", */ |
/* row + offset, sp->hs_time ? '*' : ' ', */ |
/* sp->hs_score * sp->hs_level, */ |
/* sp->hs_name, sp->hs_score, sp->hs_level); */ |
/* /\* Print leaders every three lines *\/ */ |
/* if ((row + 1) % 3 == 0) { */ |
/* for (i = 0; i < sizeof(buf); i++) */ |
/* if (buf[i] == ' ') */ |
/* buf[i] = '_'; */ |
/* } */ |
/* /\* */ |
/* * Highlight if appropriate. This works because */ |
/* * we only get one score per level. */ |
/* *\/ */ |
/* if (me != NULL && */ |
/* sp->hs_level == level && */ |
/* sp->hs_score == score && */ |
/* strcmp(sp->hs_name, me) == 0) { */ |
/* putpad(SOstr); */ |
/* highlight = 1; */ |
/* } */ |
/* (void)printf("%s", buf); */ |
/* if (highlight) { */ |
/* putpad(SEstr); */ |
/* highlight = 0; */ |
/* } */ |
/* } */ |
/* } */ |
/** @} |
*/ |
/tags/0.2.0/uspace/tetris/input.c |
---|
0,0 → 1,188 |
/* $OpenBSD: input.c,v 1.12 2005/04/13 02:33:08 deraadt Exp $ */ |
/* $NetBSD: input.c,v 1.3 1996/02/06 22:47:33 jtc Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* 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. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. |
* |
* @(#)input.c 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Tetris input. |
*/ |
#include <sys/types.h> |
#include <sys/time.h> |
#include <stdio.h> |
#include <errno.h> |
#include <unistd.h> |
#include <string.h> |
#include "input.h" |
#include "tetris.h" |
#include <async.h> |
#include "../console/console.h" |
/* return true iff the given timeval is positive */ |
#define TV_POS(tv) \ |
((tv)->tv_sec > 0 || ((tv)->tv_sec == 0 && (tv)->tv_usec > 0)) |
/* subtract timeval `sub' from `res' */ |
#define TV_SUB(res, sub) \ |
(res)->tv_sec -= (sub)->tv_sec; \ |
(res)->tv_usec -= (sub)->tv_usec; \ |
if ((res)->tv_usec < 0) { \ |
(res)->tv_usec += 1000000; \ |
(res)->tv_sec--; \ |
} |
/* We will use a hack here - if lastchar is non-zero, it is |
* the last character read. We will somehow simulate the select |
* semantics. |
*/ |
static aid_t getchar_inprog = 0; |
static char lastchar = '\0'; |
/* |
* Do a `read wait': select for reading from stdin, with timeout *tvp. |
* On return, modify *tvp to reflect the amount of time spent waiting. |
* It will be positive only if input appeared before the time ran out; |
* otherwise it will be zero or perhaps negative. |
* |
* If tvp is nil, wait forever, but return if select is interrupted. |
* |
* Return 0 => no input, 1 => can read() from stdin |
* |
*/ |
int |
rwait(struct timeval *tvp) |
{ |
struct timeval starttv, endtv, *s; |
static ipc_call_t charcall; |
ipcarg_t rc; |
/* |
* Someday, select() will do this for us. |
* Just in case that day is now, and no one has |
* changed this, we use a temporary. |
*/ |
if (tvp) { |
(void) gettimeofday(&starttv, NULL); |
endtv = *tvp; |
s = &endtv; |
} else |
s = NULL; |
again: |
if (!lastchar) { |
if (!getchar_inprog) |
getchar_inprog = async_send_2(1,CONSOLE_GETCHAR,0,0,&charcall); |
if (!s) |
async_wait_for(getchar_inprog, &rc); |
else if (async_wait_timeout(getchar_inprog, &rc, s->tv_usec) == ETIMEOUT) { |
tvp->tv_sec = 0; |
tvp->tv_usec = 0; |
return (0); |
} |
getchar_inprog = 0; |
if (rc) { |
stop("end of file, help"); |
} |
lastchar = IPC_GET_ARG1(charcall); |
} |
if (tvp) { |
/* since there is input, we may not have timed out */ |
(void) gettimeofday(&endtv, NULL); |
TV_SUB(&endtv, &starttv); |
TV_SUB(tvp, &endtv); /* adjust *tvp by elapsed time */ |
} |
return (1); |
} |
/* |
* `sleep' for the current turn time (using select). |
* Eat any input that might be available. |
*/ |
void |
tsleep(void) |
{ |
struct timeval tv; |
char c; |
tv.tv_sec = 0; |
tv.tv_usec = fallrate; |
while (TV_POS(&tv)) |
if (rwait(&tv)) { |
lastchar = '\0'; |
} else |
break; |
} |
/* |
* getchar with timeout. |
*/ |
int |
tgetchar(void) |
{ |
static struct timeval timeleft; |
char c; |
/* |
* Reset timeleft to fallrate whenever it is not positive. |
* In any case, wait to see if there is any input. If so, |
* take it, and update timeleft so that the next call to |
* tgetchar() will not wait as long. If there is no input, |
* make timeleft zero or negative, and return -1. |
* |
* Most of the hard work is done by rwait(). |
*/ |
if (!TV_POS(&timeleft)) { |
faster(); /* go faster */ |
timeleft.tv_sec = 0; |
timeleft.tv_usec = fallrate; |
} |
if (!rwait(&timeleft)) |
return (-1); |
c = lastchar; |
lastchar = '\0'; |
return ((int)(unsigned char)c); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/tetris/screen.c |
---|
0,0 → 1,328 |
/* $OpenBSD: screen.c,v 1.13 2006/04/20 03:25:36 ray Exp $ */ |
/* $NetBSD: screen.c,v 1.4 1995/04/29 01:11:36 mycroft Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* 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. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. |
* |
* @(#)screen.c 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Tetris screen control. |
*/ |
#include <err.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <unistd.h> |
#include <io/stream.h> |
#include <async.h> |
#include "screen.h" |
#include "tetris.h" |
#include "../console/console.h" |
static cell curscreen[B_SIZE]; /* 1 => standout (or otherwise marked) */ |
static int curscore; |
static int isset; /* true => terminal is in game mode */ |
static void (*tstp)(int); |
static void scr_stop(int); |
static void stopset(int); |
static char |
*CEstr; /* clear to end of line */ |
/* |
* putstr() is for unpadded strings (either as in termcap(5) or |
* simply literal strings); |
*/ |
static inline void putstr(char *s) |
{ |
while (*s) |
putchar(*(s++)); |
} |
static int con_phone; |
static void set_style(int fgcolor, int bgcolor) |
{ |
async_msg_2(con_phone, CONSOLE_SET_STYLE, fgcolor, bgcolor); |
} |
static void start_standout(void) |
{ |
set_style(0xf0f0f0, 0); |
} |
static void resume_normal(void) |
{ |
set_style(0, 0xf0f0f0); |
} |
void clear_screen(void) |
{ |
async_msg(con_phone, CONSOLE_CLEAR, 0); |
moveto(0,0); |
} |
/* |
* Clear the screen, forgetting the current contents in the process. |
*/ |
void |
scr_clear(void) |
{ |
resume_normal(); |
async_msg(con_phone, CONSOLE_CLEAR, 0); |
curscore = -1; |
memset((char *)curscreen, 0, sizeof(curscreen)); |
} |
/* |
* Set up screen |
*/ |
void |
scr_init(void) |
{ |
con_phone = get_fd_phone(1); |
async_msg(con_phone, CONSOLE_CURSOR_VISIBILITY, 0); |
resume_normal(); |
scr_clear(); |
} |
void moveto(int r, int c) |
{ |
async_msg_2(con_phone, CONSOLE_GOTO, r, c); |
} |
static void fflush(void) |
{ |
async_msg(con_phone, CONSOLE_FLUSH, 0); |
} |
winsize_t winsize; |
static int get_display_size(winsize_t *ws) |
{ |
return async_req_2(con_phone, CONSOLE_GETSIZE, 0, 0, &ws->ws_row, &ws->ws_col); |
} |
static void |
scr_stop(int sig) |
{ |
scr_end(); |
scr_set(); |
scr_msg(key_msg, 1); |
} |
/* |
* Set up screen mode. |
*/ |
void |
scr_set(void) |
{ |
winsize_t ws; |
Rows = 0, Cols = 0; |
if (get_display_size(&ws) == 0) { |
Rows = ws.ws_row; |
Cols = ws.ws_col; |
} |
if (Rows < MINROWS || Cols < MINCOLS) { |
char smallscr[55]; |
snprintf(smallscr, sizeof(smallscr), |
"the screen is too small (must be at least %dx%d)", |
MINROWS, MINCOLS); |
stop(smallscr); |
} |
isset = 1; |
scr_clear(); |
} |
/* |
* End screen mode. |
*/ |
void |
scr_end(void) |
{ |
} |
void |
stop(char *why) |
{ |
if (isset) |
scr_end(); |
errx(1, "aborting: %s", why); |
} |
/* |
* Update the screen. |
*/ |
void |
scr_update(void) |
{ |
cell *bp, *sp; |
cell so, cur_so = 0; |
int i, ccol, j; |
static const struct shape *lastshape; |
/* always leave cursor after last displayed point */ |
curscreen[D_LAST * B_COLS - 1] = -1; |
if (score != curscore) { |
moveto(0, 0); |
printf("Score: %d", score); |
curscore = score; |
} |
/* draw preview of next pattern */ |
if (showpreview && (nextshape != lastshape)) { |
int i; |
static int r=5, c=2; |
int tr, tc, t; |
lastshape = nextshape; |
/* clean */ |
resume_normal(); |
moveto(r-1, c-1); putstr(" "); |
moveto(r, c-1); putstr(" "); |
moveto(r+1, c-1); putstr(" "); |
moveto(r+2, c-1); putstr(" "); |
moveto(r-3, c-2); |
putstr("Next shape:"); |
/* draw */ |
start_standout(); |
moveto(r, 2 * c); |
putstr(" "); |
for (i = 0; i < 3; i++) { |
t = c + r * B_COLS; |
t += nextshape->off[i]; |
tr = t / B_COLS; |
tc = t % B_COLS; |
moveto(tr, 2*tc); |
putstr(" "); |
} |
resume_normal(); |
} |
bp = &board[D_FIRST * B_COLS]; |
sp = &curscreen[D_FIRST * B_COLS]; |
for (j = D_FIRST; j < D_LAST; j++) { |
ccol = -1; |
for (i = 0; i < B_COLS; bp++, sp++, i++) { |
if (*sp == (so = *bp)) |
continue; |
*sp = so; |
if (i != ccol) { |
if (cur_so) { |
resume_normal(); |
cur_so = 0; |
} |
moveto(RTOD(j), CTOD(i)); |
} |
if (so != cur_so) { |
if (so) |
start_standout(); |
else |
resume_normal(); |
cur_so = so; |
} |
putstr(" "); |
ccol = i + 1; |
/* |
* Look ahead a bit, to avoid extra motion if |
* we will be redrawing the cell after the next. |
* Motion probably takes four or more characters, |
* so we save even if we rewrite two cells |
* `unnecessarily'. Skip it all, though, if |
* the next cell is a different color. |
*/ |
#define STOP (B_COLS - 3) |
if (i > STOP || sp[1] != bp[1] || so != bp[1]) |
continue; |
if (sp[2] != bp[2]) |
sp[1] = -1; |
else if (i < STOP && so == bp[2] && sp[3] != bp[3]) { |
sp[2] = -1; |
sp[1] = -1; |
} |
} |
} |
if (cur_so) |
resume_normal(); |
fflush(); |
} |
/* |
* Write a message (set!=0), or clear the same message (set==0). |
* (We need its length in case we have to overwrite with blanks.) |
*/ |
void |
scr_msg(char *s, int set) |
{ |
int l = strlen(s); |
moveto(Rows - 2, ((Cols - l) >> 1) - 1); |
if (set) |
putstr(s); |
else |
while (--l >= 0) |
(void) putchar(' '); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/tetris/tetris.h |
---|
0,0 → 1,188 |
/* $OpenBSD: tetris.h,v 1.9 2003/06/03 03:01:41 millert Exp $ */ |
/* $NetBSD: tetris.h,v 1.2 1995/04/22 07:42:48 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* 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. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. |
* |
* @(#)tetris.h 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Definitions for Tetris. |
*/ |
/* |
* The display (`board') is composed of 23 rows of 12 columns of characters |
* (numbered 0..22 and 0..11), stored in a single array for convenience. |
* Columns 1 to 10 of rows 1 to 20 are the actual playing area, where |
* shapes appear. Columns 0 and 11 are always occupied, as are all |
* columns of rows 21 and 22. Rows 0 and 22 exist as boundary areas |
* so that regions `outside' the visible area can be examined without |
* worrying about addressing problems. |
*/ |
/* the board */ |
#define B_COLS 12 |
#define B_ROWS 23 |
#define B_SIZE (B_ROWS * B_COLS) |
typedef unsigned char cell; |
extern cell board[B_SIZE]; /* 1 => occupied, 0 => empty */ |
/* the displayed area (rows) */ |
#define D_FIRST 1 |
#define D_LAST 22 |
/* the active area (rows) */ |
#define A_FIRST 1 |
#define A_LAST 21 |
/* |
* Minimum display size. |
*/ |
#define MINROWS 23 |
#define MINCOLS 40 |
extern int Rows, Cols; /* current screen size */ |
/* |
* Translations from board coordinates to display coordinates. |
* As with board coordinates, display coordiates are zero origin. |
*/ |
#define RTOD(x) ((x) - 1) |
#define CTOD(x) ((x) * 2 + (((Cols - 2 * B_COLS) >> 1) - 1)) |
/* |
* A `shape' is the fundamental thing that makes up the game. There |
* are 7 basic shapes, each consisting of four `blots': |
* |
* X.X X.X X.X |
* X.X X.X X.X.X X.X X.X.X X.X.X X.X.X.X |
* X X X |
* |
* 0 1 2 3 4 5 6 |
* |
* Except for 3 and 6, the center of each shape is one of the blots. |
* This blot is designated (0,0). The other three blots can then be |
* described as offsets from the center. Shape 3 is the same under |
* rotation, so its center is effectively irrelevant; it has been chosen |
* so that it `sticks out' upward and leftward. Except for shape 6, |
* all the blots are contained in a box going from (-1,-1) to (+1,+1); |
* shape 6's center `wobbles' as it rotates, so that while it `sticks out' |
* rightward, its rotation---a vertical line---`sticks out' downward. |
* The containment box has to include the offset (2,0), making the overall |
* containment box range from offset (-1,-1) to (+2,+1). (This is why |
* there is only one row above, but two rows below, the display area.) |
* |
* The game works by choosing one of these shapes at random and putting |
* its center at the middle of the first display row (row 1, column 5). |
* The shape is moved steadily downward until it collides with something: |
* either another shape, or the bottom of the board. When the shape can |
* no longer be moved downwards, it is merged into the current board. |
* At this time, any completely filled rows are elided, and blots above |
* these rows move down to make more room. A new random shape is again |
* introduced at the top of the board, and the whole process repeats. |
* The game ends when the new shape will not fit at (1,5). |
* |
* While the shapes are falling, the user can rotate them counterclockwise |
* 90 degrees (in addition to moving them left or right), provided that the |
* rotation puts the blots in empty spaces. The table of shapes is set up |
* so that each shape contains the index of the new shape obtained by |
* rotating the current shape. Due to symmetry, each shape has exactly |
* 1, 2, or 4 rotations total; the first 7 entries in the table represent |
* the primary shapes, and the remaining 12 represent their various |
* rotated forms. |
*/ |
struct shape { |
int rot; /* index of rotated version of this shape */ |
int rotc; /* -- " -- in classic version */ |
int off[3]; /* offsets to other blots if center is at (0,0) */ |
}; |
extern const struct shape shapes[]; |
extern const struct shape *curshape; |
extern const struct shape *nextshape; |
/* |
* Shapes fall at a rate faster than once per second. |
* |
* The initial rate is determined by dividing 1 million microseconds |
* by the game `level'. (This is at most 1 million, or one second.) |
* Each time the fall-rate is used, it is decreased a little bit, |
* depending on its current value, via the `faster' macro below. |
* The value eventually reaches a limit, and things stop going faster, |
* but by then the game is utterly impossible. |
*/ |
extern long fallrate; /* less than 1 million; smaller => faster */ |
#define faster() (fallrate -= fallrate / 3000) |
/* |
* Game level must be between 1 and 9. This controls the initial fall rate |
* and affects scoring. |
*/ |
#define MINLEVEL 1 |
#define MAXLEVEL 9 |
/* |
* Scoring is as follows: |
* |
* When the shape comes to rest, and is integrated into the board, |
* we score one point. If the shape is high up (at a low-numbered row), |
* and the user hits the space bar, the shape plummets all the way down, |
* and we score a point for each row it falls (plus one more as soon as |
* we find that it is at rest and integrate it---until then, it can |
* still be moved or rotated). |
* |
* If previewing has been turned on, the score is multiplied by PRE_PENALTY. |
*/ |
#define PRE_PENALTY 0.75 |
extern int score; /* the obvious thing */ |
//extern gid_t gid, egid; |
extern char key_msg[100]; |
extern int showpreview; |
extern int classic; |
int fits_in(const struct shape *, int); |
void place(const struct shape *, int, int); |
void stop(char *); |
/** @} |
*/ |
/tags/0.2.0/uspace/tetris/scores.h |
---|
0,0 → 1,67 |
/* $OpenBSD: scores.h,v 1.5 2003/06/03 03:01:41 millert Exp $ */ |
/* $NetBSD: scores.h,v 1.2 1995/04/22 07:42:40 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* 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. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. |
* |
* @(#)scores.h 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Tetris scores. |
*/ |
#include <sys/time.h> |
#define MAXLOGNAME 16 |
struct highscore { |
char hs_name[MAXLOGNAME + 1]; /* login name */ |
int hs_score; /* raw score */ |
int hs_level; /* play level */ |
// time_t hs_time; /* time at game end */ |
}; |
#define MAXHISCORES 10 |
//#define MAXSCORES 9 /* maximum high score entries per person */ |
//#define EXPIRATION (5L * 365 * 24 * 60 * 60) |
void savescore(int); |
void showscores(int); |
void insertscore(int score, int level); |
void initscores(void); |
/** @} |
*/ |
/tags/0.2.0/uspace/tetris/shapes.c |
---|
0,0 → 1,116 |
/* $OpenBSD: shapes.c,v 1.8 2004/07/10 07:26:24 deraadt Exp $ */ |
/* $NetBSD: shapes.c,v 1.2 1995/04/22 07:42:44 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* 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. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. |
* |
* @(#)shapes.c 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Tetris shapes and related routines. |
* |
* Note that the first 7 are `well known'. |
*/ |
#include <unistd.h> |
#include "tetris.h" |
#define TL -B_COLS-1 /* top left */ |
#define TC -B_COLS /* top center */ |
#define TR -B_COLS+1 /* top right */ |
#define ML -1 /* middle left */ |
#define MR 1 /* middle right */ |
#define BL B_COLS-1 /* bottom left */ |
#define BC B_COLS /* bottom center */ |
#define BR B_COLS+1 /* bottom right */ |
const struct shape shapes[] = { |
/* 0*/ { 7, 7, { TL, TC, MR } }, |
/* 1*/ { 8, 8, { TC, TR, ML } }, |
/* 2*/ { 9, 11, { ML, MR, BC } }, |
/* 3*/ { 3, 3, { TL, TC, ML } }, |
/* 4*/ { 12, 14, { ML, BL, MR } }, |
/* 5*/ { 15, 17, { ML, BR, MR } }, |
/* 6*/ { 18, 18, { ML, MR, 2 } }, /* sticks out */ |
/* 7*/ { 0, 0, { TC, ML, BL } }, |
/* 8*/ { 1, 1, { TC, MR, BR } }, |
/* 9*/ { 10, 2, { TC, MR, BC } }, |
/*10*/ { 11, 9, { TC, ML, MR } }, |
/*11*/ { 2, 10, { TC, ML, BC } }, |
/*12*/ { 13, 4, { TC, BC, BR } }, |
/*13*/ { 14, 12, { TR, ML, MR } }, |
/*14*/ { 4, 13, { TL, TC, BC } }, |
/*15*/ { 16, 5, { TR, TC, BC } }, |
/*16*/ { 17, 15, { TL, MR, ML } }, |
/*17*/ { 5, 16, { TC, BC, BL } }, |
/*18*/ { 6, 6, { TC, BC, 2*B_COLS } }/* sticks out */ |
}; |
/* |
* Return true iff the given shape fits in the given position, |
* taking the current board into account. |
*/ |
int |
fits_in(const struct shape *shape, int pos) |
{ |
int *o = shape->off; |
if (board[pos] || board[pos + *o++] || board[pos + *o++] || |
board[pos + *o]) |
return 0; |
return 1; |
} |
/* |
* Write the given shape into the current board, turning it on |
* if `onoff' is 1, and off if `onoff' is 0. |
*/ |
void |
place(const struct shape *shape, int pos, int onoff) |
{ |
int *o = shape->off; |
board[pos] = onoff; |
board[pos + *o++] = onoff; |
board[pos + *o++] = onoff; |
board[pos + *o] = onoff; |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/tetris/input.h |
---|
0,0 → 1,50 |
/* $OpenBSD: input.h,v 1.5 2003/06/03 03:01:41 millert Exp $ */ |
/* $NetBSD: input.h,v 1.2 1995/04/22 07:42:36 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* 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. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. |
* |
* @(#)input.h 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
int rwait(struct timeval *); |
int tgetchar(void); |
void tsleep(void); |
/** @} |
*/ |
/tags/0.2.0/uspace/tetris/screen.h |
---|
0,0 → 1,71 |
/* $OpenBSD: screen.h,v 1.5 2003/06/03 03:01:41 millert Exp $ */ |
/* $NetBSD: screen.h,v 1.2 1995/04/22 07:42:42 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* 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. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. |
* |
* @(#)screen.h 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* putpad() is for padded strings with count=1. |
*/ |
#define putpad(s) tputs(s, 1, put) |
#include <async.h> |
typedef struct { |
ipcarg_t ws_row; |
ipcarg_t ws_col; |
} winsize_t; |
extern winsize_t winsize; |
void moveto(int r, int c); |
void clear_screen(void); |
int put(int); /* just calls putchar; for tputs */ |
void scr_clear(void); |
void scr_end(void); |
void scr_init(void); |
void scr_msg(char *, int); |
void scr_set(void); |
void scr_update(void); |
/** @} |
*/ |
/tags/0.2.0/uspace/tetris/pathnames.h |
---|
0,0 → 1,49 |
/* $OpenBSD: pathnames.h,v 1.3 2003/06/03 03:01:41 millert Exp $ */ |
/* $NetBSD: pathnames.h,v 1.2 1995/04/22 07:42:37 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* 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. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. |
* |
* @(#)pathnames.h 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
#define _PATH_SCOREFILE "/var/games/tetris.scores" |
/** @} |
*/ |
/tags/0.2.0/uspace/tetris/tetris.c |
---|
0,0 → 1,472 |
/* $OpenBSD: tetris.c,v 1.21 2006/04/20 03:24:12 ray Exp $ */ |
/* $NetBSD: tetris.c,v 1.2 1995/04/22 07:42:47 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* 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. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. |
* |
* @(#)tetris.c 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris Tetris |
* @brief Tetris ported from OpenBSD |
* @{ |
*/ |
/** @file |
*/ |
#ifndef lint |
static const char copyright[] = |
"@(#) Copyright (c) 1992, 1993\n\ |
The Regents of the University of California. All rights reserved.\n"; |
#endif /* not lint */ |
/* |
* Tetris (or however it is spelled). |
*/ |
#include <sys/time.h> |
#include <sys/types.h> |
#include <err.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <unistd.h> |
#include "input.h" |
#include "scores.h" |
#include "screen.h" |
#include "tetris.h" |
cell board[B_SIZE]; |
int Rows, Cols; |
const struct shape *curshape; |
const struct shape *nextshape; |
long fallrate; |
int score; |
//gid_t gid, egid; |
char key_msg[100]; |
int showpreview, classic; |
static void elide(void); |
static void setup_board(void); |
const struct shape *randshape(void); |
void onintr(int); |
void usage(void); |
/* |
* Set up the initial board. The bottom display row is completely set, |
* along with another (hidden) row underneath that. Also, the left and |
* right edges are set. |
*/ |
static void |
setup_board(void) |
{ |
int i; |
cell *p; |
p = board; |
for (i = B_SIZE; i; i--) |
*p++ = i <= (2 * B_COLS) || (i % B_COLS) < 2; |
} |
/* |
* Elide any full active rows. |
*/ |
static void |
elide(void) |
{ |
int rows = 0; |
int i, j, base; |
cell *p; |
for (i = A_FIRST; i < A_LAST; i++) { |
base = i * B_COLS + 1; |
p = &board[base]; |
for (j = B_COLS - 2; *p++ != 0;) { |
if (--j <= 0) { |
/* this row is to be elided */ |
rows++; |
memset(&board[base], 0, B_COLS - 2); |
scr_update(); |
tsleep(); |
while (--base != 0) |
board[base + B_COLS] = board[base]; |
scr_update(); |
tsleep(); |
break; |
} |
} |
} |
switch (rows) { |
case 1: |
score += 10; |
break; |
case 2: |
score += 30; |
break; |
case 3: |
score += 70; |
break; |
case 4: |
score += 150; |
break; |
default: |
break; |
} |
} |
const struct shape * |
randshape(void) |
{ |
const struct shape *tmp; |
int i, j; |
tmp = &shapes[random() % 7]; |
j = random() % 4; |
for (i = 0; i < j; i++) |
tmp = &shapes[classic? tmp->rotc : tmp->rot]; |
return (tmp); |
} |
static void srandomdev(void) |
{ |
struct timeval tv; |
gettimeofday(&tv, NULL); |
srandom(tv.tv_sec + tv.tv_usec / 100000); |
} |
static void tetris_scores(int firstgame) |
{ |
} |
static void tetris_menu_draw(int level) |
{ |
clear_screen(); |
moveto(5,10); |
puts("Tetris\n\n"); |
moveto(8,10); |
printf("Level = %d (press keys 1 - 9 to change)",level); |
moveto(9,10); |
printf("Preview is %s (press 'p' to change)", (showpreview?"on ":"off")); |
moveto(12,10); |
printf("Press 'h' to show hiscore table."); |
moveto(13,10); |
printf("Press 's' to start game."); |
moveto(14,10); |
printf("Press 'q' to quit game."); |
moveto(20,10); |
printf("In game controls:"); |
moveto(21,0); |
puts(key_msg); |
} |
static int tetris_menu(int *level) |
{ |
static int firstgame = 1; |
int i; |
/* if (showpreview == 0) |
(void)printf("Your score: %d point%s x level %d = %d\n", |
score, score == 1 ? "" : "s", level, score * level); |
else { |
(void)printf("Your score: %d point%s x level %d x preview penalty %0.3f = %d\n", |
score, score == 1 ? "" : "s", level, (double)PRE_PENALTY, |
(int)(score * level * PRE_PENALTY)); |
score = score * PRE_PENALTY; |
} |
savescore(level); |
showscores(level); |
printf("\nHit 's' to new game, 'q' to quit.\n"); |
*/ |
tetris_menu_draw(*level); |
while (1) { |
i = getchar(); |
switch(i) { |
case 'p': |
showpreview = !showpreview; |
moveto(9,21); |
if (showpreview) |
printf("on "); |
else |
printf("off"); |
break; |
case 'h': |
showscores(firstgame); |
tetris_menu_draw(*level); |
break; |
case 's': |
firstgame = 0; |
return 1; |
case 'q': |
return 0; |
case '1': |
case '2': |
case '3': |
case '4': |
case '5': |
case '6': |
case '7': |
case '8': |
case '9': |
*level = i - '0'; |
moveto(8,18); |
printf("%d", *level); |
break; |
} |
} |
} |
int |
main(int argc, char *argv[]) |
{ |
int pos, c; |
char *keys; |
int level = 2; |
char key_write[6][10]; |
const char *errstr; |
int ch, i, j; |
keys = "jkl pq"; |
// gid = getgid(); |
// egid = getegid(); |
// setegid(gid); |
classic = 0; |
showpreview = 1; |
/* while ((ch = getopt(argc, argv, "ck:l:ps")) != -1) */ |
/* switch(ch) { */ |
/* case 'c': */ |
/* /\* */ |
/* * this means: */ |
/* * - rotate the other way; */ |
/* * - no reverse video. */ |
/* *\/ */ |
/* classic = 1; */ |
/* break; */ |
/* case 'k': */ |
/* if (strlen(keys = optarg) != 6) */ |
/* usage(); */ |
/* break; */ |
/* case 'l': */ |
/* level = (int)strtonum(optarg, MINLEVEL, MAXLEVEL, */ |
/* &errstr); */ |
/* if (errstr) */ |
/* errx(1, "level must be from %d to %d", */ |
/* MINLEVEL, MAXLEVEL); */ |
/* break; */ |
/* case 'p': */ |
/* showpreview = 1; */ |
/* break; */ |
/* case 's': */ |
/* showscores(0); */ |
/* exit(0); */ |
/* default: */ |
/* usage(); */ |
/* } */ |
/* argc -= optind; */ |
/* argv += optind; */ |
/* if (argc) */ |
/* usage(); */ |
fallrate = 1000000 / level; |
for (i = 0; i <= 5; i++) { |
for (j = i+1; j <= 5; j++) { |
if (keys[i] == keys[j]) |
errx(1, "duplicate command keys specified."); |
} |
if (keys[i] == ' ') |
strncpy(key_write[i], "<space>", sizeof key_write[i]); |
else { |
key_write[i][0] = keys[i]; |
key_write[i][1] = '\0'; |
} |
} |
snprintf(key_msg, sizeof key_msg, |
"%s - left %s - rotate %s - right %s - drop %s - pause %s - quit", |
key_write[0], key_write[1], key_write[2], key_write[3], |
key_write[4], key_write[5]); |
scr_init(); |
initscores(); |
while (tetris_menu(&level)) { |
scr_clear(); |
setup_board(); |
srandomdev(); |
scr_set(); |
pos = A_FIRST*B_COLS + (B_COLS/2)-1; |
nextshape = randshape(); |
curshape = randshape(); |
scr_msg(key_msg, 1); |
for (;;) { |
place(curshape, pos, 1); |
scr_update(); |
place(curshape, pos, 0); |
c = tgetchar(); |
if (c < 0) { |
/* |
* Timeout. Move down if possible. |
*/ |
if (fits_in(curshape, pos + B_COLS)) { |
pos += B_COLS; |
continue; |
} |
/* |
* Put up the current shape `permanently', |
* bump score, and elide any full rows. |
*/ |
place(curshape, pos, 1); |
score++; |
elide(); |
/* |
* Choose a new shape. If it does not fit, |
* the game is over. |
*/ |
curshape = nextshape; |
nextshape = randshape(); |
pos = A_FIRST*B_COLS + (B_COLS/2)-1; |
if (!fits_in(curshape, pos)) |
break; |
continue; |
} |
/* |
* Handle command keys. |
*/ |
if (c == keys[5]) { |
/* quit */ |
break; |
} |
if (c == keys[4]) { |
static char msg[] = |
"paused - press RETURN to continue"; |
place(curshape, pos, 1); |
do { |
scr_update(); |
scr_msg(key_msg, 0); |
scr_msg(msg, 1); |
// (void) fflush(stdout); |
} while (rwait((struct timeval *)NULL) == -1); |
scr_msg(msg, 0); |
scr_msg(key_msg, 1); |
place(curshape, pos, 0); |
continue; |
} |
if (c == keys[0]) { |
/* move left */ |
if (fits_in(curshape, pos - 1)) |
pos--; |
continue; |
} |
if (c == keys[1]) { |
/* turn */ |
const struct shape *new = &shapes[ |
classic? curshape->rotc : curshape->rot]; |
if (fits_in(new, pos)) |
curshape = new; |
continue; |
} |
if (c == keys[2]) { |
/* move right */ |
if (fits_in(curshape, pos + 1)) |
pos++; |
continue; |
} |
if (c == keys[3]) { |
/* move to bottom */ |
while (fits_in(curshape, pos + B_COLS)) { |
pos += B_COLS; |
score++; |
} |
continue; |
} |
if (c == '\f') { |
scr_clear(); |
scr_msg(key_msg, 1); |
} |
} |
scr_clear(); |
insertscore(score, level); |
} |
scr_clear(); |
printf("\n\n\n\t\tGame over.\n"); |
/* |
while ((i = getchar()) != '\n') |
if (i == EOF) |
break |
*/ |
scr_end(); |
exit(0); |
} |
/* void */ |
/* onintr(int signo) */ |
/* { */ |
/* scr_clear(); /\* XXX signal race *\/ */ |
/* scr_end(); /\* XXX signal race *\/ */ |
/* _exit(0); */ |
/* } */ |
void |
usage(void) |
{ |
(void)fprintf(stderr, "usage: tetris [-ps] [-k keys] [-l level]\n"); |
exit(1); |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/tetris/Makefile |
---|
0,0 → 1,35 |
LIBC_PREFIX = ../libc |
SOFTINT_PREFIX = ../softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
LIBS = $(LIBC_PREFIX)/libc.a |
OUTPUT = tetris |
SOURCES = shapes.c scores.c input.c tetris.c screen.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend *.o |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.2.0/uspace/pci/Makefile |
---|
0,0 → 1,78 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../libc |
SOFTINT_PREFIX = ../softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
LIBS = libpci/libpci.a $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = pci |
SOURCES = \ |
pci.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
$(MAKE) -C libpci clean |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(MAKE) -C libpci |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
libpci/libpci.a: |
$(MAKE) -C libpci |
/tags/0.2.0/uspace/pci/pci.c |
---|
0,0 → 1,82 |
/* |
* HelenOS PCI driver. |
* |
* Copyright (C) 1997-2003 Martin Mares |
* Copyright (C) 2006 Jakub Jermar |
* |
* (Based on libpci example.c written by Martin Mares.) |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#include <stdio.h> |
#include <ddi.h> |
#include <task.h> |
#include <stdlib.h> |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <errno.h> |
#include "libpci/pci.h" |
#define PCI_CONF1 0xcf8 |
#define PCI_CONF1_SIZE 8 |
#define NAME "PCI" |
static struct pci_access *pacc; |
int main(int argc, char *argv[]) |
{ |
struct pci_dev *dev; |
unsigned int c; |
char buf[80]; |
ipcarg_t ns_in_phone_hash; |
printf("%s: HelenOS PCI driver\n", NAME); |
/* |
* Gain control over PCI configuration ports. |
*/ |
iospace_enable(task_get_id(), (void *) PCI_CONF1, PCI_CONF1_SIZE); |
pacc = pci_alloc(); /* Get the pci_access structure */ |
pci_init(pacc); /* Initialize the PCI library */ |
pci_scan_bus(pacc); /* We want to get the list of devices */ |
for(dev=pacc->devices; dev; dev=dev->next) { /* Iterate over all devices */ |
pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES | PCI_FILL_IRQ); |
c = pci_read_word(dev, PCI_CLASS_DEVICE); /* Read config register directly */ |
printf("%02x:%02x.%d vendor=%04x device=%04x class=%04x irq=%d base0=%lx\n", |
dev->bus, dev->dev, dev->func, dev->vendor_id, dev->device_id, |
c, dev->irq, dev->base_addr[0]); |
printf("\t%s\n", pci_lookup_name(pacc, buf, sizeof(buf), PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE, |
dev->vendor_id, dev->device_id)); |
} |
printf("%s: registering at naming service.\n", NAME); |
if (ipc_connect_to_me(PHONE_NS, SERVICE_PCI, 0, &ns_in_phone_hash) != 0) { |
printf("Failed to register %s at naming service.\n", NAME); |
return -1; |
} |
printf("%s: accepting connections\n", NAME); |
while (1) { |
ipc_call_t call; |
ipc_callid_t callid; |
int retval; |
callid = ipc_wait_for_call(&call); |
switch(IPC_GET_METHOD(call)) { |
case IPC_M_CONNECT_ME_TO: |
IPC_SET_RETVAL(call, 0); |
break; |
} |
if (! (callid & IPC_CALLID_NOTIFICATION)) { |
ipc_answer(callid, &call); |
} |
printf("%s: received call from %lX\n", NAME, call.in_phone_hash); |
} |
pci_cleanup(pacc); |
return 0; |
} |
/tags/0.2.0/uspace/pci/libpci/pci.h |
---|
0,0 → 1,146 |
/* |
* The PCI Library |
* |
* Copyright (c) 1997--2005 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#ifndef _PCI_LIB_H |
#define _PCI_LIB_H |
#include "header.h" |
#include "types.h" |
#define PCI_LIB_VERSION 0x020200 |
/* |
* PCI Access Structure |
*/ |
struct pci_methods; |
enum pci_access_type { |
/* Known access methods, remember to update access.c as well */ |
PCI_ACCESS_I386_TYPE1, /* i386 ports, type 1 (params: none) */ |
PCI_ACCESS_I386_TYPE2, /* i386 ports, type 2 (params: none) */ |
PCI_ACCESS_MAX |
}; |
struct pci_access { |
/* Options you can change: */ |
unsigned int method; /* Access method */ |
char *method_params[PCI_ACCESS_MAX]; /* Parameters for the methods */ |
int writeable; /* Open in read/write mode */ |
int buscentric; /* Bus-centric view of the world */ |
int numeric_ids; /* Don't resolve device IDs to names */ |
int debugging; /* Turn on debugging messages */ |
/* Functions you can override: */ |
void (*error) (char *msg, ...); /* Write error message and quit */ |
void (*warning) (char *msg, ...); /* Write a warning message */ |
void (*debug) (char *msg, ...); /* Write a debugging message */ |
struct pci_dev *devices; /* Devices found on this bus */ |
/* Fields used internally: */ |
struct pci_methods *methods; |
struct id_entry **id_hash; /* names.c */ |
struct id_bucket *current_id_bucket; |
}; |
/* Initialize PCI access */ |
struct pci_access *pci_alloc(void); |
void pci_init(struct pci_access *); |
void pci_cleanup(struct pci_access *); |
/* Scanning of devices */ |
void pci_scan_bus(struct pci_access *acc); |
struct pci_dev *pci_get_dev(struct pci_access *acc, int domain, int bus, int dev, int func); /* Raw access to specified device */ |
void pci_free_dev(struct pci_dev *); |
/* |
* Devices |
*/ |
struct pci_dev { |
struct pci_dev *next; /* Next device in the chain */ |
u16 domain; /* PCI domain (host bridge) */ |
u8 bus, dev, func; /* Bus inside domain, device and function */ |
/* These fields are set by pci_fill_info() */ |
int known_fields; /* Set of info fields already known */ |
u16 vendor_id, device_id; /* Identity of the device */ |
int irq; /* IRQ number */ |
pciaddr_t base_addr[6]; /* Base addresses */ |
pciaddr_t size[6]; /* Region sizes */ |
pciaddr_t rom_base_addr; /* Expansion ROM base address */ |
pciaddr_t rom_size; /* Expansion ROM size */ |
/* Fields used internally: */ |
struct pci_access *access; |
struct pci_methods *methods; |
u8 *cache; /* Cached config registers */ |
int cache_len; |
int hdrtype; /* Cached low 7 bits of header type, -1 if unknown */ |
void *aux; /* Auxillary data */ |
}; |
#define PCI_ADDR_IO_MASK (~(pciaddr_t) 0x3) |
#define PCI_ADDR_MEM_MASK (~(pciaddr_t) 0xf) |
u8 pci_read_byte(struct pci_dev *, int pos); /* Access to configuration space */ |
u16 pci_read_word(struct pci_dev *, int pos); |
u32 pci_read_long(struct pci_dev *, int pos); |
int pci_read_block(struct pci_dev *, int pos, u8 * buf, int len); |
int pci_write_byte(struct pci_dev *, int pos, u8 data); |
int pci_write_word(struct pci_dev *, int pos, u16 data); |
int pci_write_long(struct pci_dev *, int pos, u32 data); |
int pci_write_block(struct pci_dev *, int pos, u8 * buf, int len); |
int pci_fill_info(struct pci_dev *, int flags); /* Fill in device information */ |
#define PCI_FILL_IDENT 1 |
#define PCI_FILL_IRQ 2 |
#define PCI_FILL_BASES 4 |
#define PCI_FILL_ROM_BASE 8 |
#define PCI_FILL_SIZES 16 |
#define PCI_FILL_RESCAN 0x10000 |
void pci_setup_cache(struct pci_dev *, u8 * cache, int len); |
/* |
* Conversion of PCI ID's to names (according to the pci.ids file) |
* |
* Call pci_lookup_name() to identify different types of ID's: |
* |
* VENDOR (vendorID) -> vendor |
* DEVICE (vendorID, deviceID) -> device |
* VENDOR | DEVICE (vendorID, deviceID) -> combined vendor and device |
* SUBSYSTEM | VENDOR (subvendorID) -> subsystem vendor |
* SUBSYSTEM | DEVICE (vendorID, deviceID, subvendorID, subdevID) -> subsystem device |
* SUBSYSTEM | VENDOR | DEVICE (vendorID, deviceID, subvendorID, subdevID) -> combined subsystem v+d |
* SUBSYSTEM | ... (-1, -1, subvendorID, subdevID) -> generic subsystem |
* CLASS (classID) -> class |
* PROGIF (classID, progif) -> programming interface |
*/ |
char *pci_lookup_name(struct pci_access *a, char *buf, int size, int flags, |
...); |
int pci_load_name_list(struct pci_access *a); /* Called automatically by pci_lookup_*() when needed; returns success */ |
void pci_free_name_list(struct pci_access *a); /* Called automatically by pci_cleanup() */ |
enum pci_lookup_mode { |
PCI_LOOKUP_VENDOR = 1, /* Vendor name (args: vendorID) */ |
PCI_LOOKUP_DEVICE = 2, /* Device name (args: vendorID, deviceID) */ |
PCI_LOOKUP_CLASS = 4, /* Device class (args: classID) */ |
PCI_LOOKUP_SUBSYSTEM = 8, |
PCI_LOOKUP_PROGIF = 16, /* Programming interface (args: classID, prog_if) */ |
PCI_LOOKUP_NUMERIC = 0x10000, /* Want only formatted numbers; default if access->numeric_ids is set */ |
PCI_LOOKUP_NO_NUMBERS = 0x20000 /* Return NULL if not found in the database; default is to print numerically */ |
}; |
#endif |
/tags/0.2.0/uspace/pci/libpci/VERSION |
---|
0,0 → 1,2 |
This libpci has been ported from pciutils-2.2.3 |
on May 8, 2006 by Jakub Jermar. |
/tags/0.2.0/uspace/pci/libpci/i386-ports.c |
---|
0,0 → 1,274 |
/* |
* The PCI Library -- Direct Configuration access via i386 Ports |
* |
* Copyright (c) 1997--2004 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#include <unistd.h> |
#include "internal.h" |
static inline void outb(u8 b, u16 port) |
{ |
asm volatile ("outb %0, %1\n" :: "a" (b), "d" (port)); |
} |
static inline void outw(u16 w, u16 port) |
{ |
asm volatile ("outw %0, %1\n" :: "a" (w), "d" (port)); |
} |
static inline void outl(u32 l, u16 port) |
{ |
asm volatile ("outl %0, %1\n" :: "a" (l), "d" (port)); |
} |
static inline u8 inb(u16 port) |
{ |
u8 val; |
asm volatile ("inb %1, %0 \n" : "=a" (val) : "d"(port)); |
return val; |
} |
static inline u16 inw(u16 port) |
{ |
u16 val; |
asm volatile ("inw %1, %0 \n" : "=a" (val) : "d"(port)); |
return val; |
} |
static inline u32 inl(u16 port) |
{ |
u32 val; |
asm volatile ("inl %1, %0 \n" : "=a" (val) : "d"(port)); |
return val; |
} |
static void conf12_init(struct pci_access *a) |
{ |
} |
static void conf12_cleanup(struct pci_access *a UNUSED) |
{ |
} |
/* |
* Before we decide to use direct hardware access mechanisms, we try to do some |
* trivial checks to ensure it at least _seems_ to be working -- we just test |
* whether bus 00 contains a host bridge (this is similar to checking |
* techniques used in XFree86, but ours should be more reliable since we |
* attempt to make use of direct access hints provided by the PCI BIOS). |
* |
* This should be close to trivial, but it isn't, because there are buggy |
* chipsets (yes, you guessed it, by Intel and Compaq) that have no class ID. |
*/ |
static int intel_sanity_check(struct pci_access *a, struct pci_methods *m) |
{ |
struct pci_dev d; |
a->debug("...sanity check"); |
d.bus = 0; |
d.func = 0; |
for (d.dev = 0; d.dev < 32; d.dev++) { |
u16 class, vendor; |
if (m->read(&d, PCI_CLASS_DEVICE, (byte *) & class, |
sizeof(class)) |
&& (class == cpu_to_le16(PCI_CLASS_BRIDGE_HOST) |
|| class == cpu_to_le16(PCI_CLASS_DISPLAY_VGA)) |
|| m->read(&d, PCI_VENDOR_ID, (byte *) & vendor, |
sizeof(vendor)) |
&& (vendor == cpu_to_le16(PCI_VENDOR_ID_INTEL) |
|| vendor == cpu_to_le16(PCI_VENDOR_ID_COMPAQ))) { |
a->debug("...outside the Asylum at 0/%02x/0", |
d.dev); |
return 1; |
} |
} |
a->debug("...insane"); |
return 0; |
} |
/* |
* Configuration type 1 |
*/ |
#define CONFIG_CMD(bus, device_fn, where) (0x80000000 | (bus << 16) | (device_fn << 8) | (where & ~3)) |
static int conf1_detect(struct pci_access *a) |
{ |
unsigned int tmp; |
int res = 0; |
outb(0x01, 0xCFB); |
tmp = inl(0xCF8); |
outl(0x80000000, 0xCF8); |
if (inl(0xCF8) == 0x80000000) |
res = 1; |
outl(tmp, 0xCF8); |
if (res) |
res = intel_sanity_check(a, &pm_intel_conf1); |
return res; |
} |
static int conf1_read(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
int addr = 0xcfc + (pos & 3); |
if (pos >= 256) |
return 0; |
outl(0x80000000 | ((d->bus & 0xff) << 16) | |
(PCI_DEVFN(d->dev, d->func) << 8) | (pos & ~3), 0xcf8); |
switch (len) { |
case 1: |
buf[0] = inb(addr); |
break; |
case 2: |
((u16 *) buf)[0] = cpu_to_le16(inw(addr)); |
break; |
case 4: |
((u32 *) buf)[0] = cpu_to_le32(inl(addr)); |
break; |
default: |
return pci_generic_block_read(d, pos, buf, len); |
} |
return 1; |
} |
static int conf1_write(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
int addr = 0xcfc + (pos & 3); |
if (pos >= 256) |
return 0; |
outl(0x80000000 | ((d->bus & 0xff) << 16) | |
(PCI_DEVFN(d->dev, d->func) << 8) | (pos & ~3), 0xcf8); |
switch (len) { |
case 1: |
outb(buf[0], addr); |
break; |
case 2: |
outw(le16_to_cpu(((u16 *) buf)[0]), addr); |
break; |
case 4: |
outl(le32_to_cpu(((u32 *) buf)[0]), addr); |
break; |
default: |
return pci_generic_block_write(d, pos, buf, len); |
} |
return 1; |
} |
/* |
* Configuration type 2. Obsolete and brain-damaged, but existing. |
*/ |
static int conf2_detect(struct pci_access *a) |
{ |
/* This is ugly and tends to produce false positives. Beware. */ |
outb(0x00, 0xCFB); |
outb(0x00, 0xCF8); |
outb(0x00, 0xCFA); |
if (inb(0xCF8) == 0x00 && inb(0xCFA) == 0x00) |
return intel_sanity_check(a, &pm_intel_conf2); |
else |
return 0; |
} |
static int conf2_read(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
int addr = 0xc000 | (d->dev << 8) | pos; |
if (pos >= 256) |
return 0; |
if (d->dev >= 16) |
/* conf2 supports only 16 devices per bus */ |
return 0; |
outb((d->func << 1) | 0xf0, 0xcf8); |
outb(d->bus, 0xcfa); |
switch (len) { |
case 1: |
buf[0] = inb(addr); |
break; |
case 2: |
((u16 *) buf)[0] = cpu_to_le16(inw(addr)); |
break; |
case 4: |
((u32 *) buf)[0] = cpu_to_le32(inl(addr)); |
break; |
default: |
outb(0, 0xcf8); |
return pci_generic_block_read(d, pos, buf, len); |
} |
outb(0, 0xcf8); |
return 1; |
} |
static int conf2_write(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
int addr = 0xc000 | (d->dev << 8) | pos; |
if (pos >= 256) |
return 0; |
if (d->dev >= 16) |
d->access->error("conf2_write: only first 16 devices exist."); |
outb((d->func << 1) | 0xf0, 0xcf8); |
outb(d->bus, 0xcfa); |
switch (len) { |
case 1: |
outb(buf[0], addr); |
break; |
case 2: |
outw(le16_to_cpu(*(u16 *) buf), addr); |
break; |
case 4: |
outl(le32_to_cpu(*(u32 *) buf), addr); |
break; |
default: |
outb(0, 0xcf8); |
return pci_generic_block_write(d, pos, buf, len); |
} |
outb(0, 0xcf8); |
return 1; |
} |
struct pci_methods pm_intel_conf1 = { |
"Intel-conf1", |
NULL, /* config */ |
conf1_detect, |
conf12_init, |
conf12_cleanup, |
pci_generic_scan, |
pci_generic_fill_info, |
conf1_read, |
conf1_write, |
NULL, /* init_dev */ |
NULL /* cleanup_dev */ |
}; |
struct pci_methods pm_intel_conf2 = { |
"Intel-conf2", |
NULL, /* config */ |
conf2_detect, |
conf12_init, |
conf12_cleanup, |
pci_generic_scan, |
pci_generic_fill_info, |
conf2_read, |
conf2_write, |
NULL, /* init_dev */ |
NULL /* cleanup_dev */ |
}; |
/tags/0.2.0/uspace/pci/libpci/access.c |
---|
0,0 → 1,270 |
/* |
* The PCI Library -- User Access |
* |
* Copyright (c) 1997--2003 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdarg.h> |
#include <string.h> |
#include "internal.h" |
static struct pci_methods *pci_methods[PCI_ACCESS_MAX] = { |
&pm_intel_conf1, |
&pm_intel_conf2, |
}; |
struct pci_access *pci_alloc(void) |
{ |
struct pci_access *a = malloc(sizeof(struct pci_access)); |
int i; |
if (!a) |
return NULL; |
bzero(a, sizeof(*a)); |
for (i = 0; i < PCI_ACCESS_MAX; i++) |
if (pci_methods[i] && pci_methods[i]->config) |
pci_methods[i]->config(a); |
return a; |
} |
void *pci_malloc(struct pci_access *a, int size) |
{ |
void *x = malloc(size); |
if (!x) |
a->error("Out of memory (allocation of %d bytes failed)", size); |
return x; |
} |
void pci_mfree(void *x) |
{ |
if (x) |
free(x); |
} |
static void pci_generic_error(char *msg, ...) |
{ |
va_list args; |
va_start(args, msg); |
puts("pcilib: "); |
vprintf(msg, args); |
putchar('\n'); |
exit(1); |
} |
static void pci_generic_warn(char *msg, ...) |
{ |
va_list args; |
va_start(args, msg); |
puts("pcilib: "); |
vprintf(msg, args); |
putchar('\n'); |
} |
static void pci_generic_debug(char *msg, ...) |
{ |
va_list args; |
va_start(args, msg); |
vprintf(msg, args); |
va_end(args); |
} |
static void pci_null_debug(char *msg UNUSED, ...) |
{ |
} |
void pci_init(struct pci_access *a) |
{ |
if (!a->error) |
a->error = pci_generic_error; |
if (!a->warning) |
a->warning = pci_generic_warn; |
if (!a->debug) |
a->debug = pci_generic_debug; |
if (!a->debugging) |
a->debug = pci_null_debug; |
if (a->method) { |
if (a->method >= PCI_ACCESS_MAX || !pci_methods[a->method]) |
a->error("This access method is not supported."); |
a->methods = pci_methods[a->method]; |
} else { |
unsigned int i; |
for (i = 0; i < PCI_ACCESS_MAX; i++) |
if (pci_methods[i]) { |
a->debug("Trying method %d...", i); |
if (pci_methods[i]->detect(a)) { |
a->debug("...OK\n"); |
a->methods = pci_methods[i]; |
a->method = i; |
break; |
} |
a->debug("...No.\n"); |
} |
if (!a->methods) |
a->error("Cannot find any working access method."); |
} |
a->debug("Decided to use %s\n", a->methods->name); |
a->methods->init(a); |
} |
void pci_cleanup(struct pci_access *a) |
{ |
struct pci_dev *d, *e; |
for (d = a->devices; d; d = e) { |
e = d->next; |
pci_free_dev(d); |
} |
if (a->methods) |
a->methods->cleanup(a); |
pci_free_name_list(a); |
pci_mfree(a); |
} |
void pci_scan_bus(struct pci_access *a) |
{ |
a->methods->scan(a); |
} |
struct pci_dev *pci_alloc_dev(struct pci_access *a) |
{ |
struct pci_dev *d = pci_malloc(a, sizeof(struct pci_dev)); |
bzero(d, sizeof(*d)); |
d->access = a; |
d->methods = a->methods; |
d->hdrtype = -1; |
if (d->methods->init_dev) |
d->methods->init_dev(d); |
return d; |
} |
int pci_link_dev(struct pci_access *a, struct pci_dev *d) |
{ |
d->next = a->devices; |
a->devices = d; |
return 1; |
} |
struct pci_dev *pci_get_dev(struct pci_access *a, int domain, int bus, |
int dev, int func) |
{ |
struct pci_dev *d = pci_alloc_dev(a); |
d->domain = domain; |
d->bus = bus; |
d->dev = dev; |
d->func = func; |
return d; |
} |
void pci_free_dev(struct pci_dev *d) |
{ |
if (d->methods->cleanup_dev) |
d->methods->cleanup_dev(d); |
pci_mfree(d); |
} |
static inline void |
pci_read_data(struct pci_dev *d, void *buf, int pos, int len) |
{ |
if (pos & (len - 1)) |
d->access->error("Unaligned read: pos=%02x, len=%d", pos, |
len); |
if (pos + len <= d->cache_len) |
memcpy(buf, d->cache + pos, len); |
else if (!d->methods->read(d, pos, buf, len)) |
memset(buf, 0xff, len); |
} |
byte pci_read_byte(struct pci_dev *d, int pos) |
{ |
byte buf; |
pci_read_data(d, &buf, pos, 1); |
return buf; |
} |
word pci_read_word(struct pci_dev * d, int pos) |
{ |
word buf; |
pci_read_data(d, &buf, pos, 2); |
return le16_to_cpu(buf); |
} |
u32 pci_read_long(struct pci_dev * d, int pos) |
{ |
u32 buf; |
pci_read_data(d, &buf, pos, 4); |
return le32_to_cpu(buf); |
} |
int pci_read_block(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
return d->methods->read(d, pos, buf, len); |
} |
static inline int |
pci_write_data(struct pci_dev *d, void *buf, int pos, int len) |
{ |
if (pos & (len - 1)) |
d->access->error("Unaligned write: pos=%02x,len=%d", pos, len); |
if (pos + len <= d->cache_len) |
memcpy(d->cache + pos, buf, len); |
return d->methods->write(d, pos, buf, len); |
} |
int pci_write_byte(struct pci_dev *d, int pos, byte data) |
{ |
return pci_write_data(d, &data, pos, 1); |
} |
int pci_write_word(struct pci_dev *d, int pos, word data) |
{ |
word buf = cpu_to_le16(data); |
return pci_write_data(d, &buf, pos, 2); |
} |
int pci_write_long(struct pci_dev *d, int pos, u32 data) |
{ |
u32 buf = cpu_to_le32(data); |
return pci_write_data(d, &buf, pos, 4); |
} |
int pci_write_block(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
if (pos < d->cache_len) { |
int l = (pos + len >= d->cache_len) ? (d->cache_len - pos) : len; |
memcpy(d->cache + pos, buf, l); |
} |
return d->methods->write(d, pos, buf, len); |
} |
int pci_fill_info(struct pci_dev *d, int flags) |
{ |
if (flags & PCI_FILL_RESCAN) { |
flags &= ~PCI_FILL_RESCAN; |
d->known_fields = 0; |
} |
if (flags & ~d->known_fields) |
d->known_fields |= d->methods->fill_info(d, flags & ~d->known_fields); |
return d->known_fields; |
} |
void pci_setup_cache(struct pci_dev *d, byte * cache, int len) |
{ |
d->cache = cache; |
d->cache_len = len; |
} |
/tags/0.2.0/uspace/pci/libpci/internal.h |
---|
0,0 → 1,43 |
/* |
* The PCI Library -- Internal Stuff |
* |
* Copyright (c) 1997--2004 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#include "pci.h" |
#include "sysdep.h" |
struct pci_methods { |
char *name; |
void (*config) (struct pci_access *); |
int (*detect) (struct pci_access *); |
void (*init) (struct pci_access *); |
void (*cleanup) (struct pci_access *); |
void (*scan) (struct pci_access *); |
int (*fill_info) (struct pci_dev *, int flags); |
int (*read) (struct pci_dev *, int pos, byte * buf, int len); |
int (*write) (struct pci_dev *, int pos, byte * buf, int len); |
void (*init_dev) (struct pci_dev *); |
void (*cleanup_dev) (struct pci_dev *); |
}; |
void pci_generic_scan_bus(struct pci_access *, byte * busmap, int bus); |
void pci_generic_scan(struct pci_access *); |
int pci_generic_fill_info(struct pci_dev *, int flags); |
int pci_generic_block_read(struct pci_dev *, int pos, byte * buf, int len); |
int pci_generic_block_write(struct pci_dev *, int pos, byte * buf, |
int len); |
void *pci_malloc(struct pci_access *, int); |
void pci_mfree(void *); |
struct pci_dev *pci_alloc_dev(struct pci_access *); |
int pci_link_dev(struct pci_access *, struct pci_dev *); |
extern struct pci_methods pm_intel_conf1, pm_intel_conf2, pm_linux_proc, |
pm_fbsd_device, pm_aix_device, pm_nbsd_libpci, pm_obsd_device, |
pm_dump, pm_linux_sysfs; |
/tags/0.2.0/uspace/pci/libpci/names.c |
---|
0,0 → 1,456 |
/* |
* The PCI Library -- ID to Name Translation |
* |
* Copyright (c) 1997--2005 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdarg.h> |
#include <string.h> |
#include <errno.h> |
#include "internal.h" |
#include "pci_ids.h" |
struct id_entry { |
struct id_entry *next; |
u32 id12, id34; |
byte cat; |
byte name[1]; |
}; |
enum id_entry_type { |
ID_UNKNOWN, |
ID_VENDOR, |
ID_DEVICE, |
ID_SUBSYSTEM, |
ID_GEN_SUBSYSTEM, |
ID_CLASS, |
ID_SUBCLASS, |
ID_PROGIF |
}; |
struct id_bucket { |
struct id_bucket *next; |
unsigned int full; |
}; |
#define MAX_LINE 1024 |
#define BUCKET_SIZE 8192 |
#define HASH_SIZE 4099 |
#ifdef __GNUC__ |
#define BUCKET_ALIGNMENT __alignof__(struct id_bucket) |
#else |
union id_align { |
struct id_bucket *next; |
unsigned int full; |
}; |
#define BUCKET_ALIGNMENT sizeof(union id_align) |
#endif |
#define BUCKET_ALIGN(n) ((n)+BUCKET_ALIGNMENT-(n)%BUCKET_ALIGNMENT) |
static void *id_alloc(struct pci_access *a, unsigned int size) |
{ |
struct id_bucket *buck = a->current_id_bucket; |
unsigned int pos; |
if (!buck || buck->full + size > BUCKET_SIZE) { |
buck = pci_malloc(a, BUCKET_SIZE); |
buck->next = a->current_id_bucket; |
a->current_id_bucket = buck; |
buck->full = BUCKET_ALIGN(sizeof(struct id_bucket)); |
} |
pos = buck->full; |
buck->full = BUCKET_ALIGN(buck->full + size); |
return (byte *) buck + pos; |
} |
static inline u32 id_pair(unsigned int x, unsigned int y) |
{ |
return ((x << 16) | y); |
} |
static inline unsigned int id_hash(int cat, u32 id12, u32 id34) |
{ |
unsigned int h; |
h = id12 ^ (id34 << 3) ^ (cat << 5); |
return h % HASH_SIZE; |
} |
static struct id_entry *id_lookup(struct pci_access *a, int cat, int id1, |
int id2, int id3, int id4) |
{ |
struct id_entry *n; |
u32 id12 = id_pair(id1, id2); |
u32 id34 = id_pair(id3, id4); |
n = a->id_hash[id_hash(cat, id12, id34)]; |
while (n && (n->id12 != id12 || n->id34 != id34 || n->cat != cat)) |
n = n->next; |
return n; |
} |
static int id_insert(struct pci_access *a, int cat, int id1, int id2, |
int id3, int id4, byte * text) |
{ |
u32 id12 = id_pair(id1, id2); |
u32 id34 = id_pair(id3, id4); |
unsigned int h = id_hash(cat, id12, id34); |
struct id_entry *n = a->id_hash[h]; |
int len = strlen((char *) text); |
while (n && (n->id12 != id12 || n->id34 != id34 || n->cat != cat)) |
n = n->next; |
if (n) |
return 1; |
n = id_alloc(a, sizeof(struct id_entry) + len); |
n->id12 = id12; |
n->id34 = id34; |
n->cat = cat; |
memcpy(n->name, text, len + 1); |
n->next = a->id_hash[h]; |
a->id_hash[h] = n; |
return 0; |
} |
static int id_hex(byte * p, int cnt) |
{ |
int x = 0; |
while (cnt--) { |
x <<= 4; |
if (*p >= '0' && *p <= '9') |
x += (*p - '0'); |
else if (*p >= 'a' && *p <= 'f') |
x += (*p - 'a' + 10); |
else if (*p >= 'A' && *p <= 'F') |
x += (*p - 'A' + 10); |
else |
return -1; |
p++; |
} |
return x; |
} |
static inline int id_white_p(int c) |
{ |
return (c == ' ') || (c == '\t'); |
} |
static const char *id_parse_list(struct pci_access *a, int *lino) |
{ |
byte *line; |
byte *p; |
int id1 = 0, id2 = 0, id3 = 0, id4 = 0; |
int cat = -1; |
int nest; |
static const char parse_error[] = "Parse error"; |
int i; |
*lino = 0; |
for (i = 0; i < sizeof(pci_ids) / sizeof(char *); i++) { |
line = (byte *) pci_ids[i]; |
(*lino)++; |
p = line; |
while (*p) |
p++; |
if (p > line && (p[-1] == ' ' || p[-1] == '\t')) |
*--p = 0; |
p = line; |
while (id_white_p(*p)) |
p++; |
if (!*p || *p == '#') |
continue; |
p = line; |
while (*p == '\t') |
p++; |
nest = p - line; |
if (!nest) { /* Top-level entries */ |
if (p[0] == 'C' && p[1] == ' ') { /* Class block */ |
if ((id1 = id_hex(p + 2, 2)) < 0 || !id_white_p(p[4])) |
return parse_error; |
cat = ID_CLASS; |
p += 5; |
} else if (p[0] == 'S' && p[1] == ' ') { /* Generic subsystem block */ |
if ((id1 = id_hex(p + 2, 4)) < 0 || p[6]) |
return parse_error; |
if (!id_lookup(a, ID_VENDOR, id1, 0, 0, 0)) |
return "Vendor does not exist"; |
cat = ID_GEN_SUBSYSTEM; |
continue; |
} else if (p[0] >= 'A' && p[0] <= 'Z' && p[1] == ' ') { /* Unrecognized block (RFU) */ |
cat = ID_UNKNOWN; |
continue; |
} else { /* Vendor ID */ |
if ((id1 = id_hex(p, 4)) < 0 || !id_white_p(p[4])) |
return parse_error; |
cat = ID_VENDOR; |
p += 5; |
} |
id2 = id3 = id4 = 0; |
} else if (cat == ID_UNKNOWN) /* Nested entries in RFU blocks are skipped */ |
continue; |
else if (nest == 1) /* Nesting level 1 */ |
switch (cat) { |
case ID_VENDOR: |
case ID_DEVICE: |
case ID_SUBSYSTEM: |
if ((id2 = id_hex(p, 4)) < 0 || !id_white_p(p[4])) |
return parse_error; |
p += 5; |
cat = ID_DEVICE; |
id3 = id4 = 0; |
break; |
case ID_GEN_SUBSYSTEM: |
if ((id2 = id_hex(p, 4)) < 0 || !id_white_p(p[4])) |
return parse_error; |
p += 5; |
id3 = id4 = 0; |
break; |
case ID_CLASS: |
case ID_SUBCLASS: |
case ID_PROGIF: |
if ((id2 = id_hex(p, 2)) < 0 || !id_white_p(p[2])) |
return parse_error; |
p += 3; |
cat = ID_SUBCLASS; |
id3 = id4 = 0; |
break; |
default: |
return parse_error; |
} else if (nest == 2) /* Nesting level 2 */ |
switch (cat) { |
case ID_DEVICE: |
case ID_SUBSYSTEM: |
if ((id3 = id_hex(p, 4)) < 0 || !id_white_p(p[4]) |
|| (id4 = id_hex(p + 5, 4)) < 0 || !id_white_p(p[9])) |
return parse_error; |
p += 10; |
cat = ID_SUBSYSTEM; |
break; |
case ID_CLASS: |
case ID_SUBCLASS: |
case ID_PROGIF: |
if ((id3 = id_hex(p, 2)) < 0 || !id_white_p(p[2])) |
return parse_error; |
p += 3; |
cat = ID_PROGIF; |
id4 = 0; |
break; |
default: |
return parse_error; |
} else /* Nesting level 3 or more */ |
return parse_error; |
while (id_white_p(*p)) |
p++; |
if (!*p) |
return parse_error; |
if (id_insert(a, cat, id1, id2, id3, id4, p)) |
return "Duplicate entry"; |
} |
return NULL; |
} |
int pci_load_name_list(struct pci_access *a) |
{ |
int lino; |
const char *err; |
pci_free_name_list(a); |
a->id_hash = pci_malloc(a, sizeof(struct id_entry *) * HASH_SIZE); |
bzero(a->id_hash, sizeof(struct id_entry *) * HASH_SIZE); |
err = id_parse_list(a, &lino); |
if (err) |
a->error("%s at %s, element %d\n", err, "pci_ids.h", lino); |
return 1; |
} |
void pci_free_name_list(struct pci_access *a) |
{ |
pci_mfree(a->id_hash); |
a->id_hash = NULL; |
while (a->current_id_bucket) { |
struct id_bucket *buck = a->current_id_bucket; |
a->current_id_bucket = buck->next; |
pci_mfree(buck); |
} |
} |
static struct id_entry *id_lookup_subsys(struct pci_access *a, int iv, |
int id, int isv, int isd) |
{ |
struct id_entry *d = NULL; |
if (iv > 0 && id > 0) /* Per-device lookup */ |
d = id_lookup(a, ID_SUBSYSTEM, iv, id, isv, isd); |
if (!d) /* Generic lookup */ |
d = id_lookup(a, ID_GEN_SUBSYSTEM, isv, isd, 0, 0); |
if (!d && iv == isv && id == isd) /* Check for subsystem == device */ |
d = id_lookup(a, ID_DEVICE, iv, id, 0, 0); |
return d; |
} |
char *pci_lookup_name(struct pci_access *a, char *buf, int size, int flags, |
...) |
{ |
va_list args; |
int num, res, synth; |
struct id_entry *v, *d, *cls, *pif; |
int iv, id, isv, isd, icls, ipif; |
va_start(args, flags); |
num = 0; |
if ((flags & PCI_LOOKUP_NUMERIC) || a->numeric_ids) { |
flags &= ~PCI_LOOKUP_NUMERIC; |
num = 1; |
} else if (!a->id_hash) { |
if (!pci_load_name_list(a)) |
num = a->numeric_ids = 1; |
} |
if (flags & PCI_LOOKUP_NO_NUMBERS) { |
flags &= ~PCI_LOOKUP_NO_NUMBERS; |
synth = 0; |
if (num) |
return NULL; |
} else |
synth = 1; |
switch (flags) { |
case PCI_LOOKUP_VENDOR: |
iv = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x", iv); |
else if (v = id_lookup(a, ID_VENDOR, iv, 0, 0, 0)) |
return (char *) v->name; |
else |
res = snprintf(buf, size, "Unknown vendor %04x", iv); |
break; |
case PCI_LOOKUP_DEVICE: |
iv = va_arg(args, int); |
id = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x", id); |
else if (d = id_lookup(a, ID_DEVICE, iv, id, 0, 0)) |
return (char *) d->name; |
else if (synth) |
res = snprintf(buf, size, "Unknown device %04x", id); |
else |
return NULL; |
break; |
case PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE: |
iv = va_arg(args, int); |
id = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x:%04x", iv, id); |
else { |
v = id_lookup(a, ID_VENDOR, iv, 0, 0, 0); |
d = id_lookup(a, ID_DEVICE, iv, id, 0, 0); |
if (v && d) |
res = snprintf(buf, size, "%s %s", v->name, |
d->name); |
else if (!synth) |
return NULL; |
else if (!v) |
res = snprintf(buf, size, "Unknown device %04x:%04x", iv, id); |
else /* !d */ |
res = snprintf(buf, size, "%s Unknown device %04x", v->name, id); |
} |
break; |
case PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_VENDOR: |
isv = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x", isv); |
else if (v = id_lookup(a, ID_VENDOR, isv, 0, 0, 0)) |
return (char *) v->name; |
else if (synth) |
res = snprintf(buf, size, "Unknown vendor %04x", isv); |
else |
return NULL; |
break; |
case PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_DEVICE: |
iv = va_arg(args, int); |
id = va_arg(args, int); |
isv = va_arg(args, int); |
isd = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x", isd); |
else if (d = id_lookup_subsys(a, iv, id, isv, isd)) |
return (char *) d->name; |
else if (synth) |
res = snprintf(buf, size, "Unknown device %04x", isd); |
else |
return NULL; |
break; |
case PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE | PCI_LOOKUP_SUBSYSTEM: |
iv = va_arg(args, int); |
id = va_arg(args, int); |
isv = va_arg(args, int); |
isd = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x:%04x", isv, isd); |
else { |
v = id_lookup(a, ID_VENDOR, isv, 0, 0, 0); |
d = id_lookup_subsys(a, iv, id, isv, isd); |
if (v && d) |
res = snprintf(buf, size, "%s %s", v->name, d->name); |
else if (!synth) |
return NULL; |
else if (!v) |
res = snprintf(buf, size, "Unknown device %04x:%04x", isv, isd); |
else /* !d */ |
res = snprintf(buf, size, "%s Unknown device %04x", v->name, isd); |
} |
break; |
case PCI_LOOKUP_CLASS: |
icls = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x", icls); |
else if (cls = id_lookup(a, ID_SUBCLASS, icls >> 8, icls & 0xff, 0, 0)) |
return (char *) cls->name; |
else if (cls = id_lookup(a, ID_CLASS, icls, 0, 0, 0)) |
res = snprintf(buf, size, "%s [%04x]", cls->name, icls); |
else if (synth) |
res = snprintf(buf, size, "Class %04x", icls); |
else |
return NULL; |
break; |
case PCI_LOOKUP_PROGIF: |
icls = va_arg(args, int); |
ipif = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%02x", ipif); |
else if (pif = id_lookup(a, ID_PROGIF, icls >> 8, icls & 0xff, ipif, 0)) |
return (char *) pif->name; |
else if (icls == 0x0101 && !(ipif & 0x70)) { |
/* IDE controllers have complex prog-if semantics */ |
res = snprintf(buf, size, "%s%s%s%s%s", |
(ipif & 0x80) ? "Master " : "", |
(ipif & 0x08) ? "SecP " : "", |
(ipif & 0x04) ? "SecO " : "", |
(ipif & 0x02) ? "PriP " : "", |
(ipif & 0x01) ? "PriO " : ""); |
if (res > 0 && res < size) |
buf[--res] = 0; |
} else if (synth) |
res = snprintf(buf, size, "ProgIf %02x", ipif); |
else |
return NULL; |
break; |
default: |
return "<pci_lookup_name: invalid request>"; |
} |
if (res < 0 || res >= size) |
return "<pci_lookup_name: buffer too small>"; |
else |
return buf; |
} |
/tags/0.2.0/uspace/pci/libpci/types.h |
---|
0,0 → 1,49 |
/* |
* The PCI Library -- Types and Format Strings |
* |
* Copyright (c) 1997--2005 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#include <types.h> |
#ifndef PCI_HAVE_Uxx_TYPES |
typedef uint8_t u8; |
typedef uint16_t u16; |
typedef uint32_t u32; |
#ifdef PCI_HAVE_64BIT_ADDRESS |
#include <limits.h> |
#if ULONG_MAX > 0xffffffff |
typedef unsigned long u64; |
#define PCI_U64_FMT "l" |
#else |
typedef unsigned long long u64; |
#define PCI_U64_FMT "ll" |
#endif |
#endif |
#endif /* PCI_HAVE_Uxx_TYPES */ |
#ifdef PCI_HAVE_64BIT_ADDRESS |
typedef u64 pciaddr_t; |
#define PCIADDR_T_FMT "%08" PCI_U64_FMT "x" |
#define PCIADDR_PORT_FMT "%04" PCI_U64_FMT "x" |
#else |
typedef u32 pciaddr_t; |
#define PCIADDR_T_FMT "%08x" |
#define PCIADDR_PORT_FMT "%04x" |
#endif |
#ifdef PCI_ARCH_SPARC64 |
/* On sparc64 Linux the kernel reports remapped port addresses and IRQ numbers */ |
#undef PCIADDR_PORT_FMT |
#define PCIADDR_PORT_FMT PCIADDR_T_FMT |
#define PCIIRQ_FMT "%08x" |
#else |
#define PCIIRQ_FMT "%d" |
#endif |
/tags/0.2.0/uspace/pci/libpci/generic.c |
---|
0,0 → 1,206 |
/* |
* The PCI Library -- Generic Direct Access Functions |
* |
* Copyright (c) 1997--2000 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#include <string.h> |
#include "internal.h" |
void pci_generic_scan_bus(struct pci_access *a, byte * busmap, int bus) |
{ |
int dev, multi, ht; |
struct pci_dev *t; |
a->debug("Scanning bus %02x for devices...\n", bus); |
if (busmap[bus]) { |
a->warning("Bus %02x seen twice (firmware bug). Ignored.", |
bus); |
return; |
} |
busmap[bus] = 1; |
t = pci_alloc_dev(a); |
t->bus = bus; |
for (dev = 0; dev < 32; dev++) { |
t->dev = dev; |
multi = 0; |
for (t->func = 0; !t->func || multi && t->func < 8; |
t->func++) { |
u32 vd = pci_read_long(t, PCI_VENDOR_ID); |
struct pci_dev *d; |
if (!vd || vd == 0xffffffff) |
continue; |
ht = pci_read_byte(t, PCI_HEADER_TYPE); |
if (!t->func) |
multi = ht & 0x80; |
ht &= 0x7f; |
d = pci_alloc_dev(a); |
d->bus = t->bus; |
d->dev = t->dev; |
d->func = t->func; |
d->vendor_id = vd & 0xffff; |
d->device_id = vd >> 16U; |
d->known_fields = PCI_FILL_IDENT; |
d->hdrtype = ht; |
pci_link_dev(a, d); |
switch (ht) { |
case PCI_HEADER_TYPE_NORMAL: |
break; |
case PCI_HEADER_TYPE_BRIDGE: |
case PCI_HEADER_TYPE_CARDBUS: |
pci_generic_scan_bus(a, busmap, |
pci_read_byte(t, |
PCI_SECONDARY_BUS)); |
break; |
default: |
a->debug |
("Device %04x:%02x:%02x.%d has unknown header type %02x.\n", |
d->domain, d->bus, d->dev, d->func, |
ht); |
} |
} |
} |
pci_free_dev(t); |
} |
void pci_generic_scan(struct pci_access *a) |
{ |
byte busmap[256]; |
bzero(busmap, sizeof(busmap)); |
pci_generic_scan_bus(a, busmap, 0); |
} |
int pci_generic_fill_info(struct pci_dev *d, int flags) |
{ |
struct pci_access *a = d->access; |
if ((flags & (PCI_FILL_BASES | PCI_FILL_ROM_BASE)) |
&& d->hdrtype < 0) |
d->hdrtype = pci_read_byte(d, PCI_HEADER_TYPE) & 0x7f; |
if (flags & PCI_FILL_IDENT) { |
d->vendor_id = pci_read_word(d, PCI_VENDOR_ID); |
d->device_id = pci_read_word(d, PCI_DEVICE_ID); |
} |
if (flags & PCI_FILL_IRQ) |
d->irq = pci_read_byte(d, PCI_INTERRUPT_LINE); |
if (flags & PCI_FILL_BASES) { |
int cnt = 0, i; |
bzero(d->base_addr, sizeof(d->base_addr)); |
switch (d->hdrtype) { |
case PCI_HEADER_TYPE_NORMAL: |
cnt = 6; |
break; |
case PCI_HEADER_TYPE_BRIDGE: |
cnt = 2; |
break; |
case PCI_HEADER_TYPE_CARDBUS: |
cnt = 1; |
break; |
} |
if (cnt) { |
for (i = 0; i < cnt; i++) { |
u32 x = pci_read_long(d, PCI_BASE_ADDRESS_0 + i * 4); |
if (!x || x == (u32) ~ 0) |
continue; |
if ((x & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) |
d->base_addr[i] = x; |
else { |
if ((x & PCI_BASE_ADDRESS_MEM_TYPE_MASK) != PCI_BASE_ADDRESS_MEM_TYPE_64) |
d->base_addr[i] = x; |
else if (i >= cnt - 1) |
a->warning("%04x:%02x:%02x.%d: Invalid 64-bit address seen for BAR %d.", |
d->domain, d->bus, |
d->dev, d->func, i); |
else { |
u32 y = pci_read_long(d, PCI_BASE_ADDRESS_0 + (++i) * 4); |
#ifdef PCI_HAVE_64BIT_ADDRESS |
d->base_addr[i - 1] = x | (((pciaddr_t) y) << 32); |
#else |
if (y) |
a->warning("%04x:%02x:%02x.%d 64-bit device address ignored.", |
d->domain, |
d->bus, |
d->dev, |
d->func); |
else |
d->base_addr[i - 1] = x; |
#endif |
} |
} |
} |
} |
} |
if (flags & PCI_FILL_ROM_BASE) { |
int reg = 0; |
d->rom_base_addr = 0; |
switch (d->hdrtype) { |
case PCI_HEADER_TYPE_NORMAL: |
reg = PCI_ROM_ADDRESS; |
break; |
case PCI_HEADER_TYPE_BRIDGE: |
reg = PCI_ROM_ADDRESS1; |
break; |
} |
if (reg) { |
u32 u = pci_read_long(d, reg); |
if (u != 0xffffffff) |
d->rom_base_addr = u; |
} |
} |
return flags & ~PCI_FILL_SIZES; |
} |
static int |
pci_generic_block_op(struct pci_dev *d, int pos, byte * buf, int len, |
int (*r) (struct pci_dev * d, int pos, byte * buf, |
int len)) |
{ |
if ((pos & 1) && len >= 1) { |
if (!r(d, pos, buf, 1)) |
return 0; |
pos++; |
buf++; |
len--; |
} |
if ((pos & 3) && len >= 2) { |
if (!r(d, pos, buf, 2)) |
return 0; |
pos += 2; |
buf += 2; |
len -= 2; |
} |
while (len >= 4) { |
if (!r(d, pos, buf, 4)) |
return 0; |
pos += 4; |
buf += 4; |
len -= 4; |
} |
if (len >= 2) { |
if (!r(d, pos, buf, 2)) |
return 0; |
pos += 2; |
buf += 2; |
len -= 2; |
} |
if (len && !r(d, pos, buf, 1)) |
return 0; |
return 1; |
} |
int pci_generic_block_read(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
return pci_generic_block_op(d, pos, buf, len, d->access->methods->read); |
} |
int pci_generic_block_write(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
return pci_generic_block_op(d, pos, buf, len, d->access->methods->write); |
} |
/tags/0.2.0/uspace/pci/libpci/sysdep.h |
---|
0,0 → 1,26 |
/* |
* The PCI Library -- System-Dependent Stuff |
* |
* Copyright (c) 1997--2004 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#ifdef __GNUC__ |
#define UNUSED __attribute__((unused)) |
#define NONRET __attribute__((noreturn)) |
#else |
#define UNUSED |
#define NONRET |
#define inline |
#endif |
typedef u8 byte; |
typedef u16 word; |
#define cpu_to_le16(x) (x) |
#define cpu_to_le32(x) (x) |
#define le16_to_cpu(x) (x) |
#define le32_to_cpu(x) (x) |
/tags/0.2.0/uspace/pci/libpci/header.h |
---|
0,0 → 1,937 |
/* |
* The PCI Library -- PCI Header Structure (based on <linux/pci.h>) |
* |
* Copyright (c) 1997--2005 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
/* |
* Under PCI, each device has 256 bytes of configuration address space, |
* of which the first 64 bytes are standardized as follows: |
*/ |
#define PCI_VENDOR_ID 0x00 /* 16 bits */ |
#define PCI_DEVICE_ID 0x02 /* 16 bits */ |
#define PCI_COMMAND 0x04 /* 16 bits */ |
#define PCI_COMMAND_IO 0x1 /* Enable response in I/O space */ |
#define PCI_COMMAND_MEMORY 0x2 /* Enable response in Memory space */ |
#define PCI_COMMAND_MASTER 0x4 /* Enable bus mastering */ |
#define PCI_COMMAND_SPECIAL 0x8 /* Enable response to special cycles */ |
#define PCI_COMMAND_INVALIDATE 0x10 /* Use memory write and invalidate */ |
#define PCI_COMMAND_VGA_PALETTE 0x20 /* Enable palette snooping */ |
#define PCI_COMMAND_PARITY 0x40 /* Enable parity checking */ |
#define PCI_COMMAND_WAIT 0x80 /* Enable address/data stepping */ |
#define PCI_COMMAND_SERR 0x100 /* Enable SERR */ |
#define PCI_COMMAND_FAST_BACK 0x200 /* Enable back-to-back writes */ |
#define PCI_STATUS 0x06 /* 16 bits */ |
#define PCI_STATUS_CAP_LIST 0x10 /* Support Capability List */ |
#define PCI_STATUS_66MHZ 0x20 /* Support 66 Mhz PCI 2.1 bus */ |
#define PCI_STATUS_UDF 0x40 /* Support User Definable Features [obsolete] */ |
#define PCI_STATUS_FAST_BACK 0x80 /* Accept fast-back to back */ |
#define PCI_STATUS_PARITY 0x100 /* Detected parity error */ |
#define PCI_STATUS_DEVSEL_MASK 0x600 /* DEVSEL timing */ |
#define PCI_STATUS_DEVSEL_FAST 0x000 |
#define PCI_STATUS_DEVSEL_MEDIUM 0x200 |
#define PCI_STATUS_DEVSEL_SLOW 0x400 |
#define PCI_STATUS_SIG_TARGET_ABORT 0x800 /* Set on target abort */ |
#define PCI_STATUS_REC_TARGET_ABORT 0x1000 /* Master ack of " */ |
#define PCI_STATUS_REC_MASTER_ABORT 0x2000 /* Set on master abort */ |
#define PCI_STATUS_SIG_SYSTEM_ERROR 0x4000 /* Set when we drive SERR */ |
#define PCI_STATUS_DETECTED_PARITY 0x8000 /* Set on parity error */ |
#define PCI_CLASS_REVISION 0x08 /* High 24 bits are class, low 8 |
revision */ |
#define PCI_REVISION_ID 0x08 /* Revision ID */ |
#define PCI_CLASS_PROG 0x09 /* Reg. Level Programming Interface */ |
#define PCI_CLASS_DEVICE 0x0a /* Device class */ |
#define PCI_CACHE_LINE_SIZE 0x0c /* 8 bits */ |
#define PCI_LATENCY_TIMER 0x0d /* 8 bits */ |
#define PCI_HEADER_TYPE 0x0e /* 8 bits */ |
#define PCI_HEADER_TYPE_NORMAL 0 |
#define PCI_HEADER_TYPE_BRIDGE 1 |
#define PCI_HEADER_TYPE_CARDBUS 2 |
#define PCI_BIST 0x0f /* 8 bits */ |
#define PCI_BIST_CODE_MASK 0x0f /* Return result */ |
#define PCI_BIST_START 0x40 /* 1 to start BIST, 2 secs or less */ |
#define PCI_BIST_CAPABLE 0x80 /* 1 if BIST capable */ |
/* |
* Base addresses specify locations in memory or I/O space. |
* Decoded size can be determined by writing a value of |
* 0xffffffff to the register, and reading it back. Only |
* 1 bits are decoded. |
*/ |
#define PCI_BASE_ADDRESS_0 0x10 /* 32 bits */ |
#define PCI_BASE_ADDRESS_1 0x14 /* 32 bits [htype 0,1 only] */ |
#define PCI_BASE_ADDRESS_2 0x18 /* 32 bits [htype 0 only] */ |
#define PCI_BASE_ADDRESS_3 0x1c /* 32 bits */ |
#define PCI_BASE_ADDRESS_4 0x20 /* 32 bits */ |
#define PCI_BASE_ADDRESS_5 0x24 /* 32 bits */ |
#define PCI_BASE_ADDRESS_SPACE 0x01 /* 0 = memory, 1 = I/O */ |
#define PCI_BASE_ADDRESS_SPACE_IO 0x01 |
#define PCI_BASE_ADDRESS_SPACE_MEMORY 0x00 |
#define PCI_BASE_ADDRESS_MEM_TYPE_MASK 0x06 |
#define PCI_BASE_ADDRESS_MEM_TYPE_32 0x00 /* 32 bit address */ |
#define PCI_BASE_ADDRESS_MEM_TYPE_1M 0x02 /* Below 1M [obsolete] */ |
#define PCI_BASE_ADDRESS_MEM_TYPE_64 0x04 /* 64 bit address */ |
#define PCI_BASE_ADDRESS_MEM_PREFETCH 0x08 /* prefetchable? */ |
#define PCI_BASE_ADDRESS_MEM_MASK (~(pciaddr_t)0x0f) |
#define PCI_BASE_ADDRESS_IO_MASK (~(pciaddr_t)0x03) |
/* bit 1 is reserved if address_space = 1 */ |
/* Header type 0 (normal devices) */ |
#define PCI_CARDBUS_CIS 0x28 |
#define PCI_SUBSYSTEM_VENDOR_ID 0x2c |
#define PCI_SUBSYSTEM_ID 0x2e |
#define PCI_ROM_ADDRESS 0x30 /* Bits 31..11 are address, 10..1 reserved */ |
#define PCI_ROM_ADDRESS_ENABLE 0x01 |
#define PCI_ROM_ADDRESS_MASK (~(pciaddr_t)0x7ff) |
#define PCI_CAPABILITY_LIST 0x34 /* Offset of first capability list entry */ |
/* 0x35-0x3b are reserved */ |
#define PCI_INTERRUPT_LINE 0x3c /* 8 bits */ |
#define PCI_INTERRUPT_PIN 0x3d /* 8 bits */ |
#define PCI_MIN_GNT 0x3e /* 8 bits */ |
#define PCI_MAX_LAT 0x3f /* 8 bits */ |
/* Header type 1 (PCI-to-PCI bridges) */ |
#define PCI_PRIMARY_BUS 0x18 /* Primary bus number */ |
#define PCI_SECONDARY_BUS 0x19 /* Secondary bus number */ |
#define PCI_SUBORDINATE_BUS 0x1a /* Highest bus number behind the bridge */ |
#define PCI_SEC_LATENCY_TIMER 0x1b /* Latency timer for secondary interface */ |
#define PCI_IO_BASE 0x1c /* I/O range behind the bridge */ |
#define PCI_IO_LIMIT 0x1d |
#define PCI_IO_RANGE_TYPE_MASK 0x0f /* I/O bridging type */ |
#define PCI_IO_RANGE_TYPE_16 0x00 |
#define PCI_IO_RANGE_TYPE_32 0x01 |
#define PCI_IO_RANGE_MASK ~0x0f |
#define PCI_SEC_STATUS 0x1e /* Secondary status register */ |
#define PCI_MEMORY_BASE 0x20 /* Memory range behind */ |
#define PCI_MEMORY_LIMIT 0x22 |
#define PCI_MEMORY_RANGE_TYPE_MASK 0x0f |
#define PCI_MEMORY_RANGE_MASK ~0x0f |
#define PCI_PREF_MEMORY_BASE 0x24 /* Prefetchable memory range behind */ |
#define PCI_PREF_MEMORY_LIMIT 0x26 |
#define PCI_PREF_RANGE_TYPE_MASK 0x0f |
#define PCI_PREF_RANGE_TYPE_32 0x00 |
#define PCI_PREF_RANGE_TYPE_64 0x01 |
#define PCI_PREF_RANGE_MASK ~0x0f |
#define PCI_PREF_BASE_UPPER32 0x28 /* Upper half of prefetchable memory range */ |
#define PCI_PREF_LIMIT_UPPER32 0x2c |
#define PCI_IO_BASE_UPPER16 0x30 /* Upper half of I/O addresses */ |
#define PCI_IO_LIMIT_UPPER16 0x32 |
/* 0x34 same as for htype 0 */ |
/* 0x35-0x3b is reserved */ |
#define PCI_ROM_ADDRESS1 0x38 /* Same as PCI_ROM_ADDRESS, but for htype 1 */ |
/* 0x3c-0x3d are same as for htype 0 */ |
#define PCI_BRIDGE_CONTROL 0x3e |
#define PCI_BRIDGE_CTL_PARITY 0x01 /* Enable parity detection on secondary interface */ |
#define PCI_BRIDGE_CTL_SERR 0x02 /* The same for SERR forwarding */ |
#define PCI_BRIDGE_CTL_NO_ISA 0x04 /* Disable bridging of ISA ports */ |
#define PCI_BRIDGE_CTL_VGA 0x08 /* Forward VGA addresses */ |
#define PCI_BRIDGE_CTL_MASTER_ABORT 0x20 /* Report master aborts */ |
#define PCI_BRIDGE_CTL_BUS_RESET 0x40 /* Secondary bus reset */ |
#define PCI_BRIDGE_CTL_FAST_BACK 0x80 /* Fast Back2Back enabled on secondary interface */ |
/* Header type 2 (CardBus bridges) */ |
/* 0x14-0x15 reserved */ |
#define PCI_CB_SEC_STATUS 0x16 /* Secondary status */ |
#define PCI_CB_PRIMARY_BUS 0x18 /* PCI bus number */ |
#define PCI_CB_CARD_BUS 0x19 /* CardBus bus number */ |
#define PCI_CB_SUBORDINATE_BUS 0x1a /* Subordinate bus number */ |
#define PCI_CB_LATENCY_TIMER 0x1b /* CardBus latency timer */ |
#define PCI_CB_MEMORY_BASE_0 0x1c |
#define PCI_CB_MEMORY_LIMIT_0 0x20 |
#define PCI_CB_MEMORY_BASE_1 0x24 |
#define PCI_CB_MEMORY_LIMIT_1 0x28 |
#define PCI_CB_IO_BASE_0 0x2c |
#define PCI_CB_IO_BASE_0_HI 0x2e |
#define PCI_CB_IO_LIMIT_0 0x30 |
#define PCI_CB_IO_LIMIT_0_HI 0x32 |
#define PCI_CB_IO_BASE_1 0x34 |
#define PCI_CB_IO_BASE_1_HI 0x36 |
#define PCI_CB_IO_LIMIT_1 0x38 |
#define PCI_CB_IO_LIMIT_1_HI 0x3a |
#define PCI_CB_IO_RANGE_MASK ~0x03 |
/* 0x3c-0x3d are same as for htype 0 */ |
#define PCI_CB_BRIDGE_CONTROL 0x3e |
#define PCI_CB_BRIDGE_CTL_PARITY 0x01 /* Similar to standard bridge control register */ |
#define PCI_CB_BRIDGE_CTL_SERR 0x02 |
#define PCI_CB_BRIDGE_CTL_ISA 0x04 |
#define PCI_CB_BRIDGE_CTL_VGA 0x08 |
#define PCI_CB_BRIDGE_CTL_MASTER_ABORT 0x20 |
#define PCI_CB_BRIDGE_CTL_CB_RESET 0x40 /* CardBus reset */ |
#define PCI_CB_BRIDGE_CTL_16BIT_INT 0x80 /* Enable interrupt for 16-bit cards */ |
#define PCI_CB_BRIDGE_CTL_PREFETCH_MEM0 0x100 /* Prefetch enable for both memory regions */ |
#define PCI_CB_BRIDGE_CTL_PREFETCH_MEM1 0x200 |
#define PCI_CB_BRIDGE_CTL_POST_WRITES 0x400 |
#define PCI_CB_SUBSYSTEM_VENDOR_ID 0x40 |
#define PCI_CB_SUBSYSTEM_ID 0x42 |
#define PCI_CB_LEGACY_MODE_BASE 0x44 /* 16-bit PC Card legacy mode base address (ExCa) */ |
/* 0x48-0x7f reserved */ |
/* Capability lists */ |
#define PCI_CAP_LIST_ID 0 /* Capability ID */ |
#define PCI_CAP_ID_PM 0x01 /* Power Management */ |
#define PCI_CAP_ID_AGP 0x02 /* Accelerated Graphics Port */ |
#define PCI_CAP_ID_VPD 0x03 /* Vital Product Data */ |
#define PCI_CAP_ID_SLOTID 0x04 /* Slot Identification */ |
#define PCI_CAP_ID_MSI 0x05 /* Message Signalled Interrupts */ |
#define PCI_CAP_ID_CHSWP 0x06 /* CompactPCI HotSwap */ |
#define PCI_CAP_ID_PCIX 0x07 /* PCI-X */ |
#define PCI_CAP_ID_HT 0x08 /* HyperTransport */ |
#define PCI_CAP_ID_VNDR 0x09 /* Vendor specific */ |
#define PCI_CAP_ID_DBG 0x0A /* Debug port */ |
#define PCI_CAP_ID_CCRC 0x0B /* CompactPCI Central Resource Control */ |
#define PCI_CAP_ID_AGP3 0x0E /* AGP 8x */ |
#define PCI_CAP_ID_EXP 0x10 /* PCI Express */ |
#define PCI_CAP_ID_MSIX 0x11 /* MSI-X */ |
#define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */ |
#define PCI_CAP_FLAGS 2 /* Capability defined flags (16 bits) */ |
#define PCI_CAP_SIZEOF 4 |
/* Capabilities residing in the PCI Express extended configuration space */ |
#define PCI_EXT_CAP_ID_AER 0x01 /* Advanced Error Reporting */ |
#define PCI_EXT_CAP_ID_VC 0x02 /* Virtual Channel */ |
#define PCI_EXT_CAP_ID_DSN 0x03 /* Device Serial Number */ |
#define PCI_EXT_CAP_ID_PB 0x04 /* Power Budgeting */ |
/* Power Management Registers */ |
#define PCI_PM_CAP_VER_MASK 0x0007 /* Version (2=PM1.1) */ |
#define PCI_PM_CAP_PME_CLOCK 0x0008 /* Clock required for PME generation */ |
#define PCI_PM_CAP_DSI 0x0020 /* Device specific initialization required */ |
#define PCI_PM_CAP_AUX_C_MASK 0x01c0 /* Maximum aux current required in D3cold */ |
#define PCI_PM_CAP_D1 0x0200 /* D1 power state support */ |
#define PCI_PM_CAP_D2 0x0400 /* D2 power state support */ |
#define PCI_PM_CAP_PME_D0 0x0800 /* PME can be asserted from D0 */ |
#define PCI_PM_CAP_PME_D1 0x1000 /* PME can be asserted from D1 */ |
#define PCI_PM_CAP_PME_D2 0x2000 /* PME can be asserted from D2 */ |
#define PCI_PM_CAP_PME_D3_HOT 0x4000 /* PME can be asserted from D3hot */ |
#define PCI_PM_CAP_PME_D3_COLD 0x8000 /* PME can be asserted from D3cold */ |
#define PCI_PM_CTRL 4 /* PM control and status register */ |
#define PCI_PM_CTRL_STATE_MASK 0x0003 /* Current power state (D0 to D3) */ |
#define PCI_PM_CTRL_PME_ENABLE 0x0100 /* PME pin enable */ |
#define PCI_PM_CTRL_DATA_SEL_MASK 0x1e00 /* PM table data index */ |
#define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000 /* PM table data scaling factor */ |
#define PCI_PM_CTRL_PME_STATUS 0x8000 /* PME pin status */ |
#define PCI_PM_PPB_EXTENSIONS 6 /* PPB support extensions */ |
#define PCI_PM_PPB_B2_B3 0x40 /* If bridge enters D3hot, bus enters: 0=B3, 1=B2 */ |
#define PCI_PM_BPCC_ENABLE 0x80 /* Secondary bus is power managed */ |
#define PCI_PM_DATA_REGISTER 7 /* PM table contents read here */ |
#define PCI_PM_SIZEOF 8 |
/* AGP registers */ |
#define PCI_AGP_VERSION 2 /* BCD version number */ |
#define PCI_AGP_RFU 3 /* Rest of capability flags */ |
#define PCI_AGP_STATUS 4 /* Status register */ |
#define PCI_AGP_STATUS_RQ_MASK 0xff000000 /* Maximum number of requests - 1 */ |
#define PCI_AGP_STATUS_ISOCH 0x10000 /* Isochronous transactions supported */ |
#define PCI_AGP_STATUS_ARQSZ_MASK 0xe000 /* log2(optimum async req size in bytes) - 4 */ |
#define PCI_AGP_STATUS_CAL_MASK 0x1c00 /* Calibration cycle timing */ |
#define PCI_AGP_STATUS_SBA 0x0200 /* Sideband addressing supported */ |
#define PCI_AGP_STATUS_ITA_COH 0x0100 /* In-aperture accesses always coherent */ |
#define PCI_AGP_STATUS_GART64 0x0080 /* 64-bit GART entries supported */ |
#define PCI_AGP_STATUS_HTRANS 0x0040 /* If 0, core logic can xlate host CPU accesses thru aperture */ |
#define PCI_AGP_STATUS_64BIT 0x0020 /* 64-bit addressing cycles supported */ |
#define PCI_AGP_STATUS_FW 0x0010 /* Fast write transfers supported */ |
#define PCI_AGP_STATUS_AGP3 0x0008 /* AGP3 mode supported */ |
#define PCI_AGP_STATUS_RATE4 0x0004 /* 4x transfer rate supported (RFU in AGP3 mode) */ |
#define PCI_AGP_STATUS_RATE2 0x0002 /* 2x transfer rate supported (8x in AGP3 mode) */ |
#define PCI_AGP_STATUS_RATE1 0x0001 /* 1x transfer rate supported (4x in AGP3 mode) */ |
#define PCI_AGP_COMMAND 8 /* Control register */ |
#define PCI_AGP_COMMAND_RQ_MASK 0xff000000 /* Master: Maximum number of requests */ |
#define PCI_AGP_COMMAND_ARQSZ_MASK 0xe000 /* log2(optimum async req size in bytes) - 4 */ |
#define PCI_AGP_COMMAND_CAL_MASK 0x1c00 /* Calibration cycle timing */ |
#define PCI_AGP_COMMAND_SBA 0x0200 /* Sideband addressing enabled */ |
#define PCI_AGP_COMMAND_AGP 0x0100 /* Allow processing of AGP transactions */ |
#define PCI_AGP_COMMAND_GART64 0x0080 /* 64-bit GART entries enabled */ |
#define PCI_AGP_COMMAND_64BIT 0x0020 /* Allow generation of 64-bit addr cycles */ |
#define PCI_AGP_COMMAND_FW 0x0010 /* Enable FW transfers */ |
#define PCI_AGP_COMMAND_RATE4 0x0004 /* Use 4x rate (RFU in AGP3 mode) */ |
#define PCI_AGP_COMMAND_RATE2 0x0002 /* Use 2x rate (8x in AGP3 mode) */ |
#define PCI_AGP_COMMAND_RATE1 0x0001 /* Use 1x rate (4x in AGP3 mode) */ |
#define PCI_AGP_SIZEOF 12 |
/* Slot Identification */ |
#define PCI_SID_ESR 2 /* Expansion Slot Register */ |
#define PCI_SID_ESR_NSLOTS 0x1f /* Number of expansion slots available */ |
#define PCI_SID_ESR_FIC 0x20 /* First In Chassis Flag */ |
#define PCI_SID_CHASSIS_NR 3 /* Chassis Number */ |
/* Message Signalled Interrupts registers */ |
#define PCI_MSI_FLAGS 2 /* Various flags */ |
#define PCI_MSI_FLAGS_64BIT 0x80 /* 64-bit addresses allowed */ |
#define PCI_MSI_FLAGS_QSIZE 0x70 /* Message queue size configured */ |
#define PCI_MSI_FLAGS_QMASK 0x0e /* Maximum queue size available */ |
#define PCI_MSI_FLAGS_ENABLE 0x01 /* MSI feature enabled */ |
#define PCI_MSI_RFU 3 /* Rest of capability flags */ |
#define PCI_MSI_ADDRESS_LO 4 /* Lower 32 bits */ |
#define PCI_MSI_ADDRESS_HI 8 /* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */ |
#define PCI_MSI_DATA_32 8 /* 16 bits of data for 32-bit devices */ |
#define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */ |
/* PCI-X */ |
#define PCI_PCIX_COMMAND 2 /* Command register offset */ |
#define PCI_PCIX_COMMAND_DPERE 0x0001 /* Data Parity Error Recover Enable */ |
#define PCI_PCIX_COMMAND_ERO 0x0002 /* Enable Relaxed Ordering */ |
#define PCI_PCIX_COMMAND_MAX_MEM_READ_BYTE_COUNT 0x000c /* Maximum Memory Read Byte Count */ |
#define PCI_PCIX_COMMAND_MAX_OUTSTANDING_SPLIT_TRANS 0x0070 |
#define PCI_PCIX_COMMAND_RESERVED 0xf80 |
#define PCI_PCIX_STATUS 4 /* Status register offset */ |
#define PCI_PCIX_STATUS_FUNCTION 0x00000007 |
#define PCI_PCIX_STATUS_DEVICE 0x000000f8 |
#define PCI_PCIX_STATUS_BUS 0x0000ff00 |
#define PCI_PCIX_STATUS_64BIT 0x00010000 |
#define PCI_PCIX_STATUS_133MHZ 0x00020000 |
#define PCI_PCIX_STATUS_SC_DISCARDED 0x00040000 /* Split Completion Discarded */ |
#define PCI_PCIX_STATUS_UNEXPECTED_SC 0x00080000 /* Unexpected Split Completion */ |
#define PCI_PCIX_STATUS_DEVICE_COMPLEXITY 0x00100000 /* 0 = simple device, 1 = bridge device */ |
#define PCI_PCIX_STATUS_DESIGNED_MAX_MEM_READ_BYTE_COUNT 0x00600000 /* 0 = 512 bytes, 1 = 1024, 2 = 2048, 3 = 4096 */ |
#define PCI_PCIX_STATUS_DESIGNED_MAX_OUTSTANDING_SPLIT_TRANS 0x03800000 |
#define PCI_PCIX_STATUS_DESIGNED_MAX_CUMULATIVE_READ_SIZE 0x1c000000 |
#define PCI_PCIX_STATUS_RCVD_SC_ERR_MESS 0x20000000 /* Received Split Completion Error Message */ |
#define PCI_PCIX_STATUS_266MHZ 0x40000000 /* 266 MHz capable */ |
#define PCI_PCIX_STATUS_533MHZ 0x80000000 /* 533 MHz capable */ |
#define PCI_PCIX_SIZEOF 4 |
/* PCI-X Bridges */ |
#define PCI_PCIX_BRIDGE_SEC_STATUS 2 /* Secondary bus status register offset */ |
#define PCI_PCIX_BRIDGE_SEC_STATUS_64BIT 0x0001 |
#define PCI_PCIX_BRIDGE_SEC_STATUS_133MHZ 0x0002 |
#define PCI_PCIX_BRIDGE_SEC_STATUS_SC_DISCARDED 0x0004 /* Split Completion Discarded on secondary bus */ |
#define PCI_PCIX_BRIDGE_SEC_STATUS_UNEXPECTED_SC 0x0008 /* Unexpected Split Completion on secondary bus */ |
#define PCI_PCIX_BRIDGE_SEC_STATUS_SC_OVERRUN 0x0010 /* Split Completion Overrun on secondary bus */ |
#define PCI_PCIX_BRIDGE_SEC_STATUS_SPLIT_REQUEST_DELAYED 0x0020 |
#define PCI_PCIX_BRIDGE_SEC_STATUS_CLOCK_FREQ 0x01c0 |
#define PCI_PCIX_BRIDGE_SEC_STATUS_RESERVED 0xfe00 |
#define PCI_PCIX_BRIDGE_STATUS 4 /* Primary bus status register offset */ |
#define PCI_PCIX_BRIDGE_STATUS_FUNCTION 0x00000007 |
#define PCI_PCIX_BRIDGE_STATUS_DEVICE 0x000000f8 |
#define PCI_PCIX_BRIDGE_STATUS_BUS 0x0000ff00 |
#define PCI_PCIX_BRIDGE_STATUS_64BIT 0x00010000 |
#define PCI_PCIX_BRIDGE_STATUS_133MHZ 0x00020000 |
#define PCI_PCIX_BRIDGE_STATUS_SC_DISCARDED 0x00040000 /* Split Completion Discarded */ |
#define PCI_PCIX_BRIDGE_STATUS_UNEXPECTED_SC 0x00080000 /* Unexpected Split Completion */ |
#define PCI_PCIX_BRIDGE_STATUS_SC_OVERRUN 0x00100000 /* Split Completion Overrun */ |
#define PCI_PCIX_BRIDGE_STATUS_SPLIT_REQUEST_DELAYED 0x00200000 |
#define PCI_PCIX_BRIDGE_STATUS_RESERVED 0xffc00000 |
#define PCI_PCIX_BRIDGE_UPSTREAM_SPLIT_TRANS_CTRL 8 /* Upstream Split Transaction Register offset */ |
#define PCI_PCIX_BRIDGE_DOWNSTREAM_SPLIT_TRANS_CTRL 12 /* Downstream Split Transaction Register offset */ |
#define PCI_PCIX_BRIDGE_STR_CAPACITY 0x0000ffff |
#define PCI_PCIX_BRIDGE_STR_COMMITMENT_LIMIT 0xffff0000 |
#define PCI_PCIX_BRIDGE_SIZEOF 12 |
/* HyperTransport (as of spec rev. 2.00) */ |
#define PCI_HT_CMD 2 /* Command Register */ |
#define PCI_HT_CMD_TYP_HI 0xe000 /* Capability Type high part */ |
#define PCI_HT_CMD_TYP_HI_PRI 0x0000 /* Slave or Primary Interface */ |
#define PCI_HT_CMD_TYP_HI_SEC 0x2000 /* Host or Secondary Interface */ |
#define PCI_HT_CMD_TYP 0xf800 /* Capability Type */ |
#define PCI_HT_CMD_TYP_SW 0x4000 /* Switch */ |
#define PCI_HT_CMD_TYP_IDC 0x8000 /* Interrupt Discovery and Configuration */ |
#define PCI_HT_CMD_TYP_RID 0x8800 /* Revision ID */ |
#define PCI_HT_CMD_TYP_UIDC 0x9000 /* UnitID Clumping */ |
#define PCI_HT_CMD_TYP_ECSA 0x9800 /* Extended Configuration Space Access */ |
#define PCI_HT_CMD_TYP_AM 0xa000 /* Address Mapping */ |
#define PCI_HT_CMD_TYP_MSIM 0xa800 /* MSI Mapping */ |
#define PCI_HT_CMD_TYP_DR 0xb000 /* DirectRoute */ |
#define PCI_HT_CMD_TYP_VCS 0xb800 /* VCSet */ |
#define PCI_HT_CMD_TYP_RM 0xc000 /* Retry Mode */ |
#define PCI_HT_CMD_TYP_X86 0xc800 /* X86 (reserved) */ |
/* Link Control Register */ |
#define PCI_HT_LCTR_CFLE 0x0002 /* CRC Flood Enable */ |
#define PCI_HT_LCTR_CST 0x0004 /* CRC Start Test */ |
#define PCI_HT_LCTR_CFE 0x0008 /* CRC Force Error */ |
#define PCI_HT_LCTR_LKFAIL 0x0010 /* Link Failure */ |
#define PCI_HT_LCTR_INIT 0x0020 /* Initialization Complete */ |
#define PCI_HT_LCTR_EOC 0x0040 /* End of Chain */ |
#define PCI_HT_LCTR_TXO 0x0080 /* Transmitter Off */ |
#define PCI_HT_LCTR_CRCERR 0x0f00 /* CRC Error */ |
#define PCI_HT_LCTR_ISOCEN 0x1000 /* Isochronous Flow Control Enable */ |
#define PCI_HT_LCTR_LSEN 0x2000 /* LDTSTOP# Tristate Enable */ |
#define PCI_HT_LCTR_EXTCTL 0x4000 /* Extended CTL Time */ |
#define PCI_HT_LCTR_64B 0x8000 /* 64-bit Addressing Enable */ |
/* Link Configuration Register */ |
#define PCI_HT_LCNF_MLWI 0x0007 /* Max Link Width In */ |
#define PCI_HT_LCNF_LW_8B 0x0 /* Link Width 8 bits */ |
#define PCI_HT_LCNF_LW_16B 0x1 /* Link Width 16 bits */ |
#define PCI_HT_LCNF_LW_32B 0x3 /* Link Width 32 bits */ |
#define PCI_HT_LCNF_LW_2B 0x4 /* Link Width 2 bits */ |
#define PCI_HT_LCNF_LW_4B 0x5 /* Link Width 4 bits */ |
#define PCI_HT_LCNF_LW_NC 0x7 /* Link physically not connected */ |
#define PCI_HT_LCNF_DFI 0x0008 /* Doubleword Flow Control In */ |
#define PCI_HT_LCNF_MLWO 0x0070 /* Max Link Width Out */ |
#define PCI_HT_LCNF_DFO 0x0080 /* Doubleword Flow Control Out */ |
#define PCI_HT_LCNF_LWI 0x0700 /* Link Width In */ |
#define PCI_HT_LCNF_DFIE 0x0800 /* Doubleword Flow Control In Enable */ |
#define PCI_HT_LCNF_LWO 0x7000 /* Link Width Out */ |
#define PCI_HT_LCNF_DFOE 0x8000 /* Doubleword Flow Control Out Enable */ |
/* Revision ID Register */ |
#define PCI_HT_RID_MIN 0x1f /* Minor Revision */ |
#define PCI_HT_RID_MAJ 0xe0 /* Major Revision */ |
/* Link Frequency/Error Register */ |
#define PCI_HT_LFRER_FREQ 0x0f /* Transmitter Clock Frequency */ |
#define PCI_HT_LFRER_200 0x00 /* 200MHz */ |
#define PCI_HT_LFRER_300 0x01 /* 300MHz */ |
#define PCI_HT_LFRER_400 0x02 /* 400MHz */ |
#define PCI_HT_LFRER_500 0x03 /* 500MHz */ |
#define PCI_HT_LFRER_600 0x04 /* 600MHz */ |
#define PCI_HT_LFRER_800 0x05 /* 800MHz */ |
#define PCI_HT_LFRER_1000 0x06 /* 1.0GHz */ |
#define PCI_HT_LFRER_1200 0x07 /* 1.2GHz */ |
#define PCI_HT_LFRER_1400 0x08 /* 1.4GHz */ |
#define PCI_HT_LFRER_1600 0x09 /* 1.6GHz */ |
#define PCI_HT_LFRER_VEND 0x0f /* Vendor-Specific */ |
#define PCI_HT_LFRER_ERR 0xf0 /* Link Error */ |
#define PCI_HT_LFRER_PROT 0x10 /* Protocol Error */ |
#define PCI_HT_LFRER_OV 0x20 /* Overflow Error */ |
#define PCI_HT_LFRER_EOC 0x40 /* End of Chain Error */ |
#define PCI_HT_LFRER_CTLT 0x80 /* CTL Timeout */ |
/* Link Frequency Capability Register */ |
#define PCI_HT_LFCAP_200 0x0001 /* 200MHz */ |
#define PCI_HT_LFCAP_300 0x0002 /* 300MHz */ |
#define PCI_HT_LFCAP_400 0x0004 /* 400MHz */ |
#define PCI_HT_LFCAP_500 0x0008 /* 500MHz */ |
#define PCI_HT_LFCAP_600 0x0010 /* 600MHz */ |
#define PCI_HT_LFCAP_800 0x0020 /* 800MHz */ |
#define PCI_HT_LFCAP_1000 0x0040 /* 1.0GHz */ |
#define PCI_HT_LFCAP_1200 0x0080 /* 1.2GHz */ |
#define PCI_HT_LFCAP_1400 0x0100 /* 1.4GHz */ |
#define PCI_HT_LFCAP_1600 0x0200 /* 1.6GHz */ |
#define PCI_HT_LFCAP_VEND 0x8000 /* Vendor-Specific */ |
/* Feature Register */ |
#define PCI_HT_FTR_ISOCFC 0x0001 /* Isochronous Flow Control Mode */ |
#define PCI_HT_FTR_LDTSTOP 0x0002 /* LDTSTOP# Supported */ |
#define PCI_HT_FTR_CRCTM 0x0004 /* CRC Test Mode */ |
#define PCI_HT_FTR_ECTLT 0x0008 /* Extended CTL Time Required */ |
#define PCI_HT_FTR_64BA 0x0010 /* 64-bit Addressing */ |
#define PCI_HT_FTR_UIDRD 0x0020 /* UnitID Reorder Disable */ |
/* Error Handling Register */ |
#define PCI_HT_EH_PFLE 0x0001 /* Protocol Error Flood Enable */ |
#define PCI_HT_EH_OFLE 0x0002 /* Overflow Error Flood Enable */ |
#define PCI_HT_EH_PFE 0x0004 /* Protocol Error Fatal Enable */ |
#define PCI_HT_EH_OFE 0x0008 /* Overflow Error Fatal Enable */ |
#define PCI_HT_EH_EOCFE 0x0010 /* End of Chain Error Fatal Enable */ |
#define PCI_HT_EH_RFE 0x0020 /* Response Error Fatal Enable */ |
#define PCI_HT_EH_CRCFE 0x0040 /* CRC Error Fatal Enable */ |
#define PCI_HT_EH_SERRFE 0x0080 /* System Error Fatal Enable (B */ |
#define PCI_HT_EH_CF 0x0100 /* Chain Fail */ |
#define PCI_HT_EH_RE 0x0200 /* Response Error */ |
#define PCI_HT_EH_PNFE 0x0400 /* Protocol Error Nonfatal Enable */ |
#define PCI_HT_EH_ONFE 0x0800 /* Overflow Error Nonfatal Enable */ |
#define PCI_HT_EH_EOCNFE 0x1000 /* End of Chain Error Nonfatal Enable */ |
#define PCI_HT_EH_RNFE 0x2000 /* Response Error Nonfatal Enable */ |
#define PCI_HT_EH_CRCNFE 0x4000 /* CRC Error Nonfatal Enable */ |
#define PCI_HT_EH_SERRNFE 0x8000 /* System Error Nonfatal Enable */ |
/* HyperTransport: Slave or Primary Interface */ |
#define PCI_HT_PRI_CMD 2 /* Command Register */ |
#define PCI_HT_PRI_CMD_BUID 0x001f /* Base UnitID */ |
#define PCI_HT_PRI_CMD_UC 0x03e0 /* Unit Count */ |
#define PCI_HT_PRI_CMD_MH 0x0400 /* Master Host */ |
#define PCI_HT_PRI_CMD_DD 0x0800 /* Default Direction */ |
#define PCI_HT_PRI_CMD_DUL 0x1000 /* Drop on Uninitialized Link */ |
#define PCI_HT_PRI_LCTR0 4 /* Link Control 0 Register */ |
#define PCI_HT_PRI_LCNF0 6 /* Link Config 0 Register */ |
#define PCI_HT_PRI_LCTR1 8 /* Link Control 1 Register */ |
#define PCI_HT_PRI_LCNF1 10 /* Link Config 1 Register */ |
#define PCI_HT_PRI_RID 12 /* Revision ID Register */ |
#define PCI_HT_PRI_LFRER0 13 /* Link Frequency/Error 0 Register */ |
#define PCI_HT_PRI_LFCAP0 14 /* Link Frequency Capability 0 Register */ |
#define PCI_HT_PRI_FTR 16 /* Feature Register */ |
#define PCI_HT_PRI_LFRER1 17 /* Link Frequency/Error 1 Register */ |
#define PCI_HT_PRI_LFCAP1 18 /* Link Frequency Capability 1 Register */ |
#define PCI_HT_PRI_ES 20 /* Enumeration Scratchpad Register */ |
#define PCI_HT_PRI_EH 22 /* Error Handling Register */ |
#define PCI_HT_PRI_MBU 24 /* Memory Base Upper Register */ |
#define PCI_HT_PRI_MLU 25 /* Memory Limit Upper Register */ |
#define PCI_HT_PRI_BN 26 /* Bus Number Register */ |
#define PCI_HT_PRI_SIZEOF 28 |
/* HyperTransport: Host or Secondary Interface */ |
#define PCI_HT_SEC_CMD 2 /* Command Register */ |
#define PCI_HT_SEC_CMD_WR 0x0001 /* Warm Reset */ |
#define PCI_HT_SEC_CMD_DE 0x0002 /* Double-Ended */ |
#define PCI_HT_SEC_CMD_DN 0x0076 /* Device Number */ |
#define PCI_HT_SEC_CMD_CS 0x0080 /* Chain Side */ |
#define PCI_HT_SEC_CMD_HH 0x0100 /* Host Hide */ |
#define PCI_HT_SEC_CMD_AS 0x0400 /* Act as Slave */ |
#define PCI_HT_SEC_CMD_HIECE 0x0800 /* Host Inbound End of Chain Error */ |
#define PCI_HT_SEC_CMD_DUL 0x1000 /* Drop on Uninitialized Link */ |
#define PCI_HT_SEC_LCTR 4 /* Link Control Register */ |
#define PCI_HT_SEC_LCNF 6 /* Link Config Register */ |
#define PCI_HT_SEC_RID 8 /* Revision ID Register */ |
#define PCI_HT_SEC_LFRER 9 /* Link Frequency/Error Register */ |
#define PCI_HT_SEC_LFCAP 10 /* Link Frequency Capability Register */ |
#define PCI_HT_SEC_FTR 12 /* Feature Register */ |
#define PCI_HT_SEC_FTR_EXTRS 0x0100 /* Extended Register Set */ |
#define PCI_HT_SEC_FTR_UCNFE 0x0200 /* Upstream Configuration Enable */ |
#define PCI_HT_SEC_ES 16 /* Enumeration Scratchpad Register */ |
#define PCI_HT_SEC_EH 18 /* Error Handling Register */ |
#define PCI_HT_SEC_MBU 20 /* Memory Base Upper Register */ |
#define PCI_HT_SEC_MLU 21 /* Memory Limit Upper Register */ |
#define PCI_HT_SEC_SIZEOF 24 |
/* HyperTransport: Switch */ |
#define PCI_HT_SW_CMD 2 /* Switch Command Register */ |
#define PCI_HT_SW_CMD_VIBERR 0x0080 /* VIB Error */ |
#define PCI_HT_SW_CMD_VIBFL 0x0100 /* VIB Flood */ |
#define PCI_HT_SW_CMD_VIBFT 0x0200 /* VIB Fatal */ |
#define PCI_HT_SW_CMD_VIBNFT 0x0400 /* VIB Nonfatal */ |
#define PCI_HT_SW_PMASK 4 /* Partition Mask Register */ |
#define PCI_HT_SW_SWINF 8 /* Switch Info Register */ |
#define PCI_HT_SW_SWINF_DP 0x0000001f /* Default Port */ |
#define PCI_HT_SW_SWINF_EN 0x00000020 /* Enable Decode */ |
#define PCI_HT_SW_SWINF_CR 0x00000040 /* Cold Reset */ |
#define PCI_HT_SW_SWINF_PCIDX 0x00000f00 /* Performance Counter Index */ |
#define PCI_HT_SW_SWINF_BLRIDX 0x0003f000 /* Base/Limit Range Index */ |
#define PCI_HT_SW_SWINF_SBIDX 0x00002000 /* Secondary Base Range Index */ |
#define PCI_HT_SW_SWINF_HP 0x00040000 /* Hot Plug */ |
#define PCI_HT_SW_SWINF_HIDE 0x00080000 /* Hide Port */ |
#define PCI_HT_SW_PCD 12 /* Performance Counter Data Register */ |
#define PCI_HT_SW_BLRD 16 /* Base/Limit Range Data Register */ |
#define PCI_HT_SW_SBD 20 /* Secondary Base Data Register */ |
#define PCI_HT_SW_SIZEOF 24 |
/* Counter indices */ |
#define PCI_HT_SW_PC_PCR 0x0 /* Posted Command Receive */ |
#define PCI_HT_SW_PC_NPCR 0x1 /* Nonposted Command Receive */ |
#define PCI_HT_SW_PC_RCR 0x2 /* Response Command Receive */ |
#define PCI_HT_SW_PC_PDWR 0x3 /* Posted DW Receive */ |
#define PCI_HT_SW_PC_NPDWR 0x4 /* Nonposted DW Receive */ |
#define PCI_HT_SW_PC_RDWR 0x5 /* Response DW Receive */ |
#define PCI_HT_SW_PC_PCT 0x6 /* Posted Command Transmit */ |
#define PCI_HT_SW_PC_NPCT 0x7 /* Nonposted Command Transmit */ |
#define PCI_HT_SW_PC_RCT 0x8 /* Response Command Transmit */ |
#define PCI_HT_SW_PC_PDWT 0x9 /* Posted DW Transmit */ |
#define PCI_HT_SW_PC_NPDWT 0xa /* Nonposted DW Transmit */ |
#define PCI_HT_SW_PC_RDWT 0xb /* Response DW Transmit */ |
/* Base/Limit Range indices */ |
#define PCI_HT_SW_BLR_BASE0_LO 0x0 /* Base 0[31:1], Enable */ |
#define PCI_HT_SW_BLR_BASE0_HI 0x1 /* Base 0 Upper */ |
#define PCI_HT_SW_BLR_LIM0_LO 0x2 /* Limit 0 Lower */ |
#define PCI_HT_SW_BLR_LIM0_HI 0x3 /* Limit 0 Upper */ |
/* Secondary Base indices */ |
#define PCI_HT_SW_SB_LO 0x0 /* Secondary Base[31:1], Enable */ |
#define PCI_HT_SW_S0_HI 0x1 /* Secondary Base Upper */ |
/* HyperTransport: Interrupt Discovery and Configuration */ |
#define PCI_HT_IDC_IDX 2 /* Index Register */ |
#define PCI_HT_IDC_DATA 4 /* Data Register */ |
#define PCI_HT_IDC_SIZEOF 8 |
/* Register indices */ |
#define PCI_HT_IDC_IDX_LINT 0x01 /* Last Interrupt Register */ |
#define PCI_HT_IDC_LINT 0x00ff0000 /* Last interrupt definition */ |
#define PCI_HT_IDC_IDX_IDR 0x10 /* Interrupt Definition Registers */ |
/* Low part (at index) */ |
#define PCI_HT_IDC_IDR_MASK 0x10000001 /* Mask */ |
#define PCI_HT_IDC_IDR_POL 0x10000002 /* Polarity */ |
#define PCI_HT_IDC_IDR_II_2 0x1000001c /* IntrInfo[4:2]: Message Type */ |
#define PCI_HT_IDC_IDR_II_5 0x10000020 /* IntrInfo[5]: Request EOI */ |
#define PCI_HT_IDC_IDR_II_6 0x00ffffc0 /* IntrInfo[23:6] */ |
#define PCI_HT_IDC_IDR_II_24 0xff000000 /* IntrInfo[31:24] */ |
/* High part (at index + 1) */ |
#define PCI_HT_IDC_IDR_II_32 0x00ffffff /* IntrInfo[55:32] */ |
#define PCI_HT_IDC_IDR_PASSPW 0x40000000 /* PassPW setting for messages */ |
#define PCI_HT_IDC_IDR_WEOI 0x80000000 /* Waiting for EOI */ |
/* HyperTransport: Revision ID */ |
#define PCI_HT_RID_RID 2 /* Revision Register */ |
#define PCI_HT_RID_SIZEOF 4 |
/* HyperTransport: UnitID Clumping */ |
#define PCI_HT_UIDC_CS 4 /* Clumping Support Register */ |
#define PCI_HT_UIDC_CE 8 /* Clumping Enable Register */ |
#define PCI_HT_UIDC_SIZEOF 12 |
/* HyperTransport: Extended Configuration Space Access */ |
#define PCI_HT_ECSA_ADDR 4 /* Configuration Address Register */ |
#define PCI_HT_ECSA_ADDR_REG 0x00000ffc /* Register */ |
#define PCI_HT_ECSA_ADDR_FUN 0x00007000 /* Function */ |
#define PCI_HT_ECSA_ADDR_DEV 0x000f1000 /* Device */ |
#define PCI_HT_ECSA_ADDR_BUS 0x0ff00000 /* Bus Number */ |
#define PCI_HT_ECSA_ADDR_TYPE 0x10000000 /* Access Type */ |
#define PCI_HT_ECSA_DATA 8 /* Configuration Data Register */ |
#define PCI_HT_ECSA_SIZEOF 12 |
/* HyperTransport: Address Mapping */ |
#define PCI_HT_AM_CMD 2 /* Command Register */ |
#define PCI_HT_AM_CMD_NDMA 0x000f /* Number of DMA Mappings */ |
#define PCI_HT_AM_CMD_IOSIZ 0x01f0 /* I/O Size */ |
#define PCI_HT_AM_CMD_MT 0x0600 /* Map Type */ |
#define PCI_HT_AM_CMD_MT_40B 0x0000 /* 40-bit */ |
#define PCI_HT_AM_CMD_MT_64B 0x0200 /* 64-bit */ |
/* Window Control Register bits */ |
#define PCI_HT_AM_SBW_CTR_COMP 0x1 /* Compat */ |
#define PCI_HT_AM_SBW_CTR_NCOH 0x2 /* NonCoherent */ |
#define PCI_HT_AM_SBW_CTR_ISOC 0x4 /* Isochronous */ |
#define PCI_HT_AM_SBW_CTR_EN 0x8 /* Enable */ |
/* HyperTransport: 40-bit Address Mapping */ |
#define PCI_HT_AM40_SBNPW 4 /* Secondary Bus Non-Prefetchable Window Register */ |
#define PCI_HT_AM40_SBW_BASE 0x000fffff /* Window Base */ |
#define PCI_HT_AM40_SBW_CTR 0xf0000000 /* Window Control */ |
#define PCI_HT_AM40_SBPW 8 /* Secondary Bus Prefetchable Window Register */ |
#define PCI_HT_AM40_DMA_PBASE0 12 /* DMA Window Primary Base 0 Register */ |
#define PCI_HT_AM40_DMA_CTR0 15 /* DMA Window Control 0 Register */ |
#define PCI_HT_AM40_DMA_CTR_CTR 0xf0 /* Window Control */ |
#define PCI_HT_AM40_DMA_SLIM0 16 /* DMA Window Secondary Limit 0 Register */ |
#define PCI_HT_AM40_DMA_SBASE0 18 /* DMA Window Secondary Base 0 Register */ |
#define PCI_HT_AM40_SIZEOF 12 /* size is variable: 12 + 8 * NDMA */ |
/* HyperTransport: 64-bit Address Mapping */ |
#define PCI_HT_AM64_IDX 4 /* Index Register */ |
#define PCI_HT_AM64_DATA_LO 8 /* Data Lower Register */ |
#define PCI_HT_AM64_DATA_HI 12 /* Data Upper Register */ |
#define PCI_HT_AM64_SIZEOF 16 |
/* Register indices */ |
#define PCI_HT_AM64_IDX_SBNPW 0x00 /* Secondary Bus Non-Prefetchable Window Register */ |
#define PCI_HT_AM64_W_BASE_LO 0xfff00000 /* Window Base Lower */ |
#define PCI_HT_AM64_W_CTR 0x0000000f /* Window Control */ |
#define PCI_HT_AM64_IDX_SBPW 0x01 /* Secondary Bus Prefetchable Window Register */ |
#define PCI_HT_AM64_IDX_PBNPW 0x02 /* Primary Bus Non-Prefetchable Window Register */ |
#define PCI_HT_AM64_IDX_DMAPB0 0x04 /* DMA Window Primary Base 0 Register */ |
#define PCI_HT_AM64_IDX_DMASB0 0x05 /* DMA Window Secondary Base 0 Register */ |
#define PCI_HT_AM64_IDX_DMASL0 0x06 /* DMA Window Secondary Limit 0 Register */ |
/* HyperTransport: MSI Mapping */ |
#define PCI_HT_MSIM_CMD 2 /* Command Register */ |
#define PCI_HT_MSIM_CMD_EN 0x0001 /* Mapping Active */ |
#define PCI_HT_MSIM_CMD_FIXD 0x0002 /* MSI Mapping Address Fixed */ |
#define PCI_HT_MSIM_ADDR_LO 4 /* MSI Mapping Address Lower Register */ |
#define PCI_HT_MSIM_ADDR_HI 8 /* MSI Mapping Address Upper Register */ |
#define PCI_HT_MSIM_SIZEOF 12 |
/* HyperTransport: DirectRoute */ |
#define PCI_HT_DR_CMD 2 /* Command Register */ |
#define PCI_HT_DR_CMD_NDRS 0x000f /* Number of DirectRoute Spaces */ |
#define PCI_HT_DR_CMD_IDX 0x01f0 /* Index */ |
#define PCI_HT_DR_EN 4 /* Enable Vector Register */ |
#define PCI_HT_DR_DATA 8 /* Data Register */ |
#define PCI_HT_DR_SIZEOF 12 |
/* Register indices */ |
#define PCI_HT_DR_IDX_BASE_LO 0x00 /* DirectRoute Base Lower Register */ |
#define PCI_HT_DR_OTNRD 0x00000001 /* Opposite to Normal Request Direction */ |
#define PCI_HT_DR_BL_LO 0xffffff00 /* Base/Limit Lower */ |
#define PCI_HT_DR_IDX_BASE_HI 0x01 /* DirectRoute Base Upper Register */ |
#define PCI_HT_DR_IDX_LIMIT_LO 0x02 /* DirectRoute Limit Lower Register */ |
#define PCI_HT_DR_IDX_LIMIT_HI 0x03 /* DirectRoute Limit Upper Register */ |
/* HyperTransport: VCSet */ |
#define PCI_HT_VCS_SUP 4 /* VCSets Supported Register */ |
#define PCI_HT_VCS_L1EN 5 /* Link 1 VCSets Enabled Register */ |
#define PCI_HT_VCS_L0EN 6 /* Link 0 VCSets Enabled Register */ |
#define PCI_HT_VCS_SBD 8 /* Stream Bucket Depth Register */ |
#define PCI_HT_VCS_SINT 9 /* Stream Interval Register */ |
#define PCI_HT_VCS_SSUP 10 /* Number of Streaming VCs Supported Register */ |
#define PCI_HT_VCS_SSUP_0 0x00 /* Streaming VC 0 */ |
#define PCI_HT_VCS_SSUP_3 0x01 /* Streaming VCs 0-3 */ |
#define PCI_HT_VCS_SSUP_15 0x02 /* Streaming VCs 0-15 */ |
#define PCI_HT_VCS_NFCBD 12 /* Non-FC Bucket Depth Register */ |
#define PCI_HT_VCS_NFCINT 13 /* Non-FC Bucket Interval Register */ |
#define PCI_HT_VCS_SIZEOF 16 |
/* HyperTransport: Retry Mode */ |
#define PCI_HT_RM_CTR0 4 /* Control 0 Register */ |
#define PCI_HT_RM_CTR_LRETEN 0x01 /* Link Retry Enable */ |
#define PCI_HT_RM_CTR_FSER 0x02 /* Force Single Error */ |
#define PCI_HT_RM_CTR_ROLNEN 0x04 /* Rollover Nonfatal Enable */ |
#define PCI_HT_RM_CTR_FSS 0x08 /* Force Single Stomp */ |
#define PCI_HT_RM_CTR_RETNEN 0x10 /* Retry Nonfatal Enable */ |
#define PCI_HT_RM_CTR_RETFEN 0x20 /* Retry Fatal Enable */ |
#define PCI_HT_RM_CTR_AA 0xc0 /* Allowed Attempts */ |
#define PCI_HT_RM_STS0 5 /* Status 0 Register */ |
#define PCI_HT_RM_STS_RETSNT 0x01 /* Retry Sent */ |
#define PCI_HT_RM_STS_CNTROL 0x02 /* Count Rollover */ |
#define PCI_HT_RM_STS_SRCV 0x04 /* Stomp Received */ |
#define PCI_HT_RM_CTR1 6 /* Control 1 Register */ |
#define PCI_HT_RM_STS1 7 /* Status 1 Register */ |
#define PCI_HT_RM_CNT0 8 /* Retry Count 0 Register */ |
#define PCI_HT_RM_CNT1 10 /* Retry Count 1 Register */ |
#define PCI_HT_RM_SIZEOF 12 |
/* PCI Express */ |
#define PCI_EXP_FLAGS 0x2 /* Capabilities register */ |
#define PCI_EXP_FLAGS_VERS 0x000f /* Capability version */ |
#define PCI_EXP_FLAGS_TYPE 0x00f0 /* Device/Port type */ |
#define PCI_EXP_TYPE_ENDPOINT 0x0 /* Express Endpoint */ |
#define PCI_EXP_TYPE_LEG_END 0x1 /* Legacy Endpoint */ |
#define PCI_EXP_TYPE_ROOT_PORT 0x4 /* Root Port */ |
#define PCI_EXP_TYPE_UPSTREAM 0x5 /* Upstream Port */ |
#define PCI_EXP_TYPE_DOWNSTREAM 0x6 /* Downstream Port */ |
#define PCI_EXP_TYPE_PCI_BRIDGE 0x7 /* PCI/PCI-X Bridge */ |
#define PCI_EXP_FLAGS_SLOT 0x0100 /* Slot implemented */ |
#define PCI_EXP_FLAGS_IRQ 0x3e00 /* Interrupt message number */ |
#define PCI_EXP_DEVCAP 0x4 /* Device capabilities */ |
#define PCI_EXP_DEVCAP_PAYLOAD 0x07 /* Max_Payload_Size */ |
#define PCI_EXP_DEVCAP_PHANTOM 0x18 /* Phantom functions */ |
#define PCI_EXP_DEVCAP_EXT_TAG 0x20 /* Extended tags */ |
#define PCI_EXP_DEVCAP_L0S 0x1c0 /* L0s Acceptable Latency */ |
#define PCI_EXP_DEVCAP_L1 0xe00 /* L1 Acceptable Latency */ |
#define PCI_EXP_DEVCAP_ATN_BUT 0x1000 /* Attention Button Present */ |
#define PCI_EXP_DEVCAP_ATN_IND 0x2000 /* Attention Indicator Present */ |
#define PCI_EXP_DEVCAP_PWR_IND 0x4000 /* Power Indicator Present */ |
#define PCI_EXP_DEVCAP_PWR_VAL 0x3fc0000 /* Slot Power Limit Value */ |
#define PCI_EXP_DEVCAP_PWR_SCL 0xc000000 /* Slot Power Limit Scale */ |
#define PCI_EXP_DEVCTL 0x8 /* Device Control */ |
#define PCI_EXP_DEVCTL_CERE 0x0001 /* Correctable Error Reporting En. */ |
#define PCI_EXP_DEVCTL_NFERE 0x0002 /* Non-Fatal Error Reporting Enable */ |
#define PCI_EXP_DEVCTL_FERE 0x0004 /* Fatal Error Reporting Enable */ |
#define PCI_EXP_DEVCTL_URRE 0x0008 /* Unsupported Request Reporting En. */ |
#define PCI_EXP_DEVCTL_RELAXED 0x0010 /* Enable Relaxed Ordering */ |
#define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 /* Max_Payload_Size */ |
#define PCI_EXP_DEVCTL_EXT_TAG 0x0100 /* Extended Tag Field Enable */ |
#define PCI_EXP_DEVCTL_PHANTOM 0x0200 /* Phantom Functions Enable */ |
#define PCI_EXP_DEVCTL_AUX_PME 0x0400 /* Auxiliary Power PM Enable */ |
#define PCI_EXP_DEVCTL_NOSNOOP 0x0800 /* Enable No Snoop */ |
#define PCI_EXP_DEVCTL_READRQ 0x7000 /* Max_Read_Request_Size */ |
#define PCI_EXP_DEVSTA 0xa /* Device Status */ |
#define PCI_EXP_DEVSTA_CED 0x01 /* Correctable Error Detected */ |
#define PCI_EXP_DEVSTA_NFED 0x02 /* Non-Fatal Error Detected */ |
#define PCI_EXP_DEVSTA_FED 0x04 /* Fatal Error Detected */ |
#define PCI_EXP_DEVSTA_URD 0x08 /* Unsupported Request Detected */ |
#define PCI_EXP_DEVSTA_AUXPD 0x10 /* AUX Power Detected */ |
#define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */ |
#define PCI_EXP_LNKCAP 0xc /* Link Capabilities */ |
#define PCI_EXP_LNKCAP_SPEED 0x0000f /* Maximum Link Speed */ |
#define PCI_EXP_LNKCAP_WIDTH 0x003f0 /* Maximum Link Width */ |
#define PCI_EXP_LNKCAP_ASPM 0x00c00 /* Active State Power Management */ |
#define PCI_EXP_LNKCAP_L0S 0x07000 /* L0s Acceptable Latency */ |
#define PCI_EXP_LNKCAP_L1 0x38000 /* L1 Acceptable Latency */ |
#define PCI_EXP_LNKCAP_PORT 0xff000000 /* Port Number */ |
#define PCI_EXP_LNKCTL 0x10 /* Link Control */ |
#define PCI_EXP_LNKCTL_ASPM 0x0003 /* ASPM Control */ |
#define PCI_EXP_LNKCTL_RCB 0x0008 /* Read Completion Boundary */ |
#define PCI_EXP_LNKCTL_DISABLE 0x0010 /* Link Disable */ |
#define PCI_EXP_LNKCTL_RETRAIN 0x0020 /* Retrain Link */ |
#define PCI_EXP_LNKCTL_CLOCK 0x0040 /* Common Clock Configuration */ |
#define PCI_EXP_LNKCTL_XSYNCH 0x0080 /* Extended Synch */ |
#define PCI_EXP_LNKSTA 0x12 /* Link Status */ |
#define PCI_EXP_LNKSTA_SPEED 0x000f /* Negotiated Link Speed */ |
#define PCI_EXP_LNKSTA_WIDTH 0x03f0 /* Negotiated Link Width */ |
#define PCI_EXP_LNKSTA_TR_ERR 0x0400 /* Training Error */ |
#define PCI_EXP_LNKSTA_TRAIN 0x0800 /* Link Training */ |
#define PCI_EXP_LNKSTA_SL_CLK 0x1000 /* Slot Clock Configuration */ |
#define PCI_EXP_SLTCAP 0x14 /* Slot Capabilities */ |
#define PCI_EXP_SLTCAP_ATNB 0x0001 /* Attention Button Present */ |
#define PCI_EXP_SLTCAP_PWRC 0x0002 /* Power Controller Present */ |
#define PCI_EXP_SLTCAP_MRL 0x0004 /* MRL Sensor Present */ |
#define PCI_EXP_SLTCAP_ATNI 0x0008 /* Attention Indicator Present */ |
#define PCI_EXP_SLTCAP_PWRI 0x0010 /* Power Indicator Present */ |
#define PCI_EXP_SLTCAP_HPS 0x0020 /* Hot-Plug Surprise */ |
#define PCI_EXP_SLTCAP_HPC 0x0040 /* Hot-Plug Capable */ |
#define PCI_EXP_SLTCAP_PWR_VAL 0x00007f80 /* Slot Power Limit Value */ |
#define PCI_EXP_SLTCAP_PWR_SCL 0x00018000 /* Slot Power Limit Scale */ |
#define PCI_EXP_SLTCAP_PSN 0xfff80000 /* Physical Slot Number */ |
#define PCI_EXP_SLTCTL 0x18 /* Slot Control */ |
#define PCI_EXP_SLTCTL_ATNB 0x0001 /* Attention Button Pressed Enable */ |
#define PCI_EXP_SLTCTL_PWRF 0x0002 /* Power Fault Detected Enable */ |
#define PCI_EXP_SLTCTL_MRLS 0x0004 /* MRL Sensor Changed Enable */ |
#define PCI_EXP_SLTCTL_PRSD 0x0008 /* Presence Detect Changed Enable */ |
#define PCI_EXP_SLTCTL_CMDC 0x0010 /* Command Completed Interrupt Enable */ |
#define PCI_EXP_SLTCTL_HPIE 0x0020 /* Hot-Plug Interrupt Enable */ |
#define PCI_EXP_SLTCTL_ATNI 0x00C0 /* Attention Indicator Control */ |
#define PCI_EXP_SLTCTL_PWRI 0x0300 /* Power Indicator Control */ |
#define PCI_EXP_SLTCTL_PWRC 0x0400 /* Power Controller Control */ |
#define PCI_EXP_SLTSTA 0x1a /* Slot Status */ |
#define PCI_EXP_RTCTL 0x1c /* Root Control */ |
#define PCI_EXP_RTCTL_SECEE 0x1 /* System Error on Correctable Error */ |
#define PCI_EXP_RTCTL_SENFEE 0x1 /* System Error on Non-Fatal Error */ |
#define PCI_EXP_RTCTL_SEFEE 0x1 /* System Error on Fatal Error */ |
#define PCI_EXP_RTCTL_PMEIE 0x1 /* PME Interrupt Enable */ |
#define PCI_EXP_RTSTA 0x20 /* Root Status */ |
/* MSI-X */ |
#define PCI_MSIX_ENABLE 0x8000 |
#define PCI_MSIX_MASK 0x4000 |
#define PCI_MSIX_TABSIZE 0x03ff |
#define PCI_MSIX_TABLE 4 |
#define PCI_MSIX_PBA 8 |
#define PCI_MSIX_BIR 0x7 |
/* Advanced Error Reporting */ |
#define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */ |
#define PCI_ERR_UNC_TRAIN 0x00000001 /* Training */ |
#define PCI_ERR_UNC_DLP 0x00000010 /* Data Link Protocol */ |
#define PCI_ERR_UNC_POISON_TLP 0x00001000 /* Poisoned TLP */ |
#define PCI_ERR_UNC_FCP 0x00002000 /* Flow Control Protocol */ |
#define PCI_ERR_UNC_COMP_TIME 0x00004000 /* Completion Timeout */ |
#define PCI_ERR_UNC_COMP_ABORT 0x00008000 /* Completer Abort */ |
#define PCI_ERR_UNC_UNX_COMP 0x00010000 /* Unexpected Completion */ |
#define PCI_ERR_UNC_RX_OVER 0x00020000 /* Receiver Overflow */ |
#define PCI_ERR_UNC_MALF_TLP 0x00040000 /* Malformed TLP */ |
#define PCI_ERR_UNC_ECRC 0x00080000 /* ECRC Error Status */ |
#define PCI_ERR_UNC_UNSUP 0x00100000 /* Unsupported Request */ |
#define PCI_ERR_UNCOR_MASK 8 /* Uncorrectable Error Mask */ |
/* Same bits as above */ |
#define PCI_ERR_UNCOR_SEVER 12 /* Uncorrectable Error Severity */ |
/* Same bits as above */ |
#define PCI_ERR_COR_STATUS 16 /* Correctable Error Status */ |
#define PCI_ERR_COR_RCVR 0x00000001 /* Receiver Error Status */ |
#define PCI_ERR_COR_BAD_TLP 0x00000040 /* Bad TLP Status */ |
#define PCI_ERR_COR_BAD_DLLP 0x00000080 /* Bad DLLP Status */ |
#define PCI_ERR_COR_REP_ROLL 0x00000100 /* REPLAY_NUM Rollover */ |
#define PCI_ERR_COR_REP_TIMER 0x00001000 /* Replay Timer Timeout */ |
#define PCI_ERR_COR_MASK 20 /* Correctable Error Mask */ |
/* Same bits as above */ |
#define PCI_ERR_CAP 24 /* Advanced Error Capabilities */ |
#define PCI_ERR_CAP_FEP(x) ((x) & 31) /* First Error Pointer */ |
#define PCI_ERR_CAP_ECRC_GENC 0x00000020 /* ECRC Generation Capable */ |
#define PCI_ERR_CAP_ECRC_GENE 0x00000040 /* ECRC Generation Enable */ |
#define PCI_ERR_CAP_ECRC_CHKC 0x00000080 /* ECRC Check Capable */ |
#define PCI_ERR_CAP_ECRC_CHKE 0x00000100 /* ECRC Check Enable */ |
#define PCI_ERR_HEADER_LOG 28 /* Header Log Register (16 bytes) */ |
#define PCI_ERR_ROOT_COMMAND 44 /* Root Error Command */ |
#define PCI_ERR_ROOT_STATUS 48 |
#define PCI_ERR_ROOT_COR_SRC 52 |
#define PCI_ERR_ROOT_SRC 54 |
/* Virtual Channel */ |
#define PCI_VC_PORT_REG1 4 |
#define PCI_VC_PORT_REG2 8 |
#define PCI_VC_PORT_CTRL 12 |
#define PCI_VC_PORT_STATUS 14 |
#define PCI_VC_RES_CAP 16 |
#define PCI_VC_RES_CTRL 20 |
#define PCI_VC_RES_STATUS 26 |
/* Power Budgeting */ |
#define PCI_PWR_DSR 4 /* Data Select Register */ |
#define PCI_PWR_DATA 8 /* Data Register */ |
#define PCI_PWR_DATA_BASE(x) ((x) & 0xff) /* Base Power */ |
#define PCI_PWR_DATA_SCALE(x) (((x) >> 8) & 3) /* Data Scale */ |
#define PCI_PWR_DATA_PM_SUB(x) (((x) >> 10) & 7) /* PM Sub State */ |
#define PCI_PWR_DATA_PM_STATE(x) (((x) >> 13) & 3) /* PM State */ |
#define PCI_PWR_DATA_TYPE(x) (((x) >> 15) & 7) /* Type */ |
#define PCI_PWR_DATA_RAIL(x) (((x) >> 18) & 7) /* Power Rail */ |
#define PCI_PWR_CAP 12 /* Capability */ |
#define PCI_PWR_CAP_BUDGET(x) ((x) & 1) /* Included in system budget */ |
/* |
* The PCI interface treats multi-function devices as independent |
* devices. The slot/function address of each device is encoded |
* in a single byte as follows: |
* |
* 7:3 = slot |
* 2:0 = function |
*/ |
#define PCI_DEVFN(slot,func) ((((slot) & 0x1f) << 3) | ((func) & 0x07)) |
#define PCI_SLOT(devfn) (((devfn) >> 3) & 0x1f) |
#define PCI_FUNC(devfn) ((devfn) & 0x07) |
/* Device classes and subclasses */ |
#define PCI_CLASS_NOT_DEFINED 0x0000 |
#define PCI_CLASS_NOT_DEFINED_VGA 0x0001 |
#define PCI_BASE_CLASS_STORAGE 0x01 |
#define PCI_CLASS_STORAGE_SCSI 0x0100 |
#define PCI_CLASS_STORAGE_IDE 0x0101 |
#define PCI_CLASS_STORAGE_FLOPPY 0x0102 |
#define PCI_CLASS_STORAGE_IPI 0x0103 |
#define PCI_CLASS_STORAGE_RAID 0x0104 |
#define PCI_CLASS_STORAGE_OTHER 0x0180 |
#define PCI_BASE_CLASS_NETWORK 0x02 |
#define PCI_CLASS_NETWORK_ETHERNET 0x0200 |
#define PCI_CLASS_NETWORK_TOKEN_RING 0x0201 |
#define PCI_CLASS_NETWORK_FDDI 0x0202 |
#define PCI_CLASS_NETWORK_ATM 0x0203 |
#define PCI_CLASS_NETWORK_OTHER 0x0280 |
#define PCI_BASE_CLASS_DISPLAY 0x03 |
#define PCI_CLASS_DISPLAY_VGA 0x0300 |
#define PCI_CLASS_DISPLAY_XGA 0x0301 |
#define PCI_CLASS_DISPLAY_OTHER 0x0380 |
#define PCI_BASE_CLASS_MULTIMEDIA 0x04 |
#define PCI_CLASS_MULTIMEDIA_VIDEO 0x0400 |
#define PCI_CLASS_MULTIMEDIA_AUDIO 0x0401 |
#define PCI_CLASS_MULTIMEDIA_OTHER 0x0480 |
#define PCI_BASE_CLASS_MEMORY 0x05 |
#define PCI_CLASS_MEMORY_RAM 0x0500 |
#define PCI_CLASS_MEMORY_FLASH 0x0501 |
#define PCI_CLASS_MEMORY_OTHER 0x0580 |
#define PCI_BASE_CLASS_BRIDGE 0x06 |
#define PCI_CLASS_BRIDGE_HOST 0x0600 |
#define PCI_CLASS_BRIDGE_ISA 0x0601 |
#define PCI_CLASS_BRIDGE_EISA 0x0602 |
#define PCI_CLASS_BRIDGE_MC 0x0603 |
#define PCI_CLASS_BRIDGE_PCI 0x0604 |
#define PCI_CLASS_BRIDGE_PCMCIA 0x0605 |
#define PCI_CLASS_BRIDGE_NUBUS 0x0606 |
#define PCI_CLASS_BRIDGE_CARDBUS 0x0607 |
#define PCI_CLASS_BRIDGE_OTHER 0x0680 |
#define PCI_BASE_CLASS_COMMUNICATION 0x07 |
#define PCI_CLASS_COMMUNICATION_SERIAL 0x0700 |
#define PCI_CLASS_COMMUNICATION_PARALLEL 0x0701 |
#define PCI_CLASS_COMMUNICATION_OTHER 0x0780 |
#define PCI_BASE_CLASS_SYSTEM 0x08 |
#define PCI_CLASS_SYSTEM_PIC 0x0800 |
#define PCI_CLASS_SYSTEM_DMA 0x0801 |
#define PCI_CLASS_SYSTEM_TIMER 0x0802 |
#define PCI_CLASS_SYSTEM_RTC 0x0803 |
#define PCI_CLASS_SYSTEM_OTHER 0x0880 |
#define PCI_BASE_CLASS_INPUT 0x09 |
#define PCI_CLASS_INPUT_KEYBOARD 0x0900 |
#define PCI_CLASS_INPUT_PEN 0x0901 |
#define PCI_CLASS_INPUT_MOUSE 0x0902 |
#define PCI_CLASS_INPUT_OTHER 0x0980 |
#define PCI_BASE_CLASS_DOCKING 0x0a |
#define PCI_CLASS_DOCKING_GENERIC 0x0a00 |
#define PCI_CLASS_DOCKING_OTHER 0x0a01 |
#define PCI_BASE_CLASS_PROCESSOR 0x0b |
#define PCI_CLASS_PROCESSOR_386 0x0b00 |
#define PCI_CLASS_PROCESSOR_486 0x0b01 |
#define PCI_CLASS_PROCESSOR_PENTIUM 0x0b02 |
#define PCI_CLASS_PROCESSOR_ALPHA 0x0b10 |
#define PCI_CLASS_PROCESSOR_POWERPC 0x0b20 |
#define PCI_CLASS_PROCESSOR_CO 0x0b40 |
#define PCI_BASE_CLASS_SERIAL 0x0c |
#define PCI_CLASS_SERIAL_FIREWIRE 0x0c00 |
#define PCI_CLASS_SERIAL_ACCESS 0x0c01 |
#define PCI_CLASS_SERIAL_SSA 0x0c02 |
#define PCI_CLASS_SERIAL_USB 0x0c03 |
#define PCI_CLASS_SERIAL_FIBER 0x0c04 |
#define PCI_CLASS_OTHERS 0xff |
/* Several ID's we need in the library */ |
#define PCI_VENDOR_ID_INTEL 0x8086 |
#define PCI_VENDOR_ID_COMPAQ 0x0e11 |
/tags/0.2.0/uspace/pci/libpci/pci_ids.h |
---|
0,0 → 1,11934 |
/* DO NOT EDIT, THIS FILE IS AUTOMATICALLY GENERATED */ |
char *pci_ids[] = { |
"0000 Gammagraphx, Inc.", |
"001a Ascend Communications, Inc.", |
"0033 Paradyne corp.", |
"003d Lockheed Martin-Marietta Corp", |
"0059 Tiger Jet Network Inc. (Wrong ID)", |
"0070 Hauppauge computer works Inc.", |
"0071 Nebula Electronics Ltd.", |
"0095 Silicon Image, Inc. (Wrong ID)", |
" 0680 Ultra ATA/133 IDE RAID CONTROLLER CARD", |
"00a7 Teles AG (Wrong ID)", |
"00f5 BFG Technologies, Inc.", |
"0100 Ncipher Corp Ltd", |
"0123 General Dynamics", |
"018a LevelOne", |
" 0106 FPC-0106TX misprogrammed [RTL81xx]", |
"021b Compaq Computer Corporation", |
" 8139 HNE-300 (RealTek RTL8139c) [iPaq Networking]", |
"0270 Hauppauge computer works Inc. (Wrong ID)", |
"0291 Davicom Semiconductor, Inc.", |
" 8212 DM9102A(DM9102AE, SM9102AF) Ethernet 100/10 MBit(Rev 40)", |
"02ac SpeedStream", |
" 1012 1012 PCMCIA 10/100 Ethernet Card [RTL81xx]", |
"0315 SK-Electronics Co., Ltd.", |
"0357 TTTech AG", |
" 000a TTP-Monitoring Card V2.0", |
"0432 SCM Microsystems, Inc.", |
" 0001 Pluto2 DVB-T Receiver for PCMCIA [EasyWatch MobilSet]", |
"045e Microsoft", |
" 006e MN-510 802.11b wireless USB paddle", |
" 00c2 MN-710 wireless USB paddle", |
"04cf Myson Century, Inc", |
" 8818 CS8818 USB2.0-to-ATAPI Bridge Controller with Embedded PHY", |
"050d Belkin", |
" 0109 F5U409-CU USB/Serial Portable Adapter", |
" 7050 F5D7050 802.11g Wireless USB Adapter", |
"05e3 CyberDoor", |
" 0701 CBD516", |
"066f Sigmatel Inc.", |
" 3410 SMTP3410", |
" 3500 SMTP3500", |
"0675 Dynalink", |
" 1700 IS64PH ISDN Adapter", |
" 1702 IS64PH ISDN Adapter", |
" 1703 ISDN Adapter (PCI Bus, DV, W)", |
" 1704 ISDN Adapter (PCI Bus, D, C)", |
"067b Prolific Technology, Inc.", |
" 3507 PL-3507 Hi-Speed USB & IEEE 1394 Combo to IDE Bridge Controller", |
"0721 Sapphire, Inc.", |
"07e2 ELMEG Communication Systems GmbH", |
"0925 VIA Technologies, Inc. (Wrong ID)", |
"09c1 Arris", |
" 0704 CM 200E Cable Modem", |
"0a89 BREA Technologies Inc", |
"0b0b Rhino Equiment Corp.", |
" 0105 Rhino R1T1", |
" 0205 Rhino R4FXO", |
" 0305 Rhino R4T1", |
" 0405 Rhino R8FXX", |
" 0505 Rhino R24FXX", |
" 0506 Rhino R2T1", |
"0b49 ASCII Corporation", |
" 064f Trance Vibrator", |
"0e11 Compaq Computer Corporation", |
" 0001 PCI to EISA Bridge", |
" 0002 PCI to ISA Bridge", |
" 0046 Smart Array 64xx", |
" 0e11 409a Smart Array 641", |
" 0e11 409b Smart Array 642", |
" 0e11 409c Smart Array 6400", |
" 0e11 409d Smart Array 6400 EM", |
" 0049 NC7132 Gigabit Upgrade Module", |
" 004a NC6136 Gigabit Server Adapter", |
" 005a Remote Insight II board - Lights-Out", |
" 007c NC7770 1000BaseTX", |
" 007d NC6770 1000BaseTX", |
" 0085 NC7780 1000BaseTX", |
" 00b1 Remote Insight II board - PCI device", |
" 00bb NC7760", |
" 00ca NC7771", |
" 00cb NC7781", |
" 00cf NC7772", |
" 00d0 NC7782", |
" 00d1 NC7783", |
" 00e3 NC7761", |
" 0508 Netelligent 4/16 Token Ring", |
" 1000 Triflex/Pentium Bridge, Model 1000", |
" 2000 Triflex/Pentium Bridge, Model 2000", |
" 3032 QVision 1280/p", |
" 3033 QVision 1280/p", |
" 3034 QVision 1280/p", |
" 4000 4000 [Triflex]", |
" 4030 SMART-2/P", |
" 4031 SMART-2SL", |
" 4032 Smart Array 3200", |
" 4033 Smart Array 3100ES", |
" 4034 Smart Array 221", |
" 4040 Integrated Array", |
" 4048 Compaq Raid LC2", |
" 4050 Smart Array 4200", |
" 4051 Smart Array 4250ES", |
" 4058 Smart Array 431", |
" 4070 Smart Array 5300", |
" 4080 Smart Array 5i", |
" 4082 Smart Array 532", |
" 4083 Smart Array 5312", |
" 4091 Smart Array 6i", |
" 409a Smart Array 641", |
" 409b Smart Array 642", |
" 409c Smart Array 6400", |
" 409d Smart Array 6400 EM", |
" 6010 HotPlug PCI Bridge 6010", |
" 7020 USB Controller", |
" a0ec Fibre Channel Host Controller", |
" a0f0 Advanced System Management Controller", |
" a0f3 Triflex PCI to ISA Bridge", |
" a0f7 PCI Hotplug Controller", |
" 8086 002a PCI Hotplug Controller A", |
" 8086 002b PCI Hotplug Controller B", |
" a0f8 ZFMicro Chipset USB", |
" a0fc FibreChannel HBA Tachyon", |
" ae10 Smart-2/P RAID Controller", |
" 0e11 4030 Smart-2/P Array Controller", |
" 0e11 4031 Smart-2SL Array Controller", |
" 0e11 4032 Smart Array Controller", |
" 0e11 4033 Smart 3100ES Array Controller", |
" ae29 MIS-L", |
" ae2a MPC", |
" ae2b MIS-E", |
" ae31 System Management Controller", |
" ae32 Netelligent 10/100 TX PCI UTP", |
" ae33 Triflex Dual EIDE Controller", |
" ae34 Netelligent 10 T PCI UTP", |
" ae35 Integrated NetFlex-3/P", |
" ae40 Netelligent Dual 10/100 TX PCI UTP", |
" ae43 Netelligent Integrated 10/100 TX UTP", |
" ae69 CETUS-L", |
" ae6c Northstar", |
" ae6d NorthStar CPU to PCI Bridge", |
" b011 Netelligent 10/100 TX Embedded UTP", |
" b012 Netelligent 10 T/2 PCI UTP/Coax", |
" b01e NC3120 Fast Ethernet NIC", |
" b01f NC3122 Fast Ethernet NIC", |
" b02f NC1120 Ethernet NIC", |
" b030 Netelligent 10/100 TX UTP", |
" b04a 10/100 TX PCI Intel WOL UTP Controller", |
" b060 Smart Array 5300 Controller", |
" b0c6 NC3161 Fast Ethernet NIC", |
" b0c7 NC3160 Fast Ethernet NIC", |
" b0d7 NC3121 Fast Ethernet NIC", |
" b0dd NC3131 Fast Ethernet NIC", |
" b0de NC3132 Fast Ethernet Module", |
" b0df NC6132 Gigabit Module", |
" b0e0 NC6133 Gigabit Module", |
" b0e1 NC3133 Fast Ethernet Module", |
" b123 NC6134 Gigabit NIC", |
" b134 NC3163 Fast Ethernet NIC", |
" b13c NC3162 Fast Ethernet NIC", |
" b144 NC3123 Fast Ethernet NIC", |
" b163 NC3134 Fast Ethernet NIC", |
" b164 NC3165 Fast Ethernet Upgrade Module", |
" b178 Smart Array 5i/532", |
" 0e11 4080 Smart Array 5i", |
" 0e11 4082 Smart Array 532", |
" 0e11 4083 Smart Array 5312", |
" b1a4 NC7131 Gigabit Server Adapter", |
" b200 Memory Hot-Plug Controller", |
" b203 Integrated Lights Out Controller", |
" b204 Integrated Lights Out Processor", |
" f130 NetFlex-3/P ThunderLAN 1.0", |
" f150 NetFlex-3/P ThunderLAN 2.3", |
"0e21 Cowon Systems, Inc.", |
"0e55 HaSoTec GmbH", |
"1000 LSI Logic / Symbios Logic", |
" 0001 53c810", |
" 1000 1000 LSI53C810AE PCI to SCSI I/O Processor", |
" 0002 53c820", |
" 0003 53c825", |
" 1000 1000 LSI53C825AE PCI to SCSI I/O Processor (Ultra Wide)", |
" 0004 53c815", |
" 0005 53c810AP", |
" 0006 53c860", |
" 1000 1000 LSI53C860E PCI to Ultra SCSI I/O Processor", |
" 000a 53c1510", |
" 1000 1000 LSI53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Nonintelligent mode)", |
" 000b 53C896/897", |
" 0e11 6004 EOB003 Series SCSI host adapter", |
" 1000 1000 LSI53C896/7 PCI to Dual Channel Ultra2 SCSI Multifunction Controller", |
" 1000 1010 LSI22910 PCI to Dual Channel Ultra2 SCSI host adapter", |
" 1000 1020 LSI21002 PCI to Dual Channel Ultra2 SCSI host adapter", |
" 13e9 1000 6221L-4U", |
" 000c 53c895", |
" 1000 1010 LSI8951U PCI to Ultra2 SCSI host adapter", |
" 1000 1020 LSI8952U PCI to Ultra2 SCSI host adapter", |
" 1de1 3906 DC-390U2B SCSI adapter", |
" 1de1 3907 DC-390U2W", |
" 000d 53c885", |
" 000f 53c875", |
" 0e11 7004 Embedded Ultra Wide SCSI Controller", |
" 1000 1000 LSI53C876/E PCI to Dual Channel SCSI Controller", |
" 1000 1010 LSI22801 PCI to Dual Channel Ultra SCSI host adapter", |
" 1000 1020 LSI22802 PCI to Dual Channel Ultra SCSI host adapter", |
" 1092 8760 FirePort 40 Dual SCSI Controller", |
" 1de1 3904 DC390F/U Ultra Wide SCSI Adapter", |
" 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard", |
" 4c53 1050 CT7 mainboard", |
" 0010 53C1510", |
" 0e11 4040 Integrated Array Controller", |
" 0e11 4048 RAID LC2 Controller", |
" 1000 1000 53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Intelligent mode)", |
" 0012 53c895a", |
" 1000 1000 LSI53C895A PCI to Ultra2 SCSI Controller", |
" 0013 53c875a", |
" 1000 1000 LSI53C875A PCI to Ultra SCSI Controller", |
" 0020 53c1010 Ultra3 SCSI Adapter", |
" 1000 1000 LSI53C1010-33 PCI to Dual Channel Ultra160 SCSI Controller", |
" 1de1 1020 DC-390U3W", |
" 0021 53c1010 66MHz Ultra3 SCSI Adapter", |
" 1000 1000 LSI53C1000/1000R/1010R/1010-66 PCI to Ultra160 SCSI Controller", |
" 1000 1010 Asus TR-DLS onboard 53C1010-66", |
" 124b 1070 PMC-USCSI3", |
" 4c53 1080 CT8 mainboard", |
" 4c53 1300 P017 mezzanine (32-bit PMC)", |
" 4c53 1310 P017 mezzanine (64-bit PMC)", |
" 0030 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI", |
" 0e11 00da ProLiant ML 350", |
" 1028 0123 PowerEdge 2600", |
" 1028 014a PowerEdge 1750", |
" 1028 016c PowerEdge 1850 MPT Fusion SCSI/RAID (Perc 4)", |
" 1028 0183 PowerEdge 1800", |
" 1028 1010 LSI U320 SCSI Controller", |
" 124b 1170 PMC-USCSI320", |
" 1734 1052 Primergy RX300 S2", |
" 0031 53c1030ZC PCI-X Fusion-MPT Dual Ultra320 SCSI", |
" 0032 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI", |
" 1000 1000 LSI53C1020/1030 PCI-X to Ultra320 SCSI Controller", |
" 0033 1030ZC_53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI", |
" 0040 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI", |
" 1000 0033 MegaRAID SCSI 320-2XR", |
" 1000 0066 MegaRAID SCSI 320-2XRWS", |
" 0041 53C1035ZC PCI-X Fusion-MPT Dual Ultra320 SCSI", |
" 0050 SAS1064 PCI-X Fusion-MPT SAS", |
" 0054 SAS1068 PCI-X Fusion-MPT SAS", |
" 0056 SAS1064E PCI-Express Fusion-MPT SAS", |
" 0058 SAS1068E PCI-Express Fusion-MPT SAS", |
" 005a SAS1066E PCI-Express Fusion-MPT SAS", |
" 005c SAS1064A PCI-X Fusion-MPT SAS", |
" 005e SAS1066 PCI-X Fusion-MPT SAS", |
" 0060 SAS1078 PCI-X Fusion-MPT SAS", |
" 0062 SAS1078 PCI-Express Fusion-MPT SAS", |
" 1000 0062 SAS1078 PCI-Express Fusion-MPT SAS", |
" 008f 53c875J", |
" 1092 8000 FirePort 40 SCSI Controller", |
" 1092 8760 FirePort 40 Dual SCSI Host Adapter", |
" 0407 MegaRAID", |
" 1000 0530 MegaRAID 530 SCSI 320-0X RAID Controller", |
" 1000 0531 MegaRAID 531 SCSI 320-4X RAID Controller", |
" 1000 0532 MegaRAID 532 SCSI 320-2X RAID Controller", |
" 1028 0531 PowerEdge Expandable RAID Controller 4/QC", |
" 1028 0533 PowerEdge Expandable RAID Controller 4/QC", |
" 8086 0530 MegaRAID Intel RAID Controller SRCZCRX", |
" 8086 0532 MegaRAID Intel RAID Controller SRCU42X", |
" 0408 MegaRAID", |
" 1000 0001 MegaRAID SCSI 320-1E RAID Controller", |
" 1000 0002 MegaRAID SCSI 320-2E RAID Controller", |
" 1025 004d MegaRAID ACER ROMB-2E RAID Controller", |
" 1028 0001 PowerEdge RAID Controller PERC4e/SC", |
" 1028 0002 PowerEdge RAID Controller PERC4e/DC", |
" 1734 1065 FSC MegaRAID PCI Express ROMB", |
" 8086 0002 MegaRAID Intel RAID Controller SRCU42E", |
" 0409 MegaRAID", |
" 1000 3004 MegaRAID SATA 300-4X RAID Controller", |
" 1000 3008 MegaRAID SATA 300-8X RAID Controller", |
" 8086 3008 MegaRAID RAID Controller SRCS28X", |
" 8086 3431 MegaRAID RAID Controller Alief SROMBU42E", |
" 8086 3499 MegaRAID RAID Controller Harwich SROMBU42E", |
" 0621 FC909 Fibre Channel Adapter", |
" 0622 FC929 Fibre Channel Adapter", |
" 1000 1020 44929 O Dual Fibre Channel card", |
" 0623 FC929 LAN", |
" 0624 FC919 Fibre Channel Adapter", |
" 0625 FC919 LAN", |
" 0626 FC929X Fibre Channel Adapter", |
" 1000 1010 7202-XP-LC Dual Fibre Channel card", |
" 0627 FC929X LAN", |
" 0628 FC919X Fibre Channel Adapter", |
" 0629 FC919X LAN", |
" 0640 FC949X Fibre Channel Adapter", |
" 0642 FC939X Fibre Channel Adapter", |
" 0646 FC949ES Fibre Channel Adapter", |
" 0701 83C885 NT50 DigitalScape Fast Ethernet", |
" 0702 Yellowfin G-NIC gigabit ethernet", |
" 1318 0000 PEI100X", |
" 0804 SA2010", |
" 0805 SA2010ZC", |
" 0806 SA2020", |
" 0807 SA2020ZC", |
" 0901 61C102", |
" 1000 63C815", |
" 1960 MegaRAID", |
" 1000 0518 MegaRAID 518 SCSI 320-2 Controller", |
" 1000 0520 MegaRAID 520 SCSI 320-1 Controller", |
" 1000 0522 MegaRAID 522 i4 133 RAID Controller", |
" 1000 0523 MegaRAID SATA 150-6 RAID Controller", |
" 1000 4523 MegaRAID SATA 150-4 RAID Controller", |
" 1000 a520 MegaRAID ZCR SCSI 320-0 Controller", |
" 1028 0518 MegaRAID 518 DELL PERC 4/DC RAID Controller", |
" 1028 0520 MegaRAID 520 DELL PERC 4/SC RAID Controller", |
" 1028 0531 PowerEdge Expandable RAID Controller 4/QC", |
" 1028 0533 PowerEdge Expandable RAID Controller 4/QC", |
" 8086 0520 MegaRAIDRAID Controller SRCU41L", |
" 8086 0523 MegaRAID RAID Controller SRCS16", |
"1001 Kolter Electronic", |
" 0010 PCI 1616 Measurement card with 32 digital I/O lines", |
" 0011 OPTO-PCI Opto-Isolated digital I/O board", |
" 0012 PCI-AD/DA Analogue I/O board", |
" 0013 PCI-OPTO-RELAIS Digital I/O board with relay outputs", |
" 0014 PCI-Counter/Timer Counter Timer board", |
" 0015 PCI-DAC416 Analogue output board", |
" 0016 PCI-MFB Analogue I/O board", |
" 0017 PROTO-3 PCI Prototyping board", |
" 9100 INI-9100/9100W SCSI Host", |
"1002 ATI Technologies Inc", |
" 3150 M24 1P [Radeon Mobility X600]", |
" 3152 M22 [Radeon Mobility X300]", |
" 3154 M24 1T [FireGL M24 GL]", |
" 3e50 RV380 0x3e50 [Radeon X600]", |
" 3e54 RV380 0x3e54 [FireGL V3200]", |
" 3e70 RV380 [Radeon X600] Secondary", |
" 4136 Radeon IGP 320 M", |
" 4137 Radeon IGP330/340/350", |
" 4144 R300 AD [Radeon 9500 Pro]", |
" 4145 R300 AE [Radeon 9700 Pro]", |
" 4146 R300 AF [Radeon 9700 Pro]", |
" 4147 R300 AG [FireGL Z1/X1]", |
" 4148 R350 AH [Radeon 9800]", |
" 4149 R350 AI [Radeon 9800]", |
" 414a R350 AJ [Radeon 9800]", |
" 414b R350 AK [Fire GL X2]", |
" 4150 RV350 AP [Radeon 9600]", |
" 1002 0002 R9600 Pro primary (Asus OEM for HP)", |
" 1002 0003 R9600 Pro secondary (Asus OEM for HP)", |
" 1002 4722 All-in-Wonder 2006 AGP Edition", |
" 1458 4024 Giga-Byte GV-R96128D Primary", |
" 148c 2064 PowerColor R96A-C3N", |
" 148c 2066 PowerColor R96A-C3N", |
" 174b 7c19 Sapphire Atlantis Radeon 9600 Pro", |
" 174b 7c29 GC-R9600PRO Primary [Sapphire]", |
" 17ee 2002 Radeon 9600 256Mb Primary", |
" 18bc 0101 GC-R9600PRO Primary", |
" 4151 RV350 AQ [Radeon 9600]", |
" 1043 c004 A9600SE", |
" 4152 RV350 AR [Radeon 9600]", |
" 1002 0002 Radeon 9600XT", |
" 1002 4772 All-in-Wonder 9600 XT", |
" 1043 c002 Radeon 9600 XT TVD", |
" 1043 c01a A9600XT/TD", |
" 174b 7c29 Sapphire Radeon 9600XT", |
" 1787 4002 Radeon 9600 XT", |
" 4153 RV350 AS [Radeon 9550]", |
" 1462 932c 865PE Neo2-V (MS-6788) mainboard", |
" 4154 RV350 AT [Fire GL T2]", |
" 4155 RV350 AU [Fire GL T2]", |
" 4156 RV350 AV [Fire GL T2]", |
" 4157 RV350 AW [Fire GL T2]", |
" 4158 68800AX [Mach32]", |
" 4164 R300 AD [Radeon 9500 Pro] (Secondary)", |
" 4165 R300 AE [Radeon 9700 Pro] (Secondary)", |
" 4166 R300 AF [Radeon 9700 Pro] (Secondary)", |
" 4168 Radeon R350 [Radeon 9800] (Secondary)", |
" 4170 RV350 AP [Radeon 9600] (Secondary)", |
" 1002 0003 R9600 Pro secondary (Asus OEM for HP)", |
" 1002 4723 All-in-Wonder 2006 AGP Edition (Secondary)", |
" 1458 4025 Giga-Byte GV-R96128D Secondary", |
" 148c 2067 PowerColor R96A-C3N (Secondary)", |
" 174b 7c28 GC-R9600PRO Secondary [Sapphire]", |
" 17ee 2003 Radeon 9600 256Mb Secondary", |
" 18bc 0100 GC-R9600PRO Secondary", |
" 4171 RV350 AQ [Radeon 9600] (Secondary)", |
" 1043 c005 A9600SE (Secondary)", |
" 4172 RV350 AR [Radeon 9600] (Secondary)", |
" 1002 0003 Radeon 9600XT (Secondary)", |
" 1002 4773 All-in-Wonder 9600 XT (Secondary)", |
" 1043 c003 A9600XT (Secondary)", |
" 1043 c01b A9600XT/TD (Secondary)", |
" 174b 7c28 Sapphire Radeon 9600XT (Secondary)", |
" 1787 4003 Radeon 9600 XT (Secondary)", |
" 4173 RV350 ?? [Radeon 9550] (Secondary)", |
" 4237 Radeon 7000 IGP", |
" 4242 R200 BB [Radeon All in Wonder 8500DV]", |
" 1002 02aa Radeon 8500 AIW DV Edition", |
" 4243 R200 BC [Radeon All in Wonder 8500]", |
" 4336 Radeon Mobility U1", |
" 1002 4336 Pavilion ze4300 ATI Radeon Mobility U1 (IGP 320 M)", |
" 103c 0024 Pavilion ze4400 builtin Video", |
" 161f 2029 eMachines M5312 builtin Video", |
" 4337 Radeon IGP 330M/340M/350M", |
" 1014 053a ThinkPad R40e (2684-HVG) builtin VGA controller", |
" 103c 0850 Radeon IGP 345M", |
" 4341 IXP150 AC'97 Audio Controller", |
" 4345 EHCI USB Controller", |
" 4347 OHCI USB Controller #1", |
" 4348 OHCI USB Controller #2", |
" 4349 ATI Dual Channel Bus Master PCI IDE Controller", |
" 434d IXP AC'97 Modem", |
" 4353 ATI SMBus", |
" 4354 215CT [Mach64 CT]", |
" 4358 210888CX [Mach64 CX]", |
" 4363 ATI SMBus", |
" 436e ATI 436E Serial ATA Controller", |
" 4370 IXP SB400 AC'97 Audio Controller", |
" 1025 0079 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 107b 0300 MX6421", |
" 4371 IXP SB400 PCI-PCI Bridge", |
" 103c 308b MX6125", |
" 4372 IXP SB400 SMBus Controller", |
" 1025 0080 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 4373 IXP SB400 USB2 Host Controller", |
" 1025 0080 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 4374 IXP SB400 USB Host Controller", |
" 103c 308b MX6125", |
" 4375 IXP SB400 USB Host Controller", |
" 1025 0080 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 4376 Standard Dual Channel PCI IDE Controller ATI", |
" 1025 0080 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 4377 IXP SB400 PCI-ISA Bridge", |
" 1025 0080 Aspire 5024WLMi", |
" 103c 308b MX6125", |
" 4378 ATI SB400 - AC'97 Modem Controller", |
" 1025 0080 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 4379 ATI 4379 Serial ATA Controller", |
" 437a ATI 437A Serial ATA Controller", |
" 437b SB450 HDA Audio", |
" 4380 SB600 Non-Raid-5 SATA", |
" 4381 SB600 Raid-5 SATA", |
" 4382 SB600 AC97 Audio", |
" 4383 SB600 Azalia", |
" 4384 SB600 PCI to PCI Bridge", |
" 4385 SB600 SMBus", |
" 4386 SB600 USB Controller (EHCI)", |
" 4387 SB600 USB (OHCI0)", |
" 4388 SB600 USB (OHCI1)", |
" 4389 SB600 USB (OHCI2)", |
" 438a SB600 USB (OHCI3)", |
" 438b SB600 USB (OHCI4)", |
" 438c SB600 IDE", |
" 438d SB600 PCI to LPC Bridge", |
" 438e SB600 AC97 Modem", |
" 4437 Radeon Mobility 7000 IGP", |
" 4554 210888ET [Mach64 ET]", |
" 4654 Mach64 VT", |
" 4742 3D Rage Pro AGP 1X/2X", |
" 1002 0040 Rage Pro Turbo AGP 2X", |
" 1002 0044 Rage Pro Turbo AGP 2X", |
" 1002 0061 Rage Pro AIW AGP 2X", |
" 1002 0062 Rage Pro AIW AGP 2X", |
" 1002 0063 Rage Pro AIW AGP 2X", |
" 1002 0080 Rage Pro Turbo AGP 2X", |
" 1002 0084 Rage Pro Turbo AGP 2X", |
" 1002 4742 Rage Pro Turbo AGP 2X", |
" 1002 8001 Rage Pro Turbo AGP 2X", |
" 1028 0082 Rage Pro Turbo AGP 2X", |
" 1028 4082 Optiplex GX1 Onboard Display Adapter", |
" 1028 8082 Rage Pro Turbo AGP 2X", |
" 1028 c082 Rage Pro Turbo AGP 2X", |
" 8086 4152 Xpert 98D AGP 2X", |
" 8086 464a Rage Pro Turbo AGP 2X", |
" 4744 3D Rage Pro AGP 1X", |
" 1002 4744 Rage Pro Turbo AGP", |
" 4747 3D Rage Pro", |
" 4749 3D Rage Pro", |
" 1002 0061 Rage Pro AIW", |
" 1002 0062 Rage Pro AIW", |
" 474c Rage XC", |
" 474d Rage XL AGP 2X", |
" 1002 0004 Xpert 98 RXL AGP 2X", |
" 1002 0008 Xpert 98 RXL AGP 2X", |
" 1002 0080 Rage XL AGP 2X", |
" 1002 0084 Xpert 98 AGP 2X", |
" 1002 474d Rage XL AGP", |
" 1033 806a Rage XL AGP", |
" 474e Rage XC AGP", |
" 1002 474e Rage XC AGP", |
" 474f Rage XL", |
" 1002 0008 Rage XL", |
" 1002 474f Rage XL", |
" 4750 3D Rage Pro 215GP", |
" 1002 0040 Rage Pro Turbo", |
" 1002 0044 Rage Pro Turbo", |
" 1002 0080 Rage Pro Turbo", |
" 1002 0084 Rage Pro Turbo", |
" 1002 4750 Rage Pro Turbo", |
" 4751 3D Rage Pro 215GQ", |
" 4752 Rage XL", |
" 0e11 001e Proliant Rage XL", |
" 1002 0008 Rage XL", |
" 1002 4752 Proliant Rage XL", |
" 1002 8008 Rage XL", |
" 1028 00ce PowerEdge 1400", |
" 1028 00d1 PowerEdge 2550", |
" 1028 00d9 PowerEdge 2500", |
" 1028 0134 Poweredge SC600", |
" 103c 10e1 NetServer Rage XL", |
" 1734 007a Primergy RX300", |
" 8086 3411 SDS2 Mainboard", |
" 8086 3427 S875WP1-E mainboard", |
" 4753 Rage XC", |
" 1002 4753 Rage XC", |
" 4754 3D Rage I/II 215GT [Mach64 GT]", |
" 4755 3D Rage II+ 215GTB [Mach64 GTB]", |
" 4756 3D Rage IIC 215IIC [Mach64 GT IIC]", |
" 1002 4756 Rage IIC", |
" 4757 3D Rage IIC AGP", |
" 1002 4757 Rage IIC AGP", |
" 1028 0089 Rage 3D IIC", |
" 1028 008e PowerEdge 1300 onboard video", |
" 1028 4082 Rage 3D IIC", |
" 1028 8082 Rage 3D IIC", |
" 1028 c082 Rage 3D IIC", |
" 4758 210888GX [Mach64 GX]", |
" 4759 3D Rage IIC", |
" 475a 3D Rage IIC AGP", |
" 1002 0084 Rage 3D Pro AGP 2x XPERT 98", |
" 1002 0087 Rage 3D IIC", |
" 1002 475a Rage IIC AGP", |
" 4964 Radeon RV250 Id [Radeon 9000]", |
" 4965 Radeon RV250 Ie [Radeon 9000]", |
" 4966 Radeon RV250 If [Radeon 9000]", |
" 10f1 0002 RV250 If [Tachyon G9000 PRO]", |
" 148c 2039 RV250 If [Radeon 9000 Pro 'Evil Commando']", |
" 1509 9a00 RV250 If [Radeon 9000 'AT009']", |
" 1681 0040 RV250 If [3D prophet 9000]", |
" 174b 7176 RV250 If [Sapphire Radeon 9000 Pro]", |
" 174b 7192 RV250 If [Radeon 9000 'Atlantis']", |
" 17af 2005 RV250 If [Excalibur Radeon 9000 Pro]", |
" 17af 2006 RV250 If [Excalibur Radeon 9000]", |
" 4967 Radeon RV250 Ig [Radeon 9000]", |
" 496e Radeon RV250 [Radeon 9000] (Secondary)", |
" 4a48 R420 JH [Radeon X800]", |
" 4a49 R420 JI [Radeon X800PRO]", |
" 4a4a R420 JJ [Radeon X800SE]", |
" 4a4b R420 JK [Radeon X800]", |
" 4a4c R420 JL [Radeon X800]", |
" 4a4d R420 JM [FireGL X3]", |
" 4a4e M18 JN [Radeon Mobility 9800]", |
" 4a50 R420 JP [Radeon X800XT]", |
" 4a70 R420 [X800XT-PE] (Secondary)", |
" 4b49 R480 [Radeon X850XT]", |
" 4b4b R480 [Radeon X850Pro]", |
" 4b4c R481 [Radeon X850XT-PE]", |
" 4b69 R480 [Radeon X850XT] (Secondary)", |
" 4b6b R480 [Radeon X850Pro] (Secondary)", |
" 4b6c R481 [Radeon X850XT-PE] (Secondary)", |
" 4c42 3D Rage LT Pro AGP-133", |
" 0e11 b0e7 Rage LT Pro (Compaq Presario 5240)", |
" 0e11 b0e8 Rage 3D LT Pro", |
" 0e11 b10e 3D Rage LT Pro (Compaq Armada 1750)", |
" 1002 0040 Rage LT Pro AGP 2X", |
" 1002 0044 Rage LT Pro AGP 2X", |
" 1002 4c42 Rage LT Pro AGP 2X", |
" 1002 8001 Rage LT Pro AGP 2X", |
" 1028 0085 Rage 3D LT Pro", |
" 4c44 3D Rage LT Pro AGP-66", |
" 4c45 Rage Mobility M3 AGP", |
" 4c46 Rage Mobility M3 AGP 2x", |
" 1028 00b1 Latitude C600", |
" 4c47 3D Rage LT-G 215LG", |
" 4c49 3D Rage LT Pro", |
" 1002 0004 Rage LT Pro", |
" 1002 0040 Rage LT Pro", |
" 1002 0044 Rage LT Pro", |
" 1002 4c49 Rage LT Pro", |
" 4c4d Rage Mobility P/M AGP 2x", |
" 0e11 b111 Armada M700", |
" 0e11 b160 Armada E500", |
" 1002 0084 Xpert 98 AGP 2X (Mobility)", |
" 1014 0154 ThinkPad A20m/A21m", |
" 1028 00aa Latitude CPt", |
" 1028 00bb Latitude CPx", |
" 10e1 10cf Fujitsu Siemens LifeBook C Series", |
" 1179 ff00 Satellite 1715XCDS laptop", |
" 13bd 1019 PC-AR10", |
" 4c4e Rage Mobility L AGP 2x", |
" 4c50 3D Rage LT Pro", |
" 1002 4c50 Rage LT Pro", |
" 4c51 3D Rage LT Pro", |
" 4c52 Rage Mobility P/M", |
" 1033 8112 Versa Note VXi", |
" 4c53 Rage Mobility L", |
" 4c54 264LT [Mach64 LT]", |
" 4c57 Radeon Mobility M7 LW [Radeon Mobility 7500]", |
" 1014 0517 ThinkPad T30", |
" 1028 00e6 Radeon Mobility M7 LW (Dell Inspiron 8100)", |
" 1028 012a Latitude C640", |
" 144d c006 Radeon Mobility M7 LW in vpr Matrix 170B4", |
" 4c58 Radeon RV200 LX [Mobility FireGL 7800 M7]", |
" 4c59 Radeon Mobility M6 LY", |
" 0e11 b111 Evo N600c", |
" 1014 0235 ThinkPad A30/A30p (2652/2653)", |
" 1014 0239 ThinkPad X22/X23/X24", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 104d 8140 PCG-Z1SP laptop", |
" 1509 1930 Medion MD9703", |
" 4c5a Radeon Mobility M6 LZ", |
" 4c64 Radeon R250 Ld [Radeon Mobility 9000 M9]", |
" 4c65 Radeon R250 Le [Radeon Mobility 9000 M9]", |
" 4c66 Radeon R250 [Radeon Mobility 9200]", |
" 4c67 Radeon R250 Lg [Radeon Mobility 9000 M9]", |
" 4c6e Radeon R250 Ln [Radeon Mobility 9000 M9] [Secondary]", |
" 4d46 Rage Mobility M4 AGP", |
" 4d4c Rage Mobility M4 AGP", |
" 4e44 Radeon R300 ND [Radeon 9700 Pro]", |
" 1002 515e Radeon ES1000", |
" 1002 5965 Radeon ES1000", |
" 4e45 Radeon R300 NE [Radeon 9500 Pro]", |
" 1002 0002 Radeon R300 NE [Radeon 9500 Pro]", |
" 1681 0002 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro]", |
" 4e46 RV350 NF [Radeon 9600]", |
" 4e47 Radeon R300 NG [FireGL X1]", |
" 4e48 Radeon R350 [Radeon 9800 Pro]", |
" 4e49 Radeon R350 [Radeon 9800]", |
" 4e4a RV350 NJ [Radeon 9800 XT]", |
" 4e4b R350 NK [Fire GL X2]", |
" 4e50 RV350 [Mobility Radeon 9600 M10]", |
" 1025 005a TravelMate 290", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1462 0311 MSI M510A", |
" 1734 1055 Amilo M1420W", |
" 4e51 M10 NQ [Radeon Mobility 9600]", |
" 4e52 RV350 [Mobility Radeon 9600 M10]", |
" 4e53 M10 NS [Radeon Mobility 9600]", |
" 4e54 M10 NT [FireGL Mobility T2]", |
" 4e56 M11 NV [FireGL Mobility T2e]", |
" 4e64 Radeon R300 [Radeon 9700 Pro] (Secondary)", |
" 4e65 Radeon R300 [Radeon 9500 Pro] (Secondary)", |
" 1002 0003 Radeon R300 NE [Radeon 9500 Pro]", |
" 1681 0003 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] (Secondary)", |
" 4e66 RV350 NF [Radeon 9600] (Secondary)", |
" 4e67 Radeon R300 [FireGL X1] (Secondary)", |
" 4e68 Radeon R350 [Radeon 9800 Pro] (Secondary)", |
" 4e69 Radeon R350 [Radeon 9800] (Secondary)", |
" 4e6a RV350 NJ [Radeon 9800 XT] (Secondary)", |
" 1002 4e71 ATI Technologies Inc M10 NQ [Radeon Mobility 9600]", |
" 4e71 M10 NQ [Radeon Mobility 9600] (Secondary)", |
" 4f72 RV250 [Radeon 9000 Series]", |
" 4f73 Radeon RV250 [Radeon 9000 Series] (Secondary)", |
" 5041 Rage 128 PA/PRO", |
" 5042 Rage 128 PB/PRO AGP 2x", |
" 5043 Rage 128 PC/PRO AGP 4x", |
" 5044 Rage 128 PD/PRO TMDS", |
" 1002 0028 Rage 128 AIW", |
" 1002 0029 Rage 128 AIW", |
" 5045 Rage 128 PE/PRO AGP 2x TMDS", |
" 5046 Rage 128 PF/PRO AGP 4x TMDS", |
" 1002 0004 Rage Fury Pro", |
" 1002 0008 Rage Fury Pro/Xpert 2000 Pro", |
" 1002 0014 Rage Fury Pro", |
" 1002 0018 Rage Fury Pro/Xpert 2000 Pro", |
" 1002 0028 Rage 128 Pro AIW AGP", |
" 1002 002a Rage 128 Pro AIW AGP", |
" 1002 0048 Rage Fury Pro", |
" 1002 2000 Rage Fury MAXX AGP 4x (TMDS) (VGA device)", |
" 1002 2001 Rage Fury MAXX AGP 4x (TMDS) (Extra device?!)", |
" 5047 Rage 128 PG/PRO", |
" 5048 Rage 128 PH/PRO AGP 2x", |
" 5049 Rage 128 PI/PRO AGP 4x", |
" 504a Rage 128 PJ/PRO TMDS", |
" 504b Rage 128 PK/PRO AGP 2x TMDS", |
" 504c Rage 128 PL/PRO AGP 4x TMDS", |
" 504d Rage 128 PM/PRO", |
" 504e Rage 128 PN/PRO AGP 2x", |
" 504f Rage 128 PO/PRO AGP 4x", |
" 5050 Rage 128 PP/PRO TMDS [Xpert 128]", |
" 1002 0008 Xpert 128", |
" 5051 Rage 128 PQ/PRO AGP 2x TMDS", |
" 5052 Rage 128 PR/PRO AGP 4x TMDS", |
" 5053 Rage 128 PS/PRO", |
" 5054 Rage 128 PT/PRO AGP 2x", |
" 5055 Rage 128 PU/PRO AGP 4x", |
" 5056 Rage 128 PV/PRO TMDS", |
" 5057 Rage 128 PW/PRO AGP 2x TMDS", |
" 5058 Rage 128 PX/PRO AGP 4x TMDS", |
" 5144 Radeon R100 QD [Radeon 7200]", |
" 1002 0008 Radeon 7000/Radeon VE", |
" 1002 0009 Radeon 7000/Radeon", |
" 1002 000a Radeon 7000/Radeon", |
" 1002 001a Radeon 7000/Radeon", |
" 1002 0029 Radeon AIW", |
" 1002 0038 Radeon 7000/Radeon", |
" 1002 0039 Radeon 7000/Radeon", |
" 1002 008a Radeon 7000/Radeon", |
" 1002 00ba Radeon 7000/Radeon", |
" 1002 0139 Radeon 7000/Radeon", |
" 1002 028a Radeon 7000/Radeon", |
" 1002 02aa Radeon AIW", |
" 1002 053a Radeon 7000/Radeon", |
" 5145 Radeon R100 QE", |
" 5146 Radeon R100 QF", |
" 5147 Radeon R100 QG", |
" 5148 Radeon R200 QH [Radeon 8500]", |
" 1002 010a FireGL 8800 64Mb", |
" 1002 0152 FireGL 8800 128Mb", |
" 1002 0162 FireGL 8700 32Mb", |
" 1002 0172 FireGL 8700 64Mb", |
" 5149 Radeon R200 QI", |
" 514a Radeon R200 QJ", |
" 514b Radeon R200 QK", |
" 514c Radeon R200 QL [Radeon 8500 LE]", |
" 1002 003a Radeon R200 QL [Radeon 8500 LE]", |
" 1002 013a Radeon 8500", |
" 148c 2026 R200 QL [Radeon 8500 Evil Master II Multi Display Edition]", |
" 1681 0010 Radeon 8500 [3D Prophet 8500 128Mb]", |
" 174b 7149 Radeon R200 QL [Sapphire Radeon 8500 LE]", |
" 514d Radeon R200 QM [Radeon 9100]", |
" 514e Radeon R200 QN [Radeon 8500LE]", |
" 514f Radeon R200 QO [Radeon 8500LE]", |
" 5154 R200 QT [Radeon 8500]", |
" 5155 R200 QU [Radeon 9100]", |
" 5157 Radeon RV200 QW [Radeon 7500]", |
" 1002 013a Radeon 7500", |
" 1002 103a Dell Optiplex GX260", |
" 1458 4000 RV200 QW [RADEON 7500 PRO MAYA AR]", |
" 148c 2024 RV200 QW [Radeon 7500LE Dual Display]", |
" 148c 2025 RV200 QW [Radeon 7500 Evil Master Multi Display Edition]", |
" 148c 2036 RV200 QW [Radeon 7500 PCI Dual Display]", |
" 174b 7146 RV200 QW [Radeon 7500 LE]", |
" 174b 7147 RV200 QW [Sapphire Radeon 7500LE]", |
" 174b 7161 Radeon RV200 QW [Radeon 7500 LE]", |
" 17af 0202 RV200 QW [Excalibur Radeon 7500LE]", |
" 5158 Radeon RV200 QX [Radeon 7500]", |
" 5159 Radeon RV100 QY [Radeon 7000/VE]", |
" 1002 000a Radeon 7000/Radeon VE", |
" 1002 000b Radeon 7000", |
" 1002 0038 Radeon 7000/Radeon VE", |
" 1002 003a Radeon 7000/Radeon VE", |
" 1002 00ba Radeon 7000/Radeon VE", |
" 1002 013a Radeon 7000/Radeon VE", |
" 1002 0908 XVR-100 (supplied by Sun)", |
" 1014 029a Remote Supervisor Adapter II (RSA2)", |
" 1014 02c8 IBM eServer xSeries server mainboard", |
" 1028 019a PowerEdge SC1425", |
" 1458 4002 RV100 QY [RADEON 7000 PRO MAYA AV Series]", |
" 148c 2003 RV100 QY [Radeon 7000 Multi-Display Edition]", |
" 148c 2023 RV100 QY [Radeon 7000 Evil Master Multi-Display]", |
" 174b 7112 RV100 QY [Sapphire Radeon VE 7000]", |
" 174b 7c28 Sapphire Radeon VE 7000 DDR", |
" 1787 0202 RV100 QY [Excalibur Radeon 7000]", |
" 515a Radeon RV100 QZ [Radeon 7000/VE]", |
" 515e ES1000", |
" 515f ES1000", |
" 5168 Radeon R200 Qh", |
" 5169 Radeon R200 Qi", |
" 516a Radeon R200 Qj", |
" 516b Radeon R200 Qk", |
" 516c Radeon R200 Ql", |
" 5245 Rage 128 RE/SG", |
" 1002 0008 Xpert 128", |
" 1002 0028 Rage 128 AIW", |
" 1002 0029 Rage 128 AIW", |
" 1002 0068 Rage 128 AIW", |
" 5246 Rage 128 RF/SG AGP", |
" 1002 0004 Magnum/Xpert 128/Xpert 99", |
" 1002 0008 Magnum/Xpert128/X99/Xpert2000", |
" 1002 0028 Rage 128 AIW AGP", |
" 1002 0044 Rage Fury/Xpert 128/Xpert 2000", |
" 1002 0068 Rage 128 AIW AGP", |
" 1002 0448 Rage Fury", |
" 5247 Rage 128 RG", |
" 524b Rage 128 RK/VR", |
" 524c Rage 128 RL/VR AGP", |
" 1002 0008 Xpert 99/Xpert 2000", |
" 1002 0088 Xpert 99", |
" 5345 Rage 128 SE/4x", |
" 5346 Rage 128 SF/4x AGP 2x", |
" 1002 0048 RAGE 128 16MB VGA TVOUT AMC PAL", |
" 5347 Rage 128 SG/4x AGP 4x", |
" 5348 Rage 128 SH", |
" 534b Rage 128 SK/4x", |
" 534c Rage 128 SL/4x AGP 2x", |
" 534d Rage 128 SM/4x AGP 4x", |
" 1002 0008 Xpert 99/Xpert 2000", |
" 1002 0018 Xpert 2000", |
" 534e Rage 128 4x", |
" 5354 Mach 64 VT", |
" 1002 5654 Mach 64 reference", |
" 5446 Rage 128 Pro Ultra TF", |
" 1002 0004 Rage Fury Pro", |
" 1002 0008 Rage Fury Pro/Xpert 2000 Pro", |
" 1002 0018 Rage Fury Pro/Xpert 2000 Pro", |
" 1002 0028 Rage 128 AIW Pro AGP", |
" 1002 0029 Rage 128 AIW", |
" 1002 002a Rage 128 AIW Pro AGP", |
" 1002 002b Rage 128 AIW", |
" 1002 0048 Xpert 2000 Pro", |
" 544c Rage 128 Pro Ultra TL", |
" 5452 Rage 128 Pro Ultra TR", |
" 1002 001c Rage 128 Pro 4XL", |
" 103c 1279 Rage 128 Pro 4XL", |
" 5453 Rage 128 Pro Ultra TS", |
" 5454 Rage 128 Pro Ultra TT", |
" 5455 Rage 128 Pro Ultra TU", |
" 5460 M22 [Radeon Mobility M300]", |
" 5462 M24 [Radeon Mobility X600]", |
" 5464 M22 [FireGL GL]", |
" 5548 R423 UH [Radeon X800 (PCIE)]", |
" 5549 R423 UI [Radeon X800PRO (PCIE)]", |
" 554a R423 UJ [Radeon X800LE (PCIE)]", |
" 554b R423 UK [Radeon X800SE (PCIE)]", |
" 554d R430 [Radeon X800 XL] (PCIe)", |
" 554f R430 [Radeon X800 (PCIE)]", |
" 5550 R423 [Fire GL V7100]", |
" 5551 R423 UQ [FireGL V7200 (PCIE)]", |
" 5552 R423 UR [FireGL V5100 (PCIE)]", |
" 5554 R423 UT [FireGL V7100 (PCIE)]", |
" 556b Radeon R423 UK (PCIE) [X800 SE] (Secondary)", |
" 556d R430 [Radeon X800 XL] (PCIe) Secondary", |
" 556f R430 [Radeon X800 (PCIE) Secondary]", |
" 564a M26 [Mobility FireGL V5000]", |
" 564b M26 [Mobility FireGL V5000]", |
" 564f M26 [Radeon Mobility X700 XL] (PCIE)", |
" 5652 M26 [Radeon Mobility X700]", |
" 5653 Radeon Mobility X700 (PCIE)", |
" 1025 0080 Aspire 5024WLMi", |
" 5654 264VT [Mach64 VT]", |
" 1002 5654 Mach64VT Reference", |
" 5655 264VT3 [Mach64 VT3]", |
" 5656 264VT4 [Mach64 VT4]", |
" 5830 RS300 Host Bridge", |
" 5831 RS300 Host Bridge", |
" 5832 RS300 Host Bridge", |
" 5833 Radeon 9100 IGP Host Bridge", |
" 5834 Radeon 9100 IGP", |
" 5835 RS300M AGP [Radeon Mobility 9100IGP]", |
" 5838 Radeon 9100 IGP AGP Bridge", |
" 5940 RV280 [Radeon 9200 PRO] (Secondary)", |
" 5941 RV280 [Radeon 9200] (Secondary)", |
" 1458 4019 Gigabyte Radeon 9200", |
" 174b 7c12 Sapphire Radeon 9200", |
" 17af 200d Excalibur Radeon 9200", |
" 18bc 0050 GeXcube GC-R9200-C3 (Secondary)", |
" 5944 RV280 [Radeon 9200 SE (PCI)]", |
" 5950 RS480 Host Bridge", |
" 1025 0080 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 5951 ATI Radeon Xpress 200 (RS480/RS482/RX480/RX482) Chipset - Host bridge", |
" 5954 RS480 [Radeon Xpress 200G Series]", |
" 1002 5954 RV370 [Radeon Xpress 200G Series]", |
" 5955 ATI Radeon XPRESS 200M 5955 (PCIE)", |
" 1002 5955 RS480 0x5955 [ATI Radeon XPRESS 200M 5955 (PCIE)]", |
" 103c 308b MX6125", |
" 5960 RV280 [Radeon 9200 PRO]", |
" 5961 RV280 [Radeon 9200]", |
" 1002 2f72 All-in-Wonder 9200 Series", |
" 1019 4c30 Radeon 9200 VIVO", |
" 12ab 5961 YUAN SMARTVGA Radeon 9200", |
" 1458 4018 Gigabyte Radeon 9200", |
" 174b 7c13 Sapphire Radeon 9200", |
" 17af 200c Excalibur Radeon 9200", |
" 18bc 0050 Radeon 9200 Game Buster", |
" 18bc 0051 GeXcube GC-R9200-C3", |
" 18bc 0053 Radeon 9200 Game Buster VIVO", |
" 5962 RV280 [Radeon 9200]", |
" 5964 RV280 [Radeon 9200 SE]", |
" 1043 c006 ASUS Radeon 9200 SE / TD / 128M", |
" 1458 4018 Radeon 9200 SE", |
" 1458 4032 Radeon 9200 SE 128MB", |
" 147b 6191 R9200SE-DT", |
" 148c 2073 CN-AG92E", |
" 174b 7c13 Sapphire Radeon 9200 SE", |
" 1787 5964 Excalibur 9200SE VIVO 128M", |
" 17af 2012 Radeon 9200 SE Excalibur", |
" 18bc 0170 Sapphire Radeon 9200 SE 128MB Game Buster", |
" 18bc 0173 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster]", |
" 5969 ES1000", |
" 5974 RS482 [Radeon Xpress 200]", |
" 5975 RS482 [Radeon Xpress 200M]", |
" 5a34 RS480 PCI-X Root Port", |
" 5a36 RS480 PCI Bridge", |
" 5a38 RS480 PCI Bridge", |
" 5a39 RS480 PCI Bridge", |
" 5a3f RS480 PCI Bridge", |
" 5a41 RS400 [Radeon Xpress 200]", |
" 5a42 RS400 [Radeon Xpress 200M]", |
" 5a61 RC410 [Radeon Xpress 200]", |
" 5a62 RC410 [Radeon Xpress 200M]", |
" 5b60 RV370 5B60 [Radeon X300 (PCIE)]", |
" 1043 002a Extreme AX300SE-X", |
" 1043 032e Extreme AX300/TD", |
" 1462 0400 RX300SE-TD128E (MS-8940 REV:200)", |
" 1462 0402 RX300SE-TD128E (MS-8940)", |
" 5b62 RV370 5B62 [Radeon X600 (PCIE)]", |
" 5b63 RV370 [Sapphire X550 Silent]", |
" 5b64 RV370 5B64 [FireGL V3100 (PCIE)]", |
" 5b65 RV370 5B65 [FireGL D1100 (PCIE)]", |
" 5b70 RV370 [Radeon X300SE]", |
" 1462 0403 RX300SE-TD128E (MS-8940) (secondary display)", |
" 5b72 Radeon X600(RV380)", |
" 5b73 RV370 secondary [Sapphire X550 Silent]", |
" 5b74 RV370 5B64 [FireGL V3100 (PCIE)] (Secondary)", |
" 5c61 M9+ 5C61 [Radeon Mobility 9200 (AGP)]", |
" 5c63 M9+ 5C63 [Radeon Mobility 9200 (AGP)]", |
" 1002 5c63 Apple iBook G4 2004", |
" 5d44 RV280 [Radeon 9200 SE] (Secondary)", |
" 1458 4019 Radeon 9200 SE (Secondary)", |
" 1458 4032 Radeon 9200 SE 128MB", |
" 174b 7c12 Sapphire Radeon 9200 SE (Secondary)", |
" 1787 5965 Excalibur 9200SE VIVO 128M (Secondary)", |
" 17af 2013 Radeon 9200 SE Excalibur (Secondary)", |
" 18bc 0171 Radeon 9200 SE 128MB Game Buster (Secondary)", |
" 18bc 0172 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster]", |
" 5d48 M28 [Radeon Mobility X800XT]", |
" 5d49 M28 [Mobility FireGL V5100]", |
" 5d4a Mobility Radeon X800", |
" 5d4d R480 [Radeon X850XT Platinum (PCIE)]", |
" 5d4f R480 [Radeon X800 GTO (PCIE)]", |
" 5d52 R480 [Radeon X850XT (PCIE)] (Primary)", |
" 1002 0b12 PowerColor X850XT PCIe Primary", |
" 1002 0b13 PowerColor X850XT PCIe Secondary", |
" 5d57 R423 5F57 [Radeon X800XT (PCIE)]", |
" 5d6d R480 [Radeon X850XT Platinum (PCIE)] (Secondary)", |
" 5d6f R480 [Radeon X800 GTO (PCIE)] (Secondary)", |
" 5d72 R480 [Radeon X850XT (PCIE)] (Secondary)", |
" 5d77 R423 5F57 [Radeon X800XT (PCIE)] (Secondary)", |
" 5e48 RV410 [FireGL V5000]", |
" 5e49 RV410 [FireGL V3300]", |
" 5e4a RV410 [Radeon X700XT]", |
" 5e4b RV410 [Radeon X700 Pro (PCIE)]", |
" 5e4c RV410 [Radeon X700SE]", |
" 5e4d RV410 [Radeon X700 (PCIE)]", |
" 148c 2116 PowerColor Bravo X700", |
" 5e4f RV410 [Radeon X700]", |
" 5e6b RV410 [Radeon X700 Pro (PCIE)] Secondary", |
" 5e6d RV410 [Radeon X700 (PCIE)] (Secondary)", |
" 148c 2117 PowerColor Bravo X700", |
" 5f57 R423 [Radeon X800XT (PCIE)]", |
" 700f PCI Bridge [IGP 320M]", |
" 7010 PCI Bridge [IGP 340M]", |
" 7100 R520 [Radeon X1800]", |
" 7105 R520 [FireGL]", |
" 7109 R520 [Radeon X1800]", |
" 1002 0322 All-in-Wonder X1800XL", |
" 1002 0d02 Radeon X1800 CrossFire Edition", |
" 7120 R520 [Radeon X1800] (Secondary)", |
" 7129 R520 [Radeon X1800] (Secondary)", |
" 1002 0323 All-in-Wonder X1800XL (Secondary)", |
" 1002 0d03 Radeon X1800 CrossFire Edition (Secondary)", |
" 7142 RV515 [Radeon X1300]", |
" 1002 0322 All-in-Wonder 2006 PCI-E Edition", |
" 7145 Radeon Mobility X1400", |
" 7146 RV515 [Radeon X1300]", |
" 1002 0322 All-in-Wonder 2006 PCI-E Edition", |
" 7149 M52 [ATI Mobility Radeon X1300]", |
" 714a M52 [ATI Mobility Radeon X1300]", |
" 714b M52 [ATI Mobility Radeon X1300]", |
" 714c M52 [ATI Mobility Radeon X1300]", |
" 7162 RV515 [Radeon X1300] (Secondary)", |
" 1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary)", |
" 7166 RV515 [Radeon X1300] (Secondary)", |
" 1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary)", |
" 71c0 RV530 [Radeon X1600]", |
" 71c2 RV530 [Radeon X1600]", |
" 71c4 M56GL [ATI Mobility FireGL V5200]", |
" 71c5 M56P [Radeon Mobility X1600]", |
" 71e0 RV530 [Radeon X1600] (Secondary)", |
" 71e2 RV530 [Radeon X1600] (Secondary)", |
" 7833 Radeon 9100 IGP Host Bridge", |
" 7834 Radeon 9100 PRO IGP", |
" 7835 Radeon Mobility 9200 IGP", |
" 7838 Radeon 9100 IGP PCI/AGP Bridge", |
" 7c37 RV350 AQ [Radeon 9600 SE]", |
" cab0 AGP Bridge [IGP 320M]", |
" cab2 RS200/RS200M AGP Bridge [IGP 340M]", |
" cab3 R200 AGP Bridge [Mobility Radeon 7000 IGP]", |
" cbb2 RS200/RS200M AGP Bridge [IGP 340M]", |
"1003 ULSI Systems", |
" 0201 US201", |
"1004 VLSI Technology Inc", |
" 0005 82C592-FC1", |
" 0006 82C593-FC1", |
" 0007 82C594-AFC2", |
" 0008 82C596/7 [Wildcat]", |
" 0009 82C597-AFC2", |
" 000c 82C541 [Lynx]", |
" 000d 82C543 [Lynx]", |
" 0101 82C532", |
" 0102 82C534 [Eagle]", |
" 0103 82C538", |
" 0104 82C535", |
" 0105 82C147", |
" 0200 82C975", |
" 0280 82C925", |
" 0304 QSound ThunderBird PCI Audio", |
" 1004 0304 QSound ThunderBird PCI Audio", |
" 122d 1206 DSP368 Audio", |
" 1483 5020 XWave Thunder 3D Audio", |
" 0305 QSound ThunderBird PCI Audio Gameport", |
" 1004 0305 QSound ThunderBird PCI Audio Gameport", |
" 122d 1207 DSP368 Audio Gameport", |
" 1483 5021 XWave Thunder 3D Audio Gameport", |
" 0306 QSound ThunderBird PCI Audio Support Registers", |
" 1004 0306 QSound ThunderBird PCI Audio Support Registers", |
" 122d 1208 DSP368 Audio Support Registers", |
" 1483 5022 XWave Thunder 3D Audio Support Registers", |
" 0307 Thunderbird", |
" 0308 Thunderbird", |
" 0702 VAS96011 [Golden Gate II]", |
" 0703 Tollgate", |
"1005 Avance Logic Inc. [ALI]", |
" 2064 ALG2032/2064", |
" 2128 ALG2364A", |
" 2301 ALG2301", |
" 2302 ALG2302", |
" 2364 ALG2364", |
" 2464 ALG2364A", |
" 2501 ALG2564A/25128A", |
"1006 Reply Group", |
"1007 NetFrame Systems Inc", |
"1008 Epson", |
"100a Phoenix Technologies", |
"100b National Semiconductor Corporation", |
" 0001 DP83810", |
" 0002 87415/87560 IDE", |
" 000e 87560 Legacy I/O", |
" 000f FireWire Controller", |
" 0011 NS87560 National PCI System I/O", |
" 0012 USB Controller", |
" 0020 DP83815 (MacPhyter) Ethernet Controller", |
" 103c 0024 Pavilion ze4400 builtin Network", |
" 12d9 000c Aculab E1/T1 PMXc cPCI carrier card", |
" 1385 f311 FA311 / FA312 (FA311 with WoL HW)", |
" 0021 PC87200 PCI to ISA Bridge", |
" 0022 DP83820 10/100/1000 Ethernet Controller", |
" 0028 Geode GX2 Host Bridge", |
" 002a CS5535 South Bridge", |
" 002b CS5535 ISA bridge", |
" 002d CS5535 IDE", |
" 002e CS5535 Audio", |
" 002f CS5535 USB", |
" 0030 Geode GX2 Graphics Processor", |
" 0035 DP83065 [Saturn] 10/100/1000 Ethernet Controller", |
" 0500 SCx200 Bridge", |
" 0501 SCx200 SMI", |
" 0502 SCx200 IDE", |
" 0503 SCx200 Audio", |
" 0504 SCx200 Video", |
" 0505 SCx200 XBus", |
" 0510 SC1100 Bridge", |
" 0511 SC1100 SMI", |
" 0515 SC1100 XBus", |
" d001 87410 IDE", |
"100c Tseng Labs Inc", |
" 3202 ET4000/W32p rev A", |
" 3205 ET4000/W32p rev B", |
" 3206 ET4000/W32p rev C", |
" 3207 ET4000/W32p rev D", |
" 3208 ET6000", |
" 4702 ET6300", |
"100d AST Research Inc", |
"100e Weitek", |
" 9000 P9000 Viper", |
" 9001 P9000 Viper", |
" 9002 P9000 Viper", |
" 9100 P9100 Viper Pro/SE", |
"1010 Video Logic, Ltd.", |
"1011 Digital Equipment Corporation", |
" 0001 DECchip 21050", |
" 0002 DECchip 21040 [Tulip]", |
" 0004 DECchip 21030 [TGA]", |
" 0007 NVRAM [Zephyr NVRAM]", |
" 0008 KZPSA [KZPSA]", |
" 0009 DECchip 21140 [FasterNet]", |
" 1025 0310 21140 Fast Ethernet", |
" 10b8 2001 SMC9332BDT EtherPower 10/100", |
" 10b8 2002 SMC9332BVT EtherPower T4 10/100", |
" 10b8 2003 SMC9334BDT EtherPower 10/100 (1-port)", |
" 1109 2400 ANA-6944A/TX Fast Ethernet", |
" 1112 2300 RNS2300 Fast Ethernet", |
" 1112 2320 RNS2320 Fast Ethernet", |
" 1112 2340 RNS2340 Fast Ethernet", |
" 1113 1207 EN-1207-TX Fast Ethernet", |
" 1186 1100 DFE-500TX Fast Ethernet", |
" 1186 1112 DFE-570TX Fast Ethernet", |
" 1186 1140 DFE-660 Cardbus Ethernet 10/100", |
" 1186 1142 DFE-660 Cardbus Ethernet 10/100", |
" 11f6 0503 Freedomline Fast Ethernet", |
" 1282 9100 AEF-380TXD Fast Ethernet", |
" 1385 1100 FA310TX Fast Ethernet", |
" 2646 0001 KNE100TX Fast Ethernet", |
" 000a 21230 Video Codec", |
" 000d PBXGB [TGA2]", |
" 000f PCI-to-PDQ Interface Chip [PFI]", |
" 1011 def1 FDDI controller (DEFPA)", |
" 103c def1 FDDI controller (3X-DEFPA)", |
" 0014 DECchip 21041 [Tulip Pass 3]", |
" 1186 0100 DE-530+", |
" 0016 DGLPB [OPPO]", |
" 0017 PV-PCI Graphics Controller (ZLXp-L)", |
" 0019 DECchip 21142/43", |
" 1011 500a DE500A Fast Ethernet", |
" 1011 500b DE500B Fast Ethernet", |
" 1014 0001 10/100 EtherJet Cardbus", |
" 1025 0315 ALN315 Fast Ethernet", |
" 1033 800c PC-9821-CS01 100BASE-TX Interface Card", |
" 1033 800d PC-9821NR-B06 100BASE-TX Interface Card", |
" 108d 0016 Rapidfire 2327 10/100 Ethernet", |
" 108d 0017 GoCard 2250 Ethernet 10/100 Cardbus", |
" 10b8 2005 SMC8032DT Extreme Ethernet 10/100", |
" 10b8 8034 SMC8034 Extreme Ethernet 10/100", |
" 10ef 8169 Cardbus Fast Ethernet", |
" 1109 2a00 ANA-6911A/TX Fast Ethernet", |
" 1109 2b00 ANA-6911A/TXC Fast Ethernet", |
" 1109 3000 ANA-6922/TX Fast Ethernet", |
" 1113 1207 Cheetah Fast Ethernet", |
" 1113 2220 Cardbus Fast Ethernet", |
" 115d 0002 Cardbus Ethernet 10/100", |
" 1179 0203 Fast Ethernet", |
" 1179 0204 Cardbus Fast Ethernet", |
" 1186 1100 DFE-500TX Fast Ethernet", |
" 1186 1101 DFE-500TX Fast Ethernet", |
" 1186 1102 DFE-500TX Fast Ethernet", |
" 1186 1112 DFE-570TX Quad Fast Ethernet", |
" 1259 2800 AT-2800Tx Fast Ethernet", |
" 1266 0004 Eagle Fast EtherMAX", |
" 12af 0019 NetFlyer Cardbus Fast Ethernet", |
" 1374 0001 Cardbus Ethernet Card 10/100", |
" 1374 0002 Cardbus Ethernet Card 10/100", |
" 1374 0007 Cardbus Ethernet Card 10/100", |
" 1374 0008 Cardbus Ethernet Card 10/100", |
" 1385 2100 FA510", |
" 1395 0001 10/100 Ethernet CardBus PC Card", |
" 13d1 ab01 EtherFast 10/100 Cardbus (PCMPC200)", |
" 14cb 0100 LNDL-100N 100Base-TX Ethernet PC Card", |
" 8086 0001 EtherExpress PRO/100 Mobile CardBus 32", |
" 001a Farallon PN9000SX Gigabit Ethernet", |
" 0021 DECchip 21052", |
" 0022 DECchip 21150", |
" 0023 DECchip 21150", |
" 0024 DECchip 21152", |
" 0025 DECchip 21153", |
" 0026 DECchip 21154", |
" 0034 56k Modem Cardbus", |
" 1374 0003 56k Modem Cardbus", |
" 0045 DECchip 21553", |
" 0046 DECchip 21554", |
" 0e11 4050 Integrated Smart Array", |
" 0e11 4051 Integrated Smart Array", |
" 0e11 4058 Integrated Smart Array", |
" 103c 10c2 Hewlett-Packard NetRAID-4M", |
" 12d9 000a IP Telephony card", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" 9005 0364 5400S (Mustang)", |
" 9005 0365 5400S (Mustang)", |
" 9005 1364 Dell PowerEdge RAID Controller 2", |
" 9005 1365 Dell PowerEdge RAID Controller 2", |
" e4bf 1000 CC8-1-BLUES", |
" 1065 StrongARM DC21285", |
" 1069 0020 DAC960P / DAC1164P", |
"1012 Micronics Computers Inc", |
"1013 Cirrus Logic", |
" 0038 GD 7548", |
" 0040 GD 7555 Flat Panel GUI Accelerator", |
" 004c GD 7556 Video/Graphics LCD/CRT Ctrlr", |
" 00a0 GD 5430/40 [Alpine]", |
" 00a2 GD 5432 [Alpine]", |
" 00a4 GD 5434-4 [Alpine]", |
" 00a8 GD 5434-8 [Alpine]", |
" 00ac GD 5436 [Alpine]", |
" 00b0 GD 5440", |
" 00b8 GD 5446", |
" 00bc GD 5480", |
" 1013 00bc CL-GD5480", |
" 00d0 GD 5462", |
" 00d2 GD 5462 [Laguna I]", |
" 00d4 GD 5464 [Laguna]", |
" 00d5 GD 5464 BD [Laguna]", |
" 00d6 GD 5465 [Laguna]", |
" 13ce 8031 Barco Metheus 2 Megapixel, Dual Head", |
" 13cf 8031 Barco Metheus 2 Megapixel, Dual Head", |
" 00e8 GD 5436U", |
" 1100 CL 6729", |
" 1110 PD 6832 PCMCIA/CardBus Ctrlr", |
" 1112 PD 6834 PCMCIA/CardBus Ctrlr", |
" 1113 PD 6833 PCMCIA/CardBus Ctrlr", |
" 1200 GD 7542 [Nordic]", |
" 1202 GD 7543 [Viking]", |
" 1204 GD 7541 [Nordic Light]", |
" 4000 MD 5620 [CLM Data Fax Voice]", |
" 4400 CD 4400", |
" 6001 CS 4610/11 [CrystalClear SoundFusion Audio Accelerator]", |
" 1014 1010 CS4610 SoundFusion Audio Accelerator", |
" 6003 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator]", |
" 1013 4280 Crystal SoundFusion PCI Audio Accelerator", |
" 1014 0153 ThinkPad A20m", |
" 153b 1136 SiXPack 5.1+", |
" 1681 0050 Game Theater XP", |
" 1681 a011 Fortissimo III 7.1", |
" 6004 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator]", |
" 6005 Crystal CS4281 PCI Audio", |
" 1013 4281 Crystal CS4281 PCI Audio", |
" 10cf 10a8 Crystal CS4281 PCI Audio", |
" 10cf 10a9 Crystal CS4281 PCI Audio", |
" 10cf 10aa Crystal CS4281 PCI Audio", |
" 10cf 10ab Crystal CS4281 PCI Audio", |
" 10cf 10ac Crystal CS4281 PCI Audio", |
" 10cf 10ad Crystal CS4281 PCI Audio", |
" 10cf 10b4 Crystal CS4281 PCI Audio", |
" 1179 0001 Crystal CS4281 PCI Audio", |
" 14c0 000c Crystal CS4281 PCI Audio", |
"1014 IBM", |
" 0002 PCI to MCA Bridge", |
" 0005 Alta Lite", |
" 0007 Alta MP", |
" 000a Fire Coral", |
" 0017 CPU to PCI Bridge", |
" 0018 TR Auto LANstreamer", |
" 001b GXT-150P", |
" 001c Carrera", |
" 001d 82G2675", |
" 0020 GXT1000 Graphics Adapter", |
" 0022 IBM27-82351", |
" 002d Python", |
" 002e SCSI RAID Adapter [ServeRAID]", |
" 1014 002e ServeRAID-3x", |
" 1014 022e ServeRAID-4H", |
" 0031 2 Port Serial Adapter", |
" 1014 0031 2721 WAN IOA - 2 Port Sync Serial Adapter", |
" 0036 Miami", |
" 0037 82660 CPU to PCI Bridge", |
" 003a CPU to PCI Bridge", |
" 003c GXT250P/GXT255P Graphics Adapter", |
" 003e 16/4 Token ring UTP/STP controller", |
" 1014 003e Token-Ring Adapter", |
" 1014 00cd Token-Ring Adapter + Wake-On-LAN", |
" 1014 00ce 16/4 Token-Ring Adapter 2", |
" 1014 00cf 16/4 Token-Ring Adapter Special", |
" 1014 00e4 High-Speed 100/16/4 Token-Ring Adapter", |
" 1014 00e5 16/4 Token-Ring Adapter 2 + Wake-On-LAN", |
" 1014 016d iSeries 2744 Card", |
" 0045 SSA Adapter", |
" 0046 MPIC interrupt controller", |
" 0047 PCI to PCI Bridge", |
" 0048 PCI to PCI Bridge", |
" 0049 Warhead SCSI Controller", |
" 004e ATM Controller (14104e00)", |
" 004f ATM Controller (14104f00)", |
" 0050 ATM Controller (14105000)", |
" 0053 25 MBit ATM Controller", |
" 0054 GXT500P/GXT550P Graphics Adapter", |
" 0057 MPEG PCI Bridge", |
" 005c i82557B 10/100", |
" 005e GXT800P Graphics Adapter", |
" 007c ATM Controller (14107c00)", |
" 007d 3780IDSP [MWave]", |
" 008b EADS PCI to PCI Bridge", |
" 008e GXT3000P Graphics Adapter", |
" 0090 GXT 3000P", |
" 1014 008e GXT-3000P", |
" 0091 SSA Adapter", |
" 0095 20H2999 PCI Docking Bridge", |
" 0096 Chukar chipset SCSI controller", |
" 1014 0097 iSeries 2778 DASD IOA", |
" 1014 0098 iSeries 2763 DASD IOA", |
" 1014 0099 iSeries 2748 DASD IOA", |
" 009f PCI 4758 Cryptographic Accelerator", |
" 00a5 ATM Controller (1410a500)", |
" 00a6 ATM 155MBPS MM Controller (1410a600)", |
" 00b7 256-bit Graphics Rasterizer [Fire GL1]", |
" 1092 00b8 FireGL1 AGP 32Mb", |
" 00b8 GXT2000P Graphics Adapter", |
" 00be ATM 622MBPS Controller (1410be00)", |
" 00dc Advanced Systems Management Adapter (ASMA)", |
" 00fc CPC710 Dual Bridge and Memory Controller (PCI-64)", |
" 0104 Gigabit Ethernet-SX Adapter", |
" 0105 CPC710 Dual Bridge and Memory Controller (PCI-32)", |
" 010f Remote Supervisor Adapter (RSA)", |
" 0142 Yotta Video Compositor Input", |
" 1014 0143 Yotta Input Controller (ytin)", |
" 0144 Yotta Video Compositor Output", |
" 1014 0145 Yotta Output Controller (ytout)", |
" 0156 405GP PLB to PCI Bridge", |
" 015e 622Mbps ATM PCI Adapter", |
" 0160 64bit/66MHz PCI ATM 155 MMF", |
" 016e GXT4000P Graphics Adapter", |
" 0170 GXT6000P Graphics Adapter", |
" 017d GXT300P Graphics Adapter", |
" 0180 Snipe chipset SCSI controller", |
" 1014 0241 iSeries 2757 DASD IOA", |
" 1014 0264 Quad Channel PCI-X U320 SCSI RAID Adapter (2780)", |
" 0188 EADS-X PCI-X to PCI-X Bridge", |
" 01a7 PCI-X to PCI-X Bridge", |
" 01bd ServeRAID Controller", |
" 1014 01be ServeRAID-4M", |
" 1014 01bf ServeRAID-4L", |
" 1014 0208 ServeRAID-4Mx", |
" 1014 020e ServeRAID-4Lx", |
" 1014 022e ServeRAID-4H", |
" 1014 0258 ServeRAID-5i", |
" 1014 0259 ServeRAID-5i", |
" 01c1 64bit/66MHz PCI ATM 155 UTP", |
" 01e6 Cryptographic Accelerator", |
" 01ff 10/100 Mbps Ethernet", |
" 0219 Multiport Serial Adapter", |
" 1014 021a Dual RVX", |
" 1014 0251 Internal Modem/RVX", |
" 1014 0252 Quad Internal Modem", |
" 021b GXT6500P Graphics Adapter", |
" 021c GXT4500P Graphics Adapter", |
" 0233 GXT135P Graphics Adapter", |
" 0266 PCI-X Dual Channel SCSI", |
" 0268 Gigabit Ethernet-SX Adapter (PCI-X)", |
" 0269 10/100/1000 Base-TX Ethernet Adapter (PCI-X)", |
" 028c Citrine chipset SCSI controller", |
" 1014 028d Dual Channel PCI-X DDR SAS RAID Adapter (572E)", |
" 1014 02be Dual Channel PCI-X DDR U320 SCSI RAID Adapter (571B)", |
" 1014 02c0 Dual Channel PCI-X DDR U320 SCSI Adapter (571A)", |
" 1014 030d PCI-X DDR Auxiliary Cache Adapter (575B)", |
" 02a1 Calgary PCI-X Host Bridge", |
" 02bd Obsidian chipset SCSI controller", |
" 1014 02c1 PCI-X DDR 3Gb SAS Adapter (572A/572C)", |
" 1014 02c2 PCI-X DDR 3Gb SAS RAID Adapter (572B/571D)", |
" 0302 Winnipeg PCI-X Host Bridge", |
" 0314 ZISC 036 Neural accelerator card", |
" 3022 QLA3022 Network Adapter", |
" 4022 QLA3022 Network Adapter", |
" ffff MPIC-2 interrupt controller", |
"1015 LSI Logic Corp of Canada", |
"1016 ICL Personal Systems", |
"1017 SPEA Software AG", |
" 5343 SPEA 3D Accelerator", |
"1018 Unisys Systems", |
"1019 Elitegroup Computer Systems", |
"101a AT&T GIS (NCR)", |
" 0005 100VG ethernet", |
"101b Vitesse Semiconductor", |
"101c Western Digital", |
" 0193 33C193A", |
" 0196 33C196A", |
" 0197 33C197A", |
" 0296 33C296A", |
" 3193 7193", |
" 3197 7197", |
" 3296 33C296A", |
" 4296 34C296", |
" 9710 Pipeline 9710", |
" 9712 Pipeline 9712", |
" c24a 90C", |
"101e American Megatrends Inc.", |
" 0009 MegaRAID 428 Ultra RAID Controller (rev 03)", |
" 1960 MegaRAID", |
" 101e 0471 MegaRAID 471 Enterprise 1600 RAID Controller", |
" 101e 0475 MegaRAID 475 Express 500/500LC RAID Controller", |
" 101e 0477 MegaRAID 477 Elite 3100 RAID Controller", |
" 101e 0493 MegaRAID 493 Elite 1600 RAID Controller", |
" 101e 0494 MegaRAID 494 Elite 1650 RAID Controller", |
" 101e 0503 MegaRAID 503 Enterprise 1650 RAID Controller", |
" 101e 0511 MegaRAID 511 i4 IDE RAID Controller", |
" 101e 0522 MegaRAID 522 i4133 RAID Controller", |
" 1028 0471 PowerEdge RAID Controller 3/QC", |
" 1028 0475 PowerEdge RAID Controller 3/SC", |
" 1028 0493 PowerEdge RAID Controller 3/DC", |
" 1028 0511 PowerEdge Cost Effective RAID Controller ATA100/4Ch", |
" 103c 60e7 NetRAID-1M", |
" 9010 MegaRAID 428 Ultra RAID Controller", |
" 9030 EIDE Controller", |
" 9031 EIDE Controller", |
" 9032 EIDE & SCSI Controller", |
" 9033 SCSI Controller", |
" 9040 Multimedia card", |
" 9060 MegaRAID 434 Ultra GT RAID Controller", |
" 9063 MegaRAC", |
" 101e 0767 Dell Remote Assistant Card 2", |
"101f PictureTel", |
"1020 Hitachi Computer Products", |
"1021 OKI Electric Industry Co. Ltd.", |
"1022 Advanced Micro Devices [AMD]", |
" 1100 K8 [Athlon64/Opteron] HyperTransport Technology Configuration", |
" 1101 K8 [Athlon64/Opteron] Address Map", |
" 1102 K8 [Athlon64/Opteron] DRAM Controller", |
" 1103 K8 [Athlon64/Opteron] Miscellaneous Control", |
" 2000 79c970 [PCnet32 LANCE]", |
" 1014 2000 NetFinity 10/100 Fast Ethernet", |
" 1022 2000 PCnet - Fast 79C971", |
" 103c 104c Ethernet with LAN remote power Adapter", |
" 103c 1064 Ethernet with LAN remote power Adapter", |
" 103c 1065 Ethernet with LAN remote power Adapter", |
" 103c 106c Ethernet with LAN remote power Adapter", |
" 103c 106e Ethernet with LAN remote power Adapter", |
" 103c 10ea Ethernet with LAN remote power Adapter", |
" 1113 1220 EN1220 10/100 Fast Ethernet", |
" 1259 2450 AT-2450 10/100 Fast Ethernet", |
" 1259 2454 AT-2450v4 10Mb Ethernet Adapter", |
" 1259 2700 AT-2700TX 10/100 Fast Ethernet", |
" 1259 2701 AT-2700FX 100Mb Ethernet", |
" 1259 2702 AT-2700FTX 10/100 Mb Fiber/Copper Fast Ethernet", |
" 1259 2703 AT-2701FX", |
" 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard", |
" 4c53 1010 CP5/CR6 mainboard", |
" 4c53 1020 VR6 mainboard", |
" 4c53 1030 PC5 mainboard", |
" 4c53 1040 CL7 mainboard", |
" 4c53 1060 PC7 mainboard", |
" 2001 79c978 [HomePNA]", |
" 1092 0a78 Multimedia Home Network Adapter", |
" 1668 0299 ActionLink Home Network Adapter", |
" 2003 Am 1771 MBW [Alchemy]", |
" 2020 53c974 [PCscsi]", |
" 2040 79c974", |
" 2081 Geode LX Video", |
" 2082 Geode LX AES Security Block", |
" 208f CS5536 GeodeLink PCI South Bridge", |
" 2090 CS5536 [Geode companion] ISA", |
" 2091 CS5536 [Geode companion] FLASH", |
" 2093 CS5536 [Geode companion] Audio", |
" 2094 CS5536 [Geode companion] OHC", |
" 2095 CS5536 [Geode companion] EHC", |
" 2096 CS5536 [Geode companion] UDC", |
" 2097 CS5536 [Geode companion] UOC", |
" 209a CS5536 [Geode companion] IDE", |
" 3000 ELanSC520 Microcontroller", |
" 7006 AMD-751 [Irongate] System Controller", |
" 7007 AMD-751 [Irongate] AGP Bridge", |
" 700a AMD-IGR4 AGP Host to PCI Bridge", |
" 700b AMD-IGR4 PCI to PCI Bridge", |
" 700c AMD-760 MP [IGD4-2P] System Controller", |
" 700d AMD-760 MP [IGD4-2P] AGP Bridge", |
" 700e AMD-760 [IGD4-1P] System Controller", |
" 700f AMD-760 [IGD4-1P] AGP Bridge", |
" 7400 AMD-755 [Cobra] ISA", |
" 7401 AMD-755 [Cobra] IDE", |
" 7403 AMD-755 [Cobra] ACPI", |
" 7404 AMD-755 [Cobra] USB", |
" 7408 AMD-756 [Viper] ISA", |
" 7409 AMD-756 [Viper] IDE", |
" 740b AMD-756 [Viper] ACPI", |
" 740c AMD-756 [Viper] USB", |
" 7410 AMD-766 [ViperPlus] ISA", |
" 7411 AMD-766 [ViperPlus] IDE", |
" 7413 AMD-766 [ViperPlus] ACPI", |
" 7414 AMD-766 [ViperPlus] USB", |
" 7440 AMD-768 [Opus] ISA", |
" 1043 8044 A7M-D Mainboard", |
" 7441 AMD-768 [Opus] IDE", |
" 7443 AMD-768 [Opus] ACPI", |
" 1043 8044 A7M-D Mainboard", |
" 7445 AMD-768 [Opus] Audio", |
" 7446 AMD-768 [Opus] MC97 Modem (Smart Link HAMR5600 compatible)", |
" 7448 AMD-768 [Opus] PCI", |
" 7449 AMD-768 [Opus] USB", |
" 7450 AMD-8131 PCI-X Bridge", |
" 7451 AMD-8131 PCI-X IOAPIC", |
" 7454 AMD-8151 System Controller", |
" 7455 AMD-8151 AGP Bridge", |
" 7458 AMD-8132 PCI-X Bridge", |
" 7459 AMD-8132 PCI-X IOAPIC", |
" 7460 AMD-8111 PCI", |
" 161f 3017 HDAMB", |
" 7461 AMD-8111 USB", |
" 7462 AMD-8111 Ethernet", |
" 7464 AMD-8111 USB", |
" 161f 3017 HDAMB", |
" 7468 AMD-8111 LPC", |
" 161f 3017 HDAMB", |
" 7469 AMD-8111 IDE", |
" 1022 2b80 AMD-8111 IDE [Quartet]", |
" 161f 3017 HDAMB", |
" 746a AMD-8111 SMBus 2.0", |
" 746b AMD-8111 ACPI", |
" 161f 3017 HDAMB", |
" 746d AMD-8111 AC97 Audio", |
" 161f 3017 HDAMB", |
" 746e AMD-8111 MC97 Modem", |
" 756b AMD-8111 ACPI", |
"1023 Trident Microsystems", |
" 0194 82C194", |
" 2000 4DWave DX", |
" 2001 4DWave NX", |
" 122d 1400 Trident PCI288-Q3DII (NX)", |
" 2100 CyberBlade XP4m32", |
" 2200 XGI Volari XP5", |
" 8400 CyberBlade/i7", |
" 1023 8400 CyberBlade i7 AGP", |
" 8420 CyberBlade/i7d", |
" 0e11 b15a CyberBlade i7 AGP", |
" 8500 CyberBlade/i1", |
" 8520 CyberBlade i1", |
" 0e11 b16e CyberBlade i1 AGP", |
" 1023 8520 CyberBlade i1 AGP", |
" 8620 CyberBlade/i1", |
" 1014 0502 ThinkPad R30/T30", |
" 1014 1025 Travelmate 352TE", |
" 8820 CyberBlade XPAi1", |
" 9320 TGUI 9320", |
" 9350 GUI Accelerator", |
" 9360 Flat panel GUI Accelerator", |
" 9382 Cyber 9382 [Reference design]", |
" 9383 Cyber 9383 [Reference design]", |
" 9385 Cyber 9385 [Reference design]", |
" 9386 Cyber 9386", |
" 9388 Cyber 9388", |
" 9397 Cyber 9397", |
" 939a Cyber 9397DVD", |
" 9420 TGUI 9420", |
" 9430 TGUI 9430", |
" 9440 TGUI 9440", |
" 9460 TGUI 9460", |
" 9470 TGUI 9470", |
" 9520 Cyber 9520", |
" 9525 Cyber 9525", |
" 10cf 1094 Lifebook C6155", |
" 9540 Cyber 9540", |
" 9660 TGUI 9660/938x/968x", |
" 9680 TGUI 9680", |
" 9682 TGUI 9682", |
" 9683 TGUI 9683", |
" 9685 ProVIDIA 9685", |
" 9750 3DImage 9750", |
" 1014 9750 3DImage 9750", |
" 1023 9750 3DImage 9750", |
" 9753 TGUI 9753", |
" 9754 TGUI 9754", |
" 9759 TGUI 975", |
" 9783 TGUI 9783", |
" 9785 TGUI 9785", |
" 9850 3DImage 9850", |
" 9880 Blade 3D PCI/AGP", |
" 1023 9880 Blade 3D", |
" 9910 CyberBlade/XP", |
" 9930 CyberBlade/XPm", |
"1024 Zenith Data Systems", |
"1025 Acer Incorporated [ALI]", |
" 1435 M1435", |
" 1445 M1445", |
" 1449 M1449", |
" 1451 M1451", |
" 1461 M1461", |
" 1489 M1489", |
" 1511 M1511", |
" 1512 ALI M1512 Aladdin", |
" 1513 M1513", |
" 1521 ALI M1521 Aladdin III CPU Bridge", |
" 10b9 1521 ALI M1521 Aladdin III CPU Bridge", |
" 1523 ALI M1523 ISA Bridge", |
" 10b9 1523 ALI M1523 ISA Bridge", |
" 1531 M1531 Northbridge [Aladdin IV/IV+]", |
" 1533 M1533 PCI-to-ISA Bridge", |
" 10b9 1533 ALI M1533 Aladdin IV/V ISA South Bridge", |
" 1535 M1535 PCI Bridge + Super I/O + FIR", |
" 1541 M1541 Northbridge [Aladdin V]", |
" 10b9 1541 ALI M1541 Aladdin V/V+ AGP+PCI North Bridge", |
" 1542 M1542 Northbridge [Aladdin V]", |
" 1543 M1543 PCI-to-ISA Bridge + Super I/O + FIR", |
" 1561 M1561 Northbridge [Aladdin 7]", |
" 1621 M1621 Northbridge [Aladdin-Pro II]", |
" 1631 M1631 Northbridge+3D Graphics [Aladdin TNT2]", |
" 1641 M1641 Northbridge [Aladdin-Pro IV]", |
" 1647 M1647 [MaGiK1] PCI North Bridge", |
" 1671 M1671 Northbridge [ALADDiN-P4]", |
" 1672 Northbridge [CyberALADDiN-P4]", |
" 3141 M3141", |
" 3143 M3143", |
" 3145 M3145", |
" 3147 M3147", |
" 3149 M3149", |
" 3151 M3151", |
" 3307 M3307 MPEG-I Video Controller", |
" 3309 M3309 MPEG-II Video w/ Software Audio Decoder", |
" 3321 M3321 MPEG-II Audio/Video Decoder", |
" 5212 M4803", |
" 5215 ALI PCI EIDE Controller", |
" 5217 M5217H", |
" 5219 M5219", |
" 5225 M5225", |
" 5229 M5229", |
" 5235 M5235", |
" 5237 M5237 PCI USB Host Controller", |
" 5240 EIDE Controller", |
" 5241 PCMCIA Bridge", |
" 5242 General Purpose Controller", |
" 5243 PCI to PCI Bridge Controller", |
" 5244 Floppy Disk Controller", |
" 5247 M1541 PCI to PCI Bridge", |
" 5251 M5251 P1394 Controller", |
" 5427 PCI to AGP Bridge", |
" 5451 M5451 PCI AC-Link Controller Audio Device", |
" 5453 M5453 PCI AC-Link Controller Modem Device", |
" 7101 M7101 PCI PMU Power Management Controller", |
" 10b9 7101 M7101 PCI PMU Power Management Controller", |
"1028 Dell", |
" 0001 PowerEdge Expandable RAID Controller 2/Si", |
" 1028 0001 PowerEdge 2400", |
" 0002 PowerEdge Expandable RAID Controller 3/Di", |
" 1028 0002 PowerEdge 4400", |
" 0003 PowerEdge Expandable RAID Controller 3/Si", |
" 1028 0003 PowerEdge 2450", |
" 0006 PowerEdge Expandable RAID Controller 3/Di", |
" 0007 Remote Access Card III", |
" 0008 Remote Access Card III", |
" 0009 Remote Access Card III: BMC/SMIC device not present", |
" 000a PowerEdge Expandable RAID Controller 3/Di", |
" 000c Embedded Remote Access or ERA/O", |
" 000d Embedded Remote Access: BMC/SMIC device", |
" 000e PowerEdge Expandable RAID controller 4/Di", |
" 000f PowerEdge Expandable RAID controller 4/Di", |
" 0010 Remote Access Card 4", |
" 0011 Remote Access Card 4 Daughter Card", |
" 0012 Remote Access Card 4 Daughter Card Virtual UART", |
" 0013 PowerEdge Expandable RAID controller 4", |
" 1028 016c PowerEdge Expandable RAID Controller 4e/Si", |
" 1028 016d PowerEdge Expandable RAID Controller 4e/Di", |
" 1028 016e PowerEdge Expandable RAID Controller 4e/Di", |
" 1028 016f PowerEdge Expandable RAID Controller 4e/Di", |
" 1028 0170 PowerEdge Expandable RAID Controller 4e/Di", |
" 0014 Remote Access Card 4 Daughter Card SMIC interface", |
" 0015 PowerEdge Expandable RAID controller 5", |
"1029 Siemens Nixdorf IS", |
"102a LSI Logic", |
" 0000 HYDRA", |
" 0010 ASPEN", |
" 001f AHA-2940U2/U2W /7890/7891 SCSI Controllers", |
" 9005 000f 2940U2W SCSI Controller", |
" 9005 0106 2940U2W SCSI Controller", |
" 9005 a180 2940U2W SCSI Controller", |
" 00c5 AIC-7899 U160/m SCSI Controller", |
" 1028 00c5 PowerEdge 2550/2650/4600", |
" 00cf AIC-7899P U160/m", |
" 1028 0106 PowerEdge 4600", |
" 1028 0121 PowerEdge 2650", |
"102b Matrox Graphics, Inc.", |
" 0010 MGA-I [Impression?]", |
" 0100 MGA 1064SG [Mystique]", |
" 0518 MGA-II [Athena]", |
" 0519 MGA 2064W [Millennium]", |
" 051a MGA 1064SG [Mystique]", |
" 102b 0100 MGA-1064SG Mystique", |
" 102b 1100 MGA-1084SG Mystique", |
" 102b 1200 MGA-1084SG Mystique", |
" 1100 102b MGA-1084SG Mystique", |
" 110a 0018 Scenic Pro C5 (D1025)", |
" 051b MGA 2164W [Millennium II]", |
" 102b 051b MGA-2164W Millennium II", |
" 102b 1100 MGA-2164W Millennium II", |
" 102b 1200 MGA-2164W Millennium II", |
" 051e MGA 1064SG [Mystique] AGP", |
" 051f MGA 2164W [Millennium II] AGP", |
" 0520 MGA G200", |
" 102b dbc2 G200 Multi-Monitor", |
" 102b dbc8 G200 Multi-Monitor", |
" 102b dbe2 G200 Multi-Monitor", |
" 102b dbe8 G200 Multi-Monitor", |
" 102b ff03 Millennium G200 SD", |
" 102b ff04 Marvel G200", |
" 0521 MGA G200 AGP", |
" 1014 ff03 Millennium G200 AGP", |
" 102b 48e9 Mystique G200 AGP", |
" 102b 48f8 Millennium G200 SD AGP", |
" 102b 4a60 Millennium G200 LE AGP", |
" 102b 4a64 Millennium G200 AGP", |
" 102b c93c Millennium G200 AGP", |
" 102b c9b0 Millennium G200 AGP", |
" 102b c9bc Millennium G200 AGP", |
" 102b ca60 Millennium G250 LE AGP", |
" 102b ca6c Millennium G250 AGP", |
" 102b dbbc Millennium G200 AGP", |
" 102b dbc2 Millennium G200 MMS (Dual G200)", |
" 102b dbc3 G200 Multi-Monitor", |
" 102b dbc8 Millennium G200 MMS (Dual G200)", |
" 102b dbd2 G200 Multi-Monitor", |
" 102b dbd3 G200 Multi-Monitor", |
" 102b dbd4 G200 Multi-Monitor", |
" 102b dbd5 G200 Multi-Monitor", |
" 102b dbd8 G200 Multi-Monitor", |
" 102b dbd9 G200 Multi-Monitor", |
" 102b dbe2 Millennium G200 MMS (Quad G200)", |
" 102b dbe3 G200 Multi-Monitor", |
" 102b dbe8 Millennium G200 MMS (Quad G200)", |
" 102b dbf2 G200 Multi-Monitor", |
" 102b dbf3 G200 Multi-Monitor", |
" 102b dbf4 G200 Multi-Monitor", |
" 102b dbf5 G200 Multi-Monitor", |
" 102b dbf8 G200 Multi-Monitor", |
" 102b dbf9 G200 Multi-Monitor", |
" 102b f806 Mystique G200 Video AGP", |
" 102b ff00 MGA-G200 AGP", |
" 102b ff02 Mystique G200 AGP", |
" 102b ff03 Millennium G200 AGP", |
" 102b ff04 Marvel G200 AGP", |
" 110a 0032 MGA-G200 AGP", |
" 0522 MGA G200e [Pilot] ServerEngines (SEP1)", |
" 0525 MGA G400/G450", |
" 0e11 b16f MGA-G400 AGP", |
" 102b 0328 Millennium G400 16Mb SDRAM", |
" 102b 0338 Millennium G400 16Mb SDRAM", |
" 102b 0378 Millennium G400 32Mb SDRAM", |
" 102b 0541 Millennium G450 Dual Head", |
" 102b 0542 Millennium G450 Dual Head LX", |
" 102b 0543 Millennium G450 Single Head LX", |
" 102b 0641 Millennium G450 32Mb SDRAM Dual Head", |
" 102b 0642 Millennium G450 32Mb SDRAM Dual Head LX", |
" 102b 0643 Millennium G450 32Mb SDRAM Single Head LX", |
" 102b 07c0 Millennium G450 Dual Head LE", |
" 102b 07c1 Millennium G450 SDR Dual Head LE", |
" 102b 0d41 Millennium G450 Dual Head PCI", |
" 102b 0d42 Millennium G450 Dual Head LX PCI", |
" 102b 0d43 Millennium G450 32Mb Dual Head PCI", |
" 102b 0e00 Marvel G450 eTV", |
" 102b 0e01 Marvel G450 eTV", |
" 102b 0e02 Marvel G450 eTV", |
" 102b 0e03 Marvel G450 eTV", |
" 102b 0f80 Millennium G450 Low Profile", |
" 102b 0f81 Millennium G450 Low Profile", |
" 102b 0f82 Millennium G450 Low Profile DVI", |
" 102b 0f83 Millennium G450 Low Profile DVI", |
" 102b 19d8 Millennium G400 16Mb SGRAM", |
" 102b 19f8 Millennium G400 32Mb SGRAM", |
" 102b 2159 Millennium G400 Dual Head 16Mb", |
" 102b 2179 Millennium G400 MAX/Dual Head 32Mb", |
" 102b 217d Millennium G400 Dual Head Max", |
" 102b 23c0 Millennium G450", |
" 102b 23c1 Millennium G450", |
" 102b 23c2 Millennium G450 DVI", |
" 102b 23c3 Millennium G450 DVI", |
" 102b 2f58 Millennium G400", |
" 102b 2f78 Millennium G400", |
" 102b 3693 Marvel G400 AGP", |
" 102b 5dd0 4Sight II", |
" 102b 5f50 4Sight II", |
" 102b 5f51 4Sight II", |
" 102b 5f52 4Sight II", |
" 102b 9010 Millennium G400 Dual Head", |
" 1458 0400 GA-G400", |
" 1705 0001 Millennium G450 32MB SGRAM", |
" 1705 0002 Millennium G450 16MB SGRAM", |
" 1705 0003 Millennium G450 32MB", |
" 1705 0004 Millennium G450 16MB", |
" 0527 MGA Parhelia AGP", |
" 102b 0840 Parhelia 128Mb", |
" 102b 0850 Parhelia 256MB AGP 4X", |
" 0528 Parhelia 8X", |
" 102b 1020 Parhelia 128MB", |
" 102b 1030 Parhelia 256 MB Dual DVI", |
" 102b 14e1 Parhelia PCI 256MB", |
" 102b 2021 QID Pro", |
" 0d10 MGA Ultima/Impression", |
" 1000 MGA G100 [Productiva]", |
" 102b ff01 Productiva G100", |
" 102b ff05 Productiva G100 Multi-Monitor", |
" 1001 MGA G100 [Productiva] AGP", |
" 102b 1001 MGA-G100 AGP", |
" 102b ff00 MGA-G100 AGP", |
" 102b ff01 MGA-G100 Productiva AGP", |
" 102b ff03 Millennium G100 AGP", |
" 102b ff04 MGA-G100 AGP", |
" 102b ff05 MGA-G100 Productiva AGP Multi-Monitor", |
" 110a 001e MGA-G100 AGP", |
" 2007 MGA Mistral", |
" 2527 MGA G550 AGP", |
" 102b 0f83 Millennium G550", |
" 102b 0f84 Millennium G550 Dual Head DDR 32Mb", |
" 102b 1e41 Millennium G550", |
" 2537 Millenium P650/P750", |
" 102b 1820 Millennium P750 64MB", |
" 102b 1830 Millennium P650 64MB", |
" 102b 1c10 QID 128MB", |
" 102b 2811 Millennium P650 Low-profile PCI 64MB", |
" 102b 2c11 QID Low-profile PCI", |
" 2538 Millenium P650 PCIe", |
" 102b 08c7 Millennium P650 PCIe 128MB", |
" 102b 0907 Millennium P650 PCIe 64MB", |
" 102b 1047 Millennium P650 LP PCIe 128MB", |
" 102b 1087 Millennium P650 LP PCIe 64MB", |
" 102b 2538 Parhelia APVe", |
" 102b 3007 QID Low-profile PCIe", |
" 4536 VIA Framegrabber", |
" 6573 Shark 10/100 Multiport SwitchNIC", |
"102c Chips and Technologies", |
" 00b8 F64310", |
" 00c0 F69000 HiQVideo", |
" 102c 00c0 F69000 HiQVideo", |
" 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard", |
" 4c53 1010 CP5/CR6 mainboard", |
" 4c53 1020 VR6 mainboard", |
" 4c53 1030 PC5 mainboard", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" 00d0 F65545", |
" 00d8 F65545", |
" 00dc F65548", |
" 00e0 F65550", |
" 00e4 F65554", |
" 00e5 F65555 HiQVPro", |
" 0e11 b049 Armada 1700 Laptop Display Controller", |
" 1179 0001 Satellite Pro", |
" 00f0 F68554", |
" 00f4 F68554 HiQVision", |
" 00f5 F68555", |
" 0c30 F69030", |
" 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" 4c53 1080 CT8 mainboard", |
"102d Wyse Technology Inc.", |
" 50dc 3328 Audio", |
"102e Olivetti Advanced Technology", |
"102f Toshiba America", |
" 0009 r4x00", |
" 000a TX3927 MIPS RISC PCI Controller", |
" 0020 ATM Meteor 155", |
" 102f 00f8 ATM Meteor 155", |
" 0030 TC35815CF PCI 10/100 Mbit Ethernet Controller", |
" 0031 TC35815CF PCI 10/100 Mbit Ethernet Controller with WOL", |
" 0105 TC86C001 [goku-s] IDE", |
" 0106 TC86C001 [goku-s] USB 1.1 Host", |
" 0107 TC86C001 [goku-s] USB Device Controller", |
" 0108 TC86C001 [goku-s] I2C/SIO/GPIO Controller", |
" 0180 TX4927/38 MIPS RISC PCI Controller", |
" 0181 TX4925 MIPS RISC PCI Controller", |
" 0182 TX4937 MIPS RISC PCI Controller", |
"1030 TMC Research", |
"1031 Miro Computer Products AG", |
" 5601 DC20 ASIC", |
" 5607 Video I/O & motion JPEG compressor", |
" 5631 Media 3D", |
" 6057 MiroVideo DC10/DC30+", |
"1032 Compaq", |
"1033 NEC Corporation", |
" 0000 Vr4181A USB Host or Function Control Unit", |
" 0001 PCI to 486-like bus Bridge", |
" 0002 PCI to VL98 Bridge", |
" 0003 ATM Controller", |
" 0004 R4000 PCI Bridge", |
" 0005 PCI to 486-like bus Bridge", |
" 0006 PC-9800 Graphic Accelerator", |
" 0007 PCI to UX-Bus Bridge", |
" 0008 PC-9800 Graphic Accelerator", |
" 0009 PCI to PC9800 Core-Graph Bridge", |
" 0016 PCI to VL Bridge", |
" 001a [Nile II]", |
" 0021 Vrc4373 [Nile I]", |
" 0029 PowerVR PCX1", |
" 002a PowerVR 3D", |
" 002c Star Alpha 2", |
" 002d PCI to C-bus Bridge", |
" 0035 USB", |
" 1033 0035 Hama USB 2.0 CardBus", |
" 1179 0001 USB", |
" 12ee 7000 Root Hub", |
" 14c2 0105 PTI-205N USB 2.0 Host Controller", |
" 1799 0001 Root Hub", |
" 1931 000a GlobeTrotter Fusion Quad Lite (PPP data)", |
" 1931 000b GlobeTrotter Fusion Quad Lite (GSM data)", |
" 807d 0035 PCI-USB2 (OHCI subsystem)", |
" 003b PCI to C-bus Bridge", |
" 003e NAPCCARD Cardbus Controller", |
" 0046 PowerVR PCX2 [midas]", |
" 005a Vrc5074 [Nile 4]", |
" 0063 Firewarden", |
" 0067 PowerVR Neon 250 Chipset", |
" 1010 0020 PowerVR Neon 250 AGP 32Mb", |
" 1010 0080 PowerVR Neon 250 AGP 16Mb", |
" 1010 0088 PowerVR Neon 250 16Mb", |
" 1010 0090 PowerVR Neon 250 AGP 16Mb", |
" 1010 0098 PowerVR Neon 250 16Mb", |
" 1010 00a0 PowerVR Neon 250 AGP 32Mb", |
" 1010 00a8 PowerVR Neon 250 32Mb", |
" 1010 0120 PowerVR Neon 250 AGP 32Mb", |
" 0072 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr", |
" 0074 56k Voice Modem", |
" 1033 8014 RCV56ACF 56k Voice Modem", |
" 009b Vrc5476", |
" 00a5 VRC4173", |
" 00a6 VRC5477 AC97", |
" 00cd IEEE 1394 [OrangeLink] Host Controller", |
" 12ee 8011 Root hub", |
" 00ce IEEE 1394 Host Controller", |
" 00df Vr4131", |
" 00e0 USB 2.0", |
" 12ee 7001 Root hub", |
" 14c2 0205 PTI-205N USB 2.0 Host Controller", |
" 1799 0002 Root Hub", |
" 807d 1043 PCI-USB2 (EHCI subsystem)", |
" 00e7 IEEE 1394 Host Controller", |
" 00f2 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr", |
" 00f3 uPD6113x Multimedia Decoder/Processor [EMMA2]", |
" 010c VR7701", |
" 0125 uPD720400 PCI Express - PCI/PCI-X Bridge", |
"1034 Framatome Connectors USA Inc.", |
"1035 Comp. & Comm. Research Lab", |
"1036 Future Domain Corp.", |
" 0000 TMC-18C30 [36C70]", |
"1037 Hitachi Micro Systems", |
"1038 AMP, Inc", |
"1039 Silicon Integrated Systems [SiS]", |
" 0001 Virtual PCI-to-PCI bridge (AGP)", |
" 0002 SG86C202", |
" 0003 SiS AGP Port (virtual PCI-to-PCI bridge)", |
" 0004 PCI-to-PCI bridge", |
" 0006 85C501/2/3", |
" 0008 SiS85C503/5513 (LPC Bridge)", |
" 0009 ACPI", |
" 000a PCI-to-PCI bridge", |
" 0016 SiS961/2 SMBus Controller", |
" 0018 SiS85C503/5513 (LPC Bridge)", |
" 0180 RAID bus controller 180 SATA/PATA [SiS]", |
" 0181 SATA", |
" 0182 182 SATA/RAID Controller", |
" 0190 190 Gigabit Ethernet Adapter", |
" 0191 191 Gigabit Ethernet Adapter", |
" 0200 5597/5598/6326 VGA", |
" 1039 0000 SiS5597 SVGA (Shared RAM)", |
" 0204 82C204", |
" 0205 SG86C205", |
" 0300 300/305 PCI/AGP VGA Display Adapter", |
" 107d 2720 Leadtek WinFast VR300", |
" 0310 315H PCI/AGP VGA Display Adapter", |
" 0315 315 PCI/AGP VGA Display Adapter", |
" 0325 315PRO PCI/AGP VGA Display Adapter", |
" 0330 330 [Xabre] PCI/AGP VGA Display Adapter", |
" 0406 85C501/2", |
" 0496 85C496", |
" 0530 530 Host", |
" 0540 540 Host", |
" 0550 550 Host", |
" 0597 5513C", |
" 0601 85C601", |
" 0620 620 Host", |
" 0630 630 Host", |
" 0633 633 Host", |
" 0635 635 Host", |
" 0645 SiS645 Host & Memory & AGP Controller", |
" 0646 SiS645DX Host & Memory & AGP Controller", |
" 0648 645xx", |
" 0650 650/M650 Host", |
" 0651 651 Host", |
" 0655 655 Host", |
" 0660 660 Host", |
" 0661 661FX/M661FX/M661MX Host", |
" 0730 730 Host", |
" 0733 733 Host", |
" 0735 735 Host", |
" 0740 740 Host", |
" 0741 741/741GX/M741 Host", |
" 0745 745 Host", |
" 0746 746 Host", |
" 0755 755 Host", |
" 0760 760/M760 Host", |
" 0761 761/M761 Host", |
" 0900 SiS900 PCI Fast Ethernet", |
" 1019 0a14 K7S5A motherboard", |
" 1039 0900 SiS900 10/100 Ethernet Adapter", |
" 1043 8035 CUSI-FX motherboard", |
" 0961 SiS961 [MuTIOL Media IO]", |
" 0962 SiS962 [MuTIOL Media IO]", |
" 0963 SiS963 [MuTIOL Media IO]", |
" 0964 SiS964 [MuTIOL Media IO]", |
" 0965 SiS965 [MuTIOL Media IO]", |
" 3602 83C602", |
" 5107 5107", |
" 5300 SiS540 PCI Display Adapter", |
" 5315 550 PCI/AGP VGA Display Adapter", |
" 5401 486 PCI Chipset", |
" 5511 5511/5512", |
" 5513 5513 [IDE]", |
" 1019 0970 P6STP-FL motherboard", |
" 1039 5513 SiS5513 EIDE Controller (A,B step)", |
" 1043 8035 CUSI-FX motherboard", |
" 5517 5517", |
" 5571 5571", |
" 5581 5581 Pentium Chipset", |
" 5582 5582", |
" 5591 5591/5592 Host", |
" 5596 5596 Pentium Chipset", |
" 5597 5597 [SiS5582]", |
" 5600 5600 Host", |
" 6204 Video decoder & MPEG interface", |
" 6205 VGA Controller", |
" 6236 6236 3D-AGP", |
" 6300 630/730 PCI/AGP VGA Display Adapter", |
" 1019 0970 P6STP-FL motherboard", |
" 1043 8035 CUSI-FX motherboard", |
" 6306 530/620 PCI/AGP VGA Display Adapter", |
" 1039 6306 SiS530,620 GUI Accelerator+3D", |
" 6325 65x/M650/740 PCI/AGP VGA Display Adapter", |
" 6326 86C326 5598/6326", |
" 1039 6326 SiS6326 GUI Accelerator", |
" 1092 0a50 SpeedStar A50", |
" 1092 0a70 SpeedStar A70", |
" 1092 4910 SpeedStar A70", |
" 1092 4920 SpeedStar A70", |
" 1569 6326 SiS6326 GUI Accelerator", |
" 6330 661/741/760/761 PCI/AGP VGA Display Adapter", |
" 1039 6330 [M]661xX/[M]741[GX]/[M]760 PCI/AGP VGA Adapter", |
" 7001 USB 1.0 Controller", |
" 1019 0a14 K7S5A motherboard", |
" 1039 7000 Onboard USB Controller", |
" 1462 5470 K7SOM+ 5.2C Motherboard", |
" 7002 USB 2.0 Controller", |
" 1509 7002 Onboard USB Controller", |
" 7007 FireWire Controller", |
" 7012 AC'97 Sound Controller", |
" 15bd 1001 DFI 661FX motherboard", |
" 7013 AC'97 Modem Controller", |
" 7016 SiS7016 PCI Fast Ethernet Adapter", |
" 1039 7016 SiS7016 10/100 Ethernet Adapter", |
" 7018 SiS PCI Audio Accelerator", |
" 1014 01b6 SiS PCI Audio Accelerator", |
" 1014 01b7 SiS PCI Audio Accelerator", |
" 1019 7018 SiS PCI Audio Accelerator", |
" 1025 000e SiS PCI Audio Accelerator", |
" 1025 0018 SiS PCI Audio Accelerator", |
" 1039 7018 SiS PCI Audio Accelerator", |
" 1043 800b SiS PCI Audio Accelerator", |
" 1054 7018 SiS PCI Audio Accelerator", |
" 107d 5330 SiS PCI Audio Accelerator", |
" 107d 5350 SiS PCI Audio Accelerator", |
" 1170 3209 SiS PCI Audio Accelerator", |
" 1462 400a SiS PCI Audio Accelerator", |
" 14a4 2089 SiS PCI Audio Accelerator", |
" 14cd 2194 SiS PCI Audio Accelerator", |
" 14ff 1100 SiS PCI Audio Accelerator", |
" 152d 8808 SiS PCI Audio Accelerator", |
" 1558 1103 SiS PCI Audio Accelerator", |
" 1558 2200 SiS PCI Audio Accelerator", |
" 1563 7018 SiS PCI Audio Accelerator", |
" 15c5 0111 SiS PCI Audio Accelerator", |
" 270f a171 SiS PCI Audio Accelerator", |
" a0a0 0022 SiS PCI Audio Accelerator", |
" 7019 SiS7019 Audio Accelerator", |
"103a Seiko Epson Corporation", |
"103b Tatung Co. of America", |
"103c Hewlett-Packard Company", |
" 002a NX9000 Notebook", |
" 1005 A4977A Visualize EG", |
" 1008 Visualize FX", |
" 1028 Tach TL Fibre Channel Host Adapter", |
" 1029 Tach XL2 Fibre Channel Host Adapter", |
" 107e 000f Interphase 5560 Fibre Channel Adapter", |
" 9004 9210 1Gb/2Gb Family Fibre Channel Controller", |
" 9004 9211 1Gb/2Gb Family Fibre Channel Controller", |
" 102a Tach TS Fibre Channel Host Adapter", |
" 107e 000e Interphase 5540/5541 Fibre Channel Adapter", |
" 9004 9110 1Gb/2Gb Family Fibre Channel Controller", |
" 9004 9111 1Gb/2Gb Family Fibre Channel Controller", |
" 1030 J2585A DeskDirect 10/100VG NIC", |
" 1031 J2585B HP 10/100VG PCI LAN Adapter", |
" 103c 1040 J2973A DeskDirect 10BaseT NIC", |
" 103c 1041 J2585B DeskDirect 10/100VG NIC", |
" 103c 1042 J2970A DeskDirect 10BaseT/2 NIC", |
" 1040 J2973A DeskDirect 10BaseT NIC", |
" 1041 J2585B DeskDirect 10/100 NIC", |
" 1042 J2970A DeskDirect 10BaseT/2 NIC", |
" 1048 Diva Serial [GSP] Multiport UART", |
" 103c 1049 Tosca Console", |
" 103c 104a Tosca Secondary", |
" 103c 104b Maestro SP2", |
" 103c 1223 Superdome Console", |
" 103c 1226 Keystone SP2", |
" 103c 1227 Powerbar SP2", |
" 103c 1282 Everest SP2", |
" 103c 1301 Diva RMP3", |
" 1054 PCI Local Bus Adapter", |
" 1064 79C970 PCnet Ethernet Controller", |
" 108b Visualize FXe", |
" 10c1 NetServer Smart IRQ Router", |
" 10ed TopTools Remote Control", |
" 10f0 rio System Bus Adapter", |
" 10f1 rio I/O Controller", |
" 1200 82557B 10/100 NIC", |
" 1219 NetServer PCI Hot-Plug Controller", |
" 121a NetServer SMIC Controller", |
" 121b NetServer Legacy COM Port Decoder", |
" 121c NetServer PCI COM Port Decoder", |
" 1229 zx1 System Bus Adapter", |
" 122a zx1 I/O Controller", |
" 122e zx1 Local Bus Adapter", |
" 127c sx1000 I/O Controller", |
" 1290 Auxiliary Diva Serial Port", |
" 1291 Auxiliary Diva Serial Port", |
" 12b4 zx1 QuickSilver AGP8x Local Bus Adapter", |
" 12f8 Broadcom BCM4306 802.11b/g Wireless LAN", |
" 12fa BCM4306 802.11b/g Wireless LAN Controller", |
" 2910 E2910A PCIBus Exerciser", |
" 2925 E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer", |
" 3080 Pavilion ze2028ea", |
" 3085 Realtek RTL8139/8139C/8139C+", |
" 3220 Hewlett-Packard Smart Array P600", |
" 3230 Hewlett-Packard Smart Array Controller", |
"103e Solliday Engineering", |
"103f Synopsys/Logic Modeling Group", |
"1040 Accelgraphics Inc.", |
"1041 Computrend", |
"1042 Micron", |
" 1000 PC Tech RZ1000", |
" 1001 PC Tech RZ1001", |
" 3000 Samurai_0", |
" 3010 Samurai_1", |
" 3020 Samurai_IDE", |
"1043 ASUSTeK Computer Inc.", |
" 0675 ISDNLink P-IN100-ST-D", |
" 0675 1704 ISDN Adapter (PCI Bus, D, C)", |
" 0675 1707 ISDN Adapter (PCI Bus, DV, W)", |
" 10cf 105e ISDN Adapter (PCI Bus, DV, W)", |
" 0c11 A7N8X Motherboard nForce2 IDE/USB/SMBus", |
" 4015 v7100 SDRAM [GeForce2 MX]", |
" 4021 v7100 Combo Deluxe [GeForce2 MX + TV tuner]", |
" 4057 v8200 GeForce 3", |
" 8043 v8240 PAL 128M [P4T] Motherboard", |
" 807b v9280/TD [Geforce4 TI4200 8X With TV-Out and DVI]", |
" 8095 A7N8X Motherboard nForce2 AC97 Audio", |
" 80ac A7N8X Motherboard nForce2 AGP/Memory", |
" 80bb v9180 Magic/T [GeForce4 MX440 AGP 8x 64MB TV-out]", |
" 80c5 nForce3 chipset motherboard [SK8N]", |
" 80df v9520 Magic/T", |
" 8187 802.11a/b/g Wireless LAN Card", |
" 8188 Tiger Hybrid TV Capture Device", |
"1044 Adaptec (formerly DPT)", |
" 1012 Domino RAID Engine", |
" a400 SmartCache/Raid I-IV Controller", |
" a500 PCI Bridge", |
" a501 SmartRAID V Controller", |
" 1044 c001 PM1554U2 Ultra2 Single Channel", |
" 1044 c002 PM1654U2 Ultra2 Single Channel", |
" 1044 c003 PM1564U3 Ultra3 Single Channel", |
" 1044 c004 PM1564U3 Ultra3 Dual Channel", |
" 1044 c005 PM1554U2 Ultra2 Single Channel (NON ACPI)", |
" 1044 c00a PM2554U2 Ultra2 Single Channel", |
" 1044 c00b PM2654U2 Ultra2 Single Channel", |
" 1044 c00c PM2664U3 Ultra3 Single Channel", |
" 1044 c00d PM2664U3 Ultra3 Dual Channel", |
" 1044 c00e PM2554U2 Ultra2 Single Channel (NON ACPI)", |
" 1044 c00f PM2654U2 Ultra2 Single Channel (NON ACPI)", |
" 1044 c014 PM3754U2 Ultra2 Single Channel (NON ACPI)", |
" 1044 c015 PM3755U2B Ultra2 Single Channel (NON ACPI)", |
" 1044 c016 PM3755F Fibre Channel (NON ACPI)", |
" 1044 c01e PM3757U2 Ultra2 Single Channel", |
" 1044 c01f PM3757U2 Ultra2 Dual Channel", |
" 1044 c020 PM3767U3 Ultra3 Dual Channel", |
" 1044 c021 PM3767U3 Ultra3 Quad Channel", |
" 1044 c028 PM2865U3 Ultra3 Single Channel", |
" 1044 c029 PM2865U3 Ultra3 Dual Channel", |
" 1044 c02a PM2865F Fibre Channel", |
" 1044 c03c 2000S Ultra3 Single Channel", |
" 1044 c03d 2000S Ultra3 Dual Channel", |
" 1044 c03e 2000F Fibre Channel", |
" 1044 c046 3000S Ultra3 Single Channel", |
" 1044 c047 3000S Ultra3 Dual Channel", |
" 1044 c048 3000F Fibre Channel", |
" 1044 c050 5000S Ultra3 Single Channel", |
" 1044 c051 5000S Ultra3 Dual Channel", |
" 1044 c052 5000F Fibre Channel", |
" 1044 c05a 2400A UDMA Four Channel", |
" 1044 c05b 2400A UDMA Four Channel DAC", |
" 1044 c064 3010S Ultra3 Dual Channel", |
" 1044 c065 3410S Ultra160 Four Channel", |
" 1044 c066 3010S Fibre Channel", |
" a511 SmartRAID V Controller", |
" 1044 c032 ASR-2005S I2O Zero Channel", |
" 1044 c035 ASR-2010S I2O Zero Channel", |
"1045 OPTi Inc.", |
" a0f8 82C750 [Vendetta] USB Controller", |
" c101 92C264", |
" c178 92C178", |
" c556 82X556 [Viper]", |
" c557 82C557 [Viper-M]", |
" c558 82C558 [Viper-M ISA+IDE]", |
" c567 82C750 [Vendetta], device 0", |
" c568 82C750 [Vendetta], device 1", |
" c569 82C579 [Viper XPress+ Chipset]", |
" c621 82C621 [Viper-M/N+]", |
" c700 82C700 [FireStar]", |
" c701 82C701 [FireStar Plus]", |
" c814 82C814 [Firebridge 1]", |
" c822 82C822", |
" c824 82C824", |
" c825 82C825 [Firebridge 2]", |
" c832 82C832", |
" c861 82C861", |
" c895 82C895", |
" c935 EV1935 ECTIVA MachOne PCIAudio", |
" d568 82C825 [Firebridge 2]", |
" d721 IDE [FireStar]", |
"1046 IPC Corporation, Ltd.", |
"1047 Genoa Systems Corp", |
"1048 Elsa AG", |
" 0c60 Gladiac MX", |
" 0d22 Quadro4 900XGL [ELSA GLoria4 900XGL]", |
" 1000 QuickStep 1000", |
" 3000 QuickStep 3000", |
" 8901 Gloria XL", |
" 1048 0935 GLoria XL (Virge)", |
"1049 Fountain Technologies, Inc.", |
"104a STMicroelectronics", |
" 0008 STG 2000X", |
" 0009 STG 1764X", |
" 0010 STG4000 [3D Prophet Kyro Series]", |
" 0209 STPC Consumer/Industrial North- and Southbridge", |
" 020a STPC Atlas/ConsumerS/Consumer IIA Northbridge", |
" 0210 STPC Atlas ISA Bridge", |
" 021a STPC Consumer S Southbridge", |
" 021b STPC Consumer IIA Southbridge", |
" 0500 ST70137 [Unicorn] ADSL DMT Transceiver", |
" 0564 STPC Client Northbridge", |
" 0981 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" 1746 STG 1764X", |
" 2774 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" 3520 MPEG-II decoder card", |
" 55cc STPC Client Southbridge", |
"104b BusLogic", |
" 0140 BT-946C (old) [multimaster 01]", |
" 1040 BT-946C (BA80C30) [MultiMaster 10]", |
" 8130 Flashpoint LT", |
"104c Texas Instruments", |
" 0500 100 MBit LAN Controller", |
" 0508 TMS380C2X Compressor Interface", |
" 1000 Eagle i/f AS", |
" 104c PCI1510 PC card Cardbus Controller", |
" 3d04 TVP4010 [Permedia]", |
" 3d07 TVP4020 [Permedia 2]", |
" 1011 4d10 Comet", |
" 1040 000f AccelStar II", |
" 1040 0011 AccelStar II", |
" 1048 0a31 WINNER 2000", |
" 1048 0a32 GLoria Synergy", |
" 1048 0a34 GLoria Synergy", |
" 1048 0a35 GLoria Synergy", |
" 1048 0a36 GLoria Synergy", |
" 1048 0a43 GLoria Synergy", |
" 1048 0a44 GLoria Synergy", |
" 107d 2633 WinFast 3D L2300", |
" 1092 0127 FIRE GL 1000 PRO", |
" 1092 0136 FIRE GL 1000 PRO", |
" 1092 0141 FIRE GL 1000 PRO", |
" 1092 0146 FIRE GL 1000 PRO", |
" 1092 0148 FIRE GL 1000 PRO", |
" 1092 0149 FIRE GL 1000 PRO", |
" 1092 0152 FIRE GL 1000 PRO", |
" 1092 0154 FIRE GL 1000 PRO", |
" 1092 0155 FIRE GL 1000 PRO", |
" 1092 0156 FIRE GL 1000 PRO", |
" 1092 0157 FIRE GL 1000 PRO", |
" 1097 3d01 Jeronimo Pro", |
" 1102 100f Graphics Blaster Extreme", |
" 3d3d 0100 Reference Permedia 2 3D", |
" 8000 PCILynx/PCILynx2 IEEE 1394 Link Layer Controller", |
" e4bf 1010 CF1-1-SNARE", |
" e4bf 1020 CF1-2-SNARE", |
" 8009 FireWire Controller", |
" 104d 8032 8032 OHCI i.LINK (IEEE 1394) Controller", |
" 8017 PCI4410 FireWire Controller", |
" 8019 TSB12LV23 IEEE-1394 Controller", |
" 11bd 000a Studio DV500-1394", |
" 11bd 000e Studio DV", |
" e4bf 1010 CF2-1-CYMBAL", |
" 8020 TSB12LV26 IEEE-1394 Controller (Link)", |
" 11bd 000f Studio DV500-1394", |
" 8021 TSB43AA22 IEEE-1394 Controller (PHY/Link Integrated)", |
" 104d 80df Vaio PCG-FX403", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 8022 TSB43AB22 IEEE-1394a-2000 Controller (PHY/Link)", |
" 8023 TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link)", |
" 103c 088c NC8000 laptop", |
" 1043 808b K8N4-E Mainboard", |
" 8024 TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link)", |
" 8025 TSB82AA2 IEEE-1394b Link Layer Controller", |
" 1458 1000 GA-K8N Ultra-9 Mainboard", |
" 8026 TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link)", |
" 1025 003c Aspire 2001WLCi (Compaq CL50 motherboard)", |
" 103c 006a NX9500", |
" 1043 808d A7V333 mainboard.", |
" 8027 PCI4451 IEEE-1394 Controller", |
" 1028 00e6 PCI4451 IEEE-1394 Controller (Dell Inspiron 8100)", |
" 8029 PCI4510 IEEE-1394 Controller", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 1071 8160 MIM2900", |
" 802b PCI7410,7510,7610 OHCI-Lynx Controller", |
" 1028 0139 Latitude D400", |
" 1028 014e PCI7410,7510,7610 OHCI-Lynx Controller (Dell Latitude D800)", |
" 802e PCI7x20 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller", |
" 8031 PCIxx21/x515 Cardbus Controller", |
" 1025 0080 Aspire 5024WLMi", |
" 103c 099c NX6110/NC6120", |
" 103c 308b MX6125", |
" 8032 OHCI Compliant IEEE 1394 Host Controller", |
" 1025 0080 Aspire 5024WLMi", |
" 103c 099c NX6110/NC6120", |
" 103c 308b MX6125", |
" 8033 PCIxx21 Integrated FlashMedia Controller", |
" 1025 0080 Aspire 5024WLMi", |
" 103c 099c NX6110/NC6120", |
" 103c 308b MX6125", |
" 8034 PCI6411, PCI6421, PCI6611, PCI6621, PCI7411, PCI7421, PCI7611, PCI7621 Secure Digital (SD) Controller", |
" 1025 0080 Aspire 5024WLMi", |
" 103c 099c NX6110/NC6120", |
" 103c 308b MX6125", |
" 8035 PCI6411, PCI6421, PCI6611, PCI6621, PCI7411, PCI7421, PCI7611, PCI7621 Smart Card Controller (SMC)", |
" 103c 099c NX6110/NC6120", |
" 8036 PCI6515 Cardbus Controller", |
" 8038 PCI6515 SmartCard Controller", |
" 803b 5-in-1 Multimedia Card Reader (SD/MMC/MS/MS PRO/xD)", |
" 8201 PCI1620 Firmware Loading Function", |
" 8204 PCI7410,7510,7610 PCI Firmware Loading Function", |
" 1028 0139 Latitude D400", |
" 1028 014e Latitude D800", |
" 8231 XIO2000(A)/XIO2200 PCI Express-to-PCI Bridge", |
" 8235 XIO2200 IEEE-1394a-2000 Controller (PHY/Link)", |
" 8400 ACX 100 22Mbps Wireless Interface", |
" 1186 3b00 DWL-650+ PC Card cardbus 22Mbs Wireless Adapter [AirPlus]", |
" 1186 3b01 DWL-520+ 22Mbps PCI Wireless Adapter", |
" 16ab 8501 WL-8305 IEEE802.11b+ Wireless LAN PCI Adapter", |
" 8401 ACX 100 22Mbps Wireless Interface", |
" 9000 Wireless Interface (of unknown type)", |
" 9065 TMS320DM642", |
" 9066 ACX 111 54Mbps Wireless Interface", |
" 104c 9066 Trendnet TEW-421PC Wireless PCI Adapter", |
" 1186 3b04 DWL-G520+ Wireless PCI Adapter", |
" 1186 3b05 DWL-G650+ AirPlusG+ CardBus Wireless LAN", |
" 13d1 aba0 SWLMP-54108 108Mbps Wireless mini PCI card 802.11g+", |
" 1737 0033 WPC54G Ver.2 802.11G PC Card", |
" a001 TDC1570", |
" a100 TDC1561", |
" a102 TNETA1575 HyperSAR Plus w/PCI Host i/f & UTOPIA i/f", |
" a106 TMS320C6414 TMS320C6415 TMS320C6416", |
" 175c 5000 ASI50xx Audio Adapter", |
" 175c 6400 ASI6400 Cobranet series", |
" 175c 8700 ASI87xx Radio Tuner card", |
" ac10 PCI1050", |
" ac11 PCI1053", |
" ac12 PCI1130", |
" ac13 PCI1031", |
" ac15 PCI1131", |
" ac16 PCI1250", |
" 1014 0092 ThinkPad 600", |
" ac17 PCI1220", |
" ac18 PCI1260", |
" ac19 PCI1221", |
" ac1a PCI1210", |
" ac1b PCI1450", |
" 0e11 b113 Armada M700", |
" 1014 0130 Thinkpad T20/T22/A21m", |
" ac1c PCI1225", |
" 0e11 b121 Armada E500", |
" 1028 0088 Latitude CPi A400XT", |
" ac1d PCI1251A", |
" ac1e PCI1211", |
" ac1f PCI1251B", |
" ac20 TI 2030", |
" ac21 PCI2031", |
" ac22 PCI2032 PCI Docking Bridge", |
" ac23 PCI2250 PCI-to-PCI Bridge", |
" ac28 PCI2050 PCI-to-PCI Bridge", |
" ac30 PCI1260 PC card Cardbus Controller", |
" ac40 PCI4450 PC card Cardbus Controller", |
" ac41 PCI4410 PC card Cardbus Controller", |
" ac42 PCI4451 PC card Cardbus Controller", |
" 1028 00e6 PCI4451 PC card CardBus Controller (Dell Inspiron 8100)", |
" ac44 PCI4510 PC card Cardbus Controller", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 1071 8160 MIM2000", |
" ac46 PCI4520 PC card Cardbus Controller", |
" ac47 PCI7510 PC card Cardbus Controller", |
" 1028 0139 Latitude D400", |
" 1028 013f Precision M60", |
" 1028 014e Latitude D800", |
" ac4a PCI7510,7610 PC card Cardbus Controller", |
" 1028 0139 Latitude D400", |
" 1028 014e Latitude D800", |
" ac50 PCI1410 PC card Cardbus Controller", |
" ac51 PCI1420", |
" 0e11 004e Evo N600c", |
" 1014 0148 ThinkPad A20m", |
" 1014 023b ThinkPad T23 (2647-4MG)", |
" 1028 00b1 Latitude C600", |
" 1028 012a Latitude C640", |
" 1033 80cd Versa Note VXi", |
" 1095 10cf Fujitsu-Siemens LifeBook C Series", |
" 10cf 1095 Lifebook S-4510/C6155", |
" e4bf 1000 CP2-2-HIPHOP", |
" ac52 PCI1451 PC card Cardbus Controller", |
" ac53 PCI1421 PC card Cardbus Controller", |
" ac54 PCI1620 PC Card Controller", |
" ac55 PCI1520 PC card Cardbus Controller", |
" 1014 0512 ThinkPad T30/T40", |
" ac56 PCI1510 PC card Cardbus Controller", |
" 1014 0528 ThinkPad R40e (2684-HVG) Cardbus Controller", |
" ac60 PCI2040 PCI to DSP Bridge Controller", |
" 175c 5100 ASI51xx Audio Adapter", |
" 175c 6100 ASI61xx Audio Adapter", |
" 175c 6200 ASI62xx Audio Adapter", |
" 175c 8800 ASI88xx Audio Adapter", |
" ac8d PCI 7620", |
" ac8e PCI7420 CardBus Controller", |
" ac8f PCI7420/PCI7620 Dual Socket CardBus and Smart Card Cont. w/ 1394a-2000 OHCI Two-Port PHY/Link-Layer Cont. and SD/MS-Pro Sockets", |
" fe00 FireWire Host Controller", |
" fe03 12C01A FireWire Host Controller", |
"104d Sony Corporation", |
" 8004 DTL-H2500 [Playstation development board]", |
" 8009 CXD1947Q i.LINK Controller", |
" 8039 CXD3222 i.LINK Controller", |
" 8056 Rockwell HCF 56K modem", |
" 808a Memory Stick Controller", |
"104e Oak Technology, Inc", |
" 0017 OTI-64017", |
" 0107 OTI-107 [Spitfire]", |
" 0109 Video Adapter", |
" 0111 OTI-64111 [Spitfire]", |
" 0217 OTI-64217", |
" 0317 OTI-64317", |
"104f Co-time Computer Ltd", |
"1050 Winbond Electronics Corp", |
" 0000 NE2000", |
" 0001 W83769F", |
" 0033 W89C33D 802.11 a/b/g BB/MAC", |
" 0105 W82C105", |
" 0840 W89C840", |
" 1050 0001 W89C840 Ethernet Adapter", |
" 1050 0840 W89C840 Ethernet Adapter", |
" 0940 W89C940", |
" 5a5a W89C940F", |
" 6692 W6692", |
" 1043 1702 ISDN Adapter (PCI Bus, D, W)", |
" 1043 1703 ISDN Adapter (PCI Bus, DV, W)", |
" 1043 1707 ISDN Adapter (PCI Bus, DV, W)", |
" 144f 1702 ISDN Adapter (PCI Bus, D, W)", |
" 144f 1703 ISDN Adapter (PCI Bus, DV, W)", |
" 144f 1707 ISDN Adapter (PCI Bus, DV, W)", |
" 9921 W99200F MPEG-1 Video Encoder", |
" 9922 W99200F/W9922PF MPEG-1/2 Video Encoder", |
" 9970 W9970CF", |
"1051 Anigma, Inc.", |
"1052 ?Young Micro Systems", |
"1053 Young Micro Systems", |
"1054 Hitachi, Ltd", |
"1055 Efar Microsystems", |
" 9130 SLC90E66 [Victory66] IDE", |
" 9460 SLC90E66 [Victory66] ISA", |
" 9462 SLC90E66 [Victory66] USB", |
" 9463 SLC90E66 [Victory66] ACPI", |
"1056 ICL", |
"1057 Motorola", |
" 0001 MPC105 [Eagle]", |
" 0002 MPC106 [Grackle]", |
" 0003 MPC8240 [Kahlua]", |
" 0004 MPC107", |
" 0006 MPC8245 [Unity]", |
" 0008 MPC8540", |
" 0009 MPC8560", |
" 0100 MC145575 [HFC-PCI]", |
" 0431 KTI829c 100VG", |
" 1801 DSP56301 Digital Signal Processor", |
" 14fb 0101 Transas Radar Imitator Board [RIM]", |
" 14fb 0102 Transas Radar Imitator Board [RIM-2]", |
" 14fb 0202 Transas Radar Integrator Board [RIB-2]", |
" 14fb 0611 1 channel CAN bus Controller [CanPci-1]", |
" 14fb 0612 2 channels CAN bus Controller [CanPci-2]", |
" 14fb 0613 3 channels CAN bus Controller [CanPci-3]", |
" 14fb 0614 4 channels CAN bus Controller [CanPci-4]", |
" 14fb 0621 1 channel CAN bus Controller [CanPci2-1]", |
" 14fb 0622 2 channels CAN bus Controller [CanPci2-2]", |
" 14fb 0810 Transas VTS Radar Integrator Board [RIB-4]", |
" 175c 4200 ASI4215 Audio Adapter", |
" 175c 4300 ASI43xx Audio Adapter", |
" 175c 4400 ASI4401 Audio Adapter", |
" ecc0 0010 Darla", |
" ecc0 0020 Gina", |
" ecc0 0030 Layla rev.0", |
" ecc0 0031 Layla rev.1", |
" ecc0 0040 Darla24 rev.0", |
" ecc0 0041 Darla24 rev.1", |
" ecc0 0050 Gina24 rev.0", |
" ecc0 0051 Gina24 rev.1", |
" ecc0 0070 Mona rev.0", |
" ecc0 0071 Mona rev.1", |
" ecc0 0072 Mona rev.2", |
" 18c0 MPC8265A/8266/8272", |
" 18c1 MPC8271/MPC8272", |
" 3410 DSP56361 Digital Signal Processor", |
" ecc0 0050 Gina24 rev.0", |
" ecc0 0051 Gina24 rev.1", |
" ecc0 0060 Layla24", |
" ecc0 0070 Mona rev.0", |
" ecc0 0071 Mona rev.1", |
" ecc0 0072 Mona rev.2", |
" ecc0 0080 Mia rev.0", |
" ecc0 0081 Mia rev.1", |
" ecc0 0090 Indigo", |
" ecc0 00a0 Indigo IO", |
" ecc0 00b0 Indigo DJ", |
" ecc0 0100 3G", |
" 4801 Raven", |
" 4802 Falcon", |
" 4803 Hawk", |
" 4806 CPX8216", |
" 4d68 20268", |
" 5600 SM56 PCI Modem", |
" 1057 0300 SM56 PCI Speakerphone Modem", |
" 1057 0301 SM56 PCI Voice Modem", |
" 1057 0302 SM56 PCI Fax Modem", |
" 1057 5600 SM56 PCI Voice modem", |
" 13d2 0300 SM56 PCI Speakerphone Modem", |
" 13d2 0301 SM56 PCI Voice modem", |
" 13d2 0302 SM56 PCI Fax Modem", |
" 1436 0300 SM56 PCI Speakerphone Modem", |
" 1436 0301 SM56 PCI Voice modem", |
" 1436 0302 SM56 PCI Fax Modem", |
" 144f 100c SM56 PCI Fax Modem", |
" 1494 0300 SM56 PCI Speakerphone Modem", |
" 1494 0301 SM56 PCI Voice modem", |
" 14c8 0300 SM56 PCI Speakerphone Modem", |
" 14c8 0302 SM56 PCI Fax Modem", |
" 1668 0300 SM56 PCI Speakerphone Modem", |
" 1668 0302 SM56 PCI Fax Modem", |
" 5608 Wildcard X100P", |
" 5803 MPC5200", |
" 5806 MCF54 Coldfire", |
" 5808 MPC8220", |
" 5809 MPC5200B", |
" 6400 MPC190 Security Processor (S1 family, encryption)", |
" 6405 MPC184 Security Processor (S1 family)", |
"1058 Electronics & Telecommunications RSH", |
"1059 Teknor Industrial Computers Inc", |
"105a Promise Technology, Inc.", |
" 0d30 PDC20265 (FastTrak100 Lite/Ultra100)", |
" 105a 4d33 Ultra100", |
" 0d38 20263", |
" 105a 4d39 Fasttrak66", |
" 1275 20275", |
" 3318 PDC20318 (SATA150 TX4)", |
" 3319 PDC20319 (FastTrak S150 TX4)", |
" 8086 3427 S875WP1-E mainboard", |
" 3371 PDC20371 (FastTrak S150 TX2plus)", |
" 3373 PDC20378 (FastTrak 378/SATA 378)", |
" 1043 80f5 K8V Deluxe/PC-DL Deluxe motherboard", |
" 1462 702e K8T NEO FIS2R motherboard", |
" 3375 PDC20375 (SATA150 TX2plus)", |
" 3376 PDC20376 (FastTrak 376)", |
" 1043 809e A7V8X motherboard", |
" 3515 PDC40719 [FastTrak TX4300/TX4310]", |
" 3519 PDC40519 (FastTrak TX4200)", |
" 3570 20771 (FastTrak TX2300)", |
" 3571 PDC20571 (FastTrak TX2200)", |
" 3574 PDC20579 SATAII 150 IDE Controller", |
" 3577 PDC40779 (SATA 300 779)", |
" 3d17 PDC40718 (SATA 300 TX4)", |
" 3d18 PDC20518/PDC40518 (SATAII 150 TX4)", |
" 3d73 PDC40775 (SATA 300 TX2plus)", |
" 3d75 PDC20575 (SATAII150 TX2plus)", |
" 4d30 PDC20267 (FastTrak100/Ultra100)", |
" 105a 4d33 Ultra100", |
" 105a 4d39 FastTrak100", |
" 4d33 20246", |
" 105a 4d33 20246 IDE Controller", |
" 4d38 PDC20262 (FastTrak66/Ultra66)", |
" 105a 4d30 Ultra Device on SuperTrak", |
" 105a 4d33 Ultra66", |
" 105a 4d39 FastTrak66", |
" 4d68 PDC20268 (Ultra100 TX2)", |
" 105a 4d68 Ultra100TX2", |
" 4d69 20269", |
" 105a 4d68 Ultra133TX2", |
" 5275 PDC20276 (MBFastTrak133 Lite)", |
" 1043 807e A7V333 motherboard.", |
" 105a 0275 SuperTrak SX6000 IDE", |
" 105a 1275 MBFastTrak133 Lite (tm) Controller (RAID mode)", |
" 1458 b001 MBUltra 133", |
" 5300 DC5300", |
" 6268 PDC20270 (FastTrak100 LP/TX2/TX4)", |
" 105a 4d68 FastTrak100 TX2", |
" 6269 PDC20271 (FastTrak TX2000)", |
" 105a 6269 FastTrak TX2/TX2000", |
" 6621 PDC20621 (FastTrak S150 SX4/FastTrak SX4000 lite)", |
" 6622 PDC20621 [SATA150 SX4] 4 Channel IDE RAID Controller", |
" 6624 PDC20621 [FastTrak SX4100]", |
" 6626 PDC20618 (Ultra 618)", |
" 6629 PDC20619 (FastTrak TX4000)", |
" 7275 PDC20277 (SBFastTrak133 Lite)", |
" 8002 SATAII150 SX8", |
"105b Foxconn International, Inc.", |
"105c Wipro Infotech Limited", |
"105d Number 9 Computer Company", |
" 2309 Imagine 128", |
" 2339 Imagine 128-II", |
" 105d 0000 Imagine 128 series 2 4Mb VRAM", |
" 105d 0001 Imagine 128 series 2 4Mb VRAM", |
" 105d 0002 Imagine 128 series 2 4Mb VRAM", |
" 105d 0003 Imagine 128 series 2 4Mb VRAM", |
" 105d 0004 Imagine 128 series 2 4Mb VRAM", |
" 105d 0005 Imagine 128 series 2 4Mb VRAM", |
" 105d 0006 Imagine 128 series 2 4Mb VRAM", |
" 105d 0007 Imagine 128 series 2 4Mb VRAM", |
" 105d 0008 Imagine 128 series 2e 4Mb DRAM", |
" 105d 0009 Imagine 128 series 2e 4Mb DRAM", |
" 105d 000a Imagine 128 series 2 8Mb VRAM", |
" 105d 000b Imagine 128 series 2 8Mb H-VRAM", |
" 11a4 000a Barco Metheus 5 Megapixel", |
" 13cc 0000 Barco Metheus 5 Megapixel", |
" 13cc 0004 Barco Metheus 5 Megapixel", |
" 13cc 0005 Barco Metheus 5 Megapixel", |
" 13cc 0006 Barco Metheus 5 Megapixel", |
" 13cc 0008 Barco Metheus 5 Megapixel", |
" 13cc 0009 Barco Metheus 5 Megapixel", |
" 13cc 000a Barco Metheus 5 Megapixel", |
" 13cc 000c Barco Metheus 5 Megapixel", |
" 493d Imagine 128 T2R [Ticket to Ride]", |
" 11a4 000a Barco Metheus 5 Megapixel, Dual Head", |
" 11a4 000b Barco Metheus 5 Megapixel, Dual Head", |
" 13cc 0002 Barco Metheus 4 Megapixel, Dual Head", |
" 13cc 0003 Barco Metheus 5 Megapixel, Dual Head", |
" 13cc 0007 Barco Metheus 5 Megapixel, Dual Head", |
" 13cc 0008 Barco Metheus 5 Megapixel, Dual Head", |
" 13cc 0009 Barco Metheus 5 Megapixel, Dual Head", |
" 13cc 000a Barco Metheus 5 Megapixel, Dual Head", |
" 5348 Revolution 4", |
" 105d 0037 Revolution IV-FP AGP (For SGI 1600SW)", |
" 11a4 0028 PVS5600M", |
" 11a4 0038 PVS5600D", |
"105e Vtech Computers Ltd", |
"105f Infotronic America Inc", |
"1060 United Microelectronics [UMC]", |
" 0001 UM82C881", |
" 0002 UM82C886", |
" 0101 UM8673F", |
" 0881 UM8881", |
" 0886 UM8886F", |
" 0891 UM8891A", |
" 1001 UM886A", |
" 673a UM8886BF", |
" 673b EIDE Master/DMA", |
" 8710 UM8710", |
" 886a UM8886A", |
" 8881 UM8881F", |
" 8886 UM8886F", |
" 888a UM8886A", |
" 8891 UM8891A", |
" 9017 UM9017F", |
" 9018 UM9018", |
" 9026 UM9026", |
" e881 UM8881N", |
" e886 UM8886N", |
" e88a UM8886N", |
" e891 UM8891N", |
"1061 I.I.T.", |
" 0001 AGX016", |
" 0002 IIT3204/3501", |
"1062 Maspar Computer Corp", |
"1063 Ocean Office Automation", |
"1064 Alcatel", |
"1065 Texas Microsystems", |
"1066 PicoPower Technology", |
" 0000 PT80C826", |
" 0001 PT86C521 [Vesuvius v1] Host Bridge", |
" 0002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Master", |
" 0003 PT86C524 [Nile] PCI-to-PCI Bridge", |
" 0004 PT86C525 [Nile-II] PCI-to-PCI Bridge", |
" 0005 National PC87550 System Controller", |
" 8002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Slave", |
"1067 Mitsubishi Electric", |
" 0301 AccelGraphics AccelECLIPSE", |
" 0304 AccelGALAXY A2100 [OEM Evans & Sutherland]", |
" 0308 Tornado 3000 [OEM Evans & Sutherland]", |
" 1002 VG500 [VolumePro Volume Rendering Accelerator]", |
"1068 Diversified Technology", |
"1069 Mylex Corporation", |
" 0001 DAC960P", |
" 0002 DAC960PD", |
" 0010 DAC960PG", |
" 0020 DAC960LA", |
" 0050 AcceleRAID 352/170/160 support Device", |
" 1069 0050 AcceleRAID 352 support Device", |
" 1069 0052 AcceleRAID 170 support Device", |
" 1069 0054 AcceleRAID 160 support Device", |
" b166 AcceleRAID 600/500/400/Sapphire support Device", |
" 1014 0242 iSeries 2872 DASD IOA", |
" 1014 0266 Dual Channel PCI-X U320 SCSI Adapter", |
" 1014 0278 Dual Channel PCI-X U320 SCSI RAID Adapter", |
" 1014 02d3 Dual Channel PCI-X U320 SCSI Adapter", |
" 1014 02d4 Dual Channel PCI-X U320 SCSI RAID Adapter", |
" 1069 0200 AcceleRAID 400, Single Channel, PCI-X, U320, SCSI RAID", |
" 1069 0202 AcceleRAID Sapphire, Dual Channel, PCI-X, U320, SCSI RAID", |
" 1069 0204 AcceleRAID 500, Dual Channel, Low-Profile, PCI-X, U320, SCSI RAID", |
" 1069 0206 AcceleRAID 600, Dual Channel, PCI-X, U320, SCSI RAID", |
" ba55 eXtremeRAID 1100 support Device", |
" ba56 eXtremeRAID 2000/3000 support Device", |
" 1069 0030 eXtremeRAID 3000 support Device", |
" 1069 0040 eXtremeRAID 2000 support Device", |
" ba57 eXtremeRAID 4000/5000 support Device", |
" 1069 0072 eXtremeRAID 5000 support Device", |
"106a Aten Research Inc", |
"106b Apple Computer Inc.", |
" 0001 Bandit PowerPC host bridge", |
" 0002 Grand Central I/O", |
" 0003 Control Video", |
" 0004 PlanB Video-In", |
" 0007 O'Hare I/O", |
" 000c DOS on Mac", |
" 000e Hydra Mac I/O", |
" 0010 Heathrow Mac I/O", |
" 0017 Paddington Mac I/O", |
" 0018 UniNorth FireWire", |
" 0019 KeyLargo USB", |
" 001e UniNorth Internal PCI", |
" 001f UniNorth PCI", |
" 0020 UniNorth AGP", |
" 0021 UniNorth GMAC (Sun GEM)", |
" 0022 KeyLargo Mac I/O", |
" 0024 UniNorth/Pangea GMAC (Sun GEM)", |
" 0025 KeyLargo/Pangea Mac I/O", |
" 0026 KeyLargo/Pangea USB", |
" 0027 UniNorth/Pangea AGP", |
" 0028 UniNorth/Pangea PCI", |
" 0029 UniNorth/Pangea Internal PCI", |
" 002d UniNorth 1.5 AGP", |
" 002e UniNorth 1.5 PCI", |
" 002f UniNorth 1.5 Internal PCI", |
" 0030 UniNorth/Pangea FireWire", |
" 0031 UniNorth 2 FireWire", |
" 106b 5811 iBook G4 2004", |
" 0032 UniNorth 2 GMAC (Sun GEM)", |
" 0033 UniNorth 2 ATA/100", |
" 0034 UniNorth 2 AGP", |
" 0035 UniNorth 2 PCI", |
" 0036 UniNorth 2 Internal PCI", |
" 003b UniNorth/Intrepid ATA/100", |
" 003e KeyLargo/Intrepid Mac I/O", |
" 003f KeyLargo/Intrepid USB", |
" 0040 K2 KeyLargo USB", |
" 0041 K2 KeyLargo Mac/IO", |
" 0042 K2 FireWire", |
" 0043 K2 ATA/100", |
" 0045 K2 HT-PCI Bridge", |
" 0046 K2 HT-PCI Bridge", |
" 0047 K2 HT-PCI Bridge", |
" 0048 K2 HT-PCI Bridge", |
" 0049 K2 HT-PCI Bridge", |
" 004b U3 AGP", |
" 004c K2 GMAC (Sun GEM)", |
" 004f Shasta Mac I/O", |
" 0050 Shasta IDE", |
" 0051 Shasta (Sun GEM)", |
" 0052 Shasta Firewire", |
" 0053 Shasta PCI Bridge", |
" 0054 Shasta PCI Bridge", |
" 0055 Shasta PCI Bridge", |
" 0058 U3L AGP Bridge", |
" 0059 U3H AGP Bridge", |
" 0066 Intrepid2 AGP Bridge", |
" 0067 Intrepid2 PCI Bridge", |
" 0068 Intrepid2 PCI Bridge", |
" 0069 Intrepid2 ATA/100", |
" 006a Intrepid2 Firewire", |
" 006b Intrepid2 GMAC (Sun GEM)", |
" 1645 Tigon3 Gigabit Ethernet NIC (BCM5701)", |
"106c Hynix Semiconductor", |
" 8801 Dual Pentium ISA/PCI Motherboard", |
" 8802 PowerPC ISA/PCI Motherboard", |
" 8803 Dual Window Graphics Accelerator", |
" 8804 LAN Controller", |
" 8805 100-BaseT LAN", |
"106d Sequent Computer Systems", |
"106e DFI, Inc", |
"106f City Gate Development Ltd", |
"1070 Daewoo Telecom Ltd", |
"1071 Mitac", |
" 8160 Mitac 8060B Mobile Platform", |
"1072 GIT Co Ltd", |
"1073 Yamaha Corporation", |
" 0001 3D GUI Accelerator", |
" 0002 YGV615 [RPA3 3D-Graphics Controller]", |
" 0003 YMF-740", |
" 0004 YMF-724", |
" 1073 0004 YMF724-Based PCI Audio Adapter", |
" 0005 DS1 Audio", |
" 1073 0005 DS-XG PCI Audio CODEC", |
" 0006 DS1 Audio", |
" 0008 DS1 Audio", |
" 1073 0008 DS-XG PCI Audio CODEC", |
" 000a DS1L Audio", |
" 1073 0004 DS-XG PCI Audio CODEC", |
" 1073 000a DS-XG PCI Audio CODEC", |
" 000c YMF-740C [DS-1L Audio Controller]", |
" 107a 000c DS-XG PCI Audio CODEC", |
" 000d YMF-724F [DS-1 Audio Controller]", |
" 1073 000d DS-XG PCI Audio CODEC", |
" 0010 YMF-744B [DS-1S Audio Controller]", |
" 1073 0006 DS-XG PCI Audio CODEC", |
" 1073 0010 DS-XG PCI Audio CODEC", |
" 0012 YMF-754 [DS-1E Audio Controller]", |
" 1073 0012 DS-XG PCI Audio Codec", |
" 0020 DS-1 Audio", |
" 2000 DS2416 Digital Mixing Card", |
" 1073 2000 DS2416 Digital Mixing Card", |
"1074 NexGen Microsystems", |
" 4e78 82c500/1", |
"1075 Advanced Integrations Research", |
"1076 Chaintech Computer Co. Ltd", |
"1077 QLogic Corp.", |
" 1016 ISP10160 Single Channel Ultra3 SCSI Processor", |
" 1020 ISP1020 Fast-wide SCSI", |
" 1022 ISP1022 Fast-wide SCSI", |
" 1080 ISP1080 SCSI Host Adapter", |
" 1216 ISP12160 Dual Channel Ultra3 SCSI Processor", |
" 101e 8471 QLA12160 on AMI MegaRAID", |
" 101e 8493 QLA12160 on AMI MegaRAID", |
" 1240 ISP1240 SCSI Host Adapter", |
" 1280 ISP1280 SCSI Host Adapter", |
" 2020 ISP2020A Fast!SCSI Basic Adapter", |
" 2100 QLA2100 64-bit Fibre Channel Adapter", |
" 1077 0001 QLA2100 64-bit Fibre Channel Adapter", |
" 2200 QLA2200 64-bit Fibre Channel Adapter", |
" 1077 0002 QLA2200", |
" 2300 QLA2300 64-bit Fibre Channel Adapter", |
" 2312 QLA2312 Fibre Channel Adapter", |
" 2322 QLA2322 Fibre Channel Adapter", |
" 2422 QLA2422 Fibre Channel Adapter", |
" 2432 QLA2432 Fibre Channel Adapter", |
" 3010 QLA3010 Network Adapter", |
" 3022 QLA3022 Network Adapter", |
" 4010 QLA4010 iSCSI TOE Adapter", |
" 4022 QLA4022 iSCSI TOE Adapter", |
" 6312 QLA6312 Fibre Channel Adapter", |
" 6322 QLA6322 Fibre Channel Adapter", |
"1078 Cyrix Corporation", |
" 0000 5510 [Grappa]", |
" 0001 PCI Master", |
" 0002 5520 [Cognac]", |
" 0100 5530 Legacy [Kahlua]", |
" 0101 5530 SMI [Kahlua]", |
" 0102 5530 IDE [Kahlua]", |
" 0103 5530 Audio [Kahlua]", |
" 0104 5530 Video [Kahlua]", |
" 0400 ZFMicro PCI Bridge", |
" 0401 ZFMicro Chipset SMI", |
" 0402 ZFMicro Chipset IDE", |
" 0403 ZFMicro Expansion Bus", |
"1079 I-Bus", |
"107a NetWorth", |
"107b Gateway 2000", |
"107c LG Electronics [Lucky Goldstar Co. Ltd]", |
"107d LeadTek Research Inc.", |
" 0000 P86C850", |
" 204d [GeForce 7800 GTX] Winfast PX7800 GTX TDH", |
" 2134 WinFast 3D S320 II", |
" 2971 [GeForce FX 5900] WinFast A350 TDH MyViVo", |
"107e Interphase Corporation", |
" 0001 5515 ATM Adapter [Flipper]", |
" 0002 100 VG AnyLan Controller", |
" 0004 5526 Fibre Channel Host Adapter", |
" 0005 x526 Fibre Channel Host Adapter", |
" 0008 5525/5575 ATM Adapter (155 Mbit) [Atlantic]", |
" 9003 5535-4P-BRI-ST", |
" 9007 5535-4P-BRI-U", |
" 9008 5535-1P-SR", |
" 900c 5535-1P-SR-ST", |
" 900e 5535-1P-SR-U", |
" 9011 5535-1P-PRI", |
" 9013 5535-2P-PRI", |
" 9023 5536-4P-BRI-ST", |
" 9027 5536-4P-BRI-U", |
" 9031 5536-1P-PRI", |
" 9033 5536-2P-PRI", |
"107f Data Technology Corporation", |
" 0802 SL82C105", |
"1080 Contaq Microsystems", |
" 0600 82C599", |
" c691 Cypress CY82C691", |
" c693 82c693", |
"1081 Supermac Technology", |
" 0d47 Radius PCI to NuBUS Bridge", |
"1082 EFA Corporation of America", |
"1083 Forex Computer Corporation", |
" 0001 FR710", |
"1084 Parador", |
"1085 Tulip Computers Int.B.V.", |
"1086 J. Bond Computer Systems", |
"1087 Cache Computer", |
"1088 Microcomputer Systems (M) Son", |
"1089 Data General Corporation", |
"108a SBS Technologies", |
" 0001 VME Bridge Model 617", |
" 0010 VME Bridge Model 618", |
" 0040 dataBLIZZARD", |
" 3000 VME Bridge Model 2706", |
"108c Oakleigh Systems Inc.", |
"108d Olicom", |
" 0001 Token-Ring 16/4 PCI Adapter (3136/3137)", |
" 0002 16/4 Token Ring", |
" 0004 RapidFire 3139 Token-Ring 16/4 PCI Adapter", |
" 108d 0004 OC-3139/3140 RapidFire Token-Ring 16/4 Adapter", |
" 0005 GoCard 3250 Token-Ring 16/4 CardBus PC Card", |
" 0006 OC-3530 RapidFire Token-Ring 100", |
" 0007 RapidFire 3141 Token-Ring 16/4 PCI Fiber Adapter", |
" 108d 0007 OC-3141 RapidFire Token-Ring 16/4 Adapter", |
" 0008 RapidFire 3540 HSTR 100/16/4 PCI Adapter", |
" 108d 0008 OC-3540 RapidFire HSTR 100/16/4 Adapter", |
" 0011 OC-2315", |
" 0012 OC-2325", |
" 0013 OC-2183/2185", |
" 0014 OC-2326", |
" 0019 OC-2327/2250 10/100 Ethernet Adapter", |
" 108d 0016 OC-2327 Rapidfire 10/100 Ethernet Adapter", |
" 108d 0017 OC-2250 GoCard 10/100 Ethernet Adapter", |
" 0021 OC-6151/6152 [RapidFire ATM 155]", |
" 0022 ATM Adapter", |
"108e Sun Microsystems Computer Corp.", |
" 0001 EBUS", |
" 1000 EBUS", |
" 1001 Happy Meal", |
" 1100 RIO EBUS", |
" 1101 RIO GEM", |
" 1102 RIO 1394", |
" 1103 RIO USB", |
" 1648 [bge] Gigabit Ethernet", |
" 2bad GEM", |
" 5000 Simba Advanced PCI Bridge", |
" 5043 SunPCI Co-processor", |
" 8000 Psycho PCI Bus Module", |
" 8001 Schizo PCI Bus Module", |
" 8002 Schizo+ PCI Bus Module", |
" a000 Ultra IIi", |
" a001 Ultra IIe", |
" a801 Tomatillo PCI Bus Module", |
" abba Cassini 10/100/1000", |
"108f Systemsoft", |
"1090 Compro Computer Services, Inc.", |
"1091 Intergraph Corporation", |
" 0020 3D graphics processor", |
" 0021 3D graphics processor w/Texturing", |
" 0040 3D graphics frame buffer", |
" 0041 3D graphics frame buffer", |
" 0060 Proprietary bus bridge", |
" 00e4 Powerstorm 4D50T", |
" 0720 Motion JPEG codec", |
" 07a0 Sun Expert3D-Lite Graphics Accelerator", |
" 1091 Sun Expert3D Graphics Accelerator", |
"1092 Diamond Multimedia Systems", |
" 00a0 Speedstar Pro SE", |
" 00a8 Speedstar 64", |
" 0550 Viper V550", |
" 08d4 Supra 2260 Modem", |
" 094c SupraExpress 56i Pro", |
" 1092 Viper V330", |
" 6120 Maximum DVD", |
" 8810 Stealth SE", |
" 8811 Stealth 64/SE", |
" 8880 Stealth", |
" 8881 Stealth", |
" 88b0 Stealth 64", |
" 88b1 Stealth 64", |
" 88c0 Stealth 64", |
" 88c1 Stealth 64", |
" 88d0 Stealth 64", |
" 88d1 Stealth 64", |
" 88f0 Stealth 64", |
" 88f1 Stealth 64", |
" 9999 DMD-I0928-1 'Monster sound' sound chip", |
"1093 National Instruments", |
" 0160 PCI-DIO-96", |
" 0162 PCI-MIO-16XE-50", |
" 1150 PCI-DIO-32HS High Speed Digital I/O Board", |
" 1170 PCI-MIO-16XE-10", |
" 1180 PCI-MIO-16E-1", |
" 1190 PCI-MIO-16E-4", |
" 1310 PCI-6602", |
" 1330 PCI-6031E", |
" 1350 PCI-6071E", |
" 14e0 PCI-6110", |
" 14f0 PCI-6111", |
" 17d0 PCI-6503", |
" 1870 PCI-6713", |
" 1880 PCI-6711", |
" 18b0 PCI-6052E", |
" 2410 PCI-6733", |
" 2890 PCI-6036E", |
" 2a60 PCI-6023E", |
" 2a70 PCI-6024E", |
" 2a80 PCI-6025E", |
" 2c80 PCI-6035E", |
" 2ca0 PCI-6034E", |
" 70a9 PCI-6528 (Digital I/O at 60V)", |
" 70b8 PCI-6251 [M Series - High Speed Multifunction DAQ]", |
" b001 IMAQ-PCI-1408", |
" b011 IMAQ-PXI-1408", |
" b021 IMAQ-PCI-1424", |
" b031 IMAQ-PCI-1413", |
" b041 IMAQ-PCI-1407", |
" b051 IMAQ-PXI-1407", |
" b061 IMAQ-PCI-1411", |
" b071 IMAQ-PCI-1422", |
" b081 IMAQ-PXI-1422", |
" b091 IMAQ-PXI-1411", |
" c801 PCI-GPIB", |
" c831 PCI-GPIB bridge", |
"1094 First International Computers [FIC]", |
"1095 Silicon Image, Inc.", |
" 0240 Adaptec AAR-1210SA SATA HostRAID Controller", |
" 0640 PCI0640", |
" 0643 PCI0643", |
" 0646 PCI0646", |
" 0647 PCI0647", |
" 0648 PCI0648", |
" 1043 8025 CUBX motherboard", |
" 0649 SiI 0649 Ultra ATA/100 PCI to ATA Host Controller", |
" 0e11 005d Integrated Ultra ATA-100 Dual Channel Controller", |
" 0e11 007e Integrated Ultra ATA-100 IDE RAID Controller", |
" 101e 0649 AMI MegaRAID IDE 100 Controller", |
" 0650 PBC0650A", |
" 0670 USB0670", |
" 1095 0670 USB0670", |
" 0673 USB0673", |
" 0680 PCI0680 Ultra ATA-133 Host Controller", |
" 1095 3680 Winic W-680 (Silicon Image 680 based)", |
" 3112 SiI 3112 [SATALink/SATARaid] Serial ATA Controller", |
" 1095 3112 SiI 3112 SATALink Controller", |
" 1095 6112 SiI 3112 SATARaid Controller", |
" 9005 0250 SATAConnect 1205SA Host Controller", |
" 3114 SiI 3114 [SATALink/SATARaid] Serial ATA Controller", |
" 1095 3114 SiI 3114 SATALink Controller", |
" 1095 6114 SiI 3114 SATARaid Controller", |
" 3124 SiI 3124 PCI-X Serial ATA Controller", |
" 1095 3124 SiI 3124 PCI-X Serial ATA Controller", |
" 3132 SiI 3132 Serial ATA Raid II Controller", |
" 3512 SiI 3512 [SATALink/SATARaid] Serial ATA Controller", |
" 1095 3512 SiI 3512 SATALink Controller", |
" 1095 6512 SiI 3512 SATARaid Controller", |
"1096 Alacron", |
"1097 Appian Technology", |
"1098 Quantum Designs (H.K.) Ltd", |
" 0001 QD-8500", |
" 0002 QD-8580", |
"1099 Samsung Electronics Co., Ltd", |
"109a Packard Bell", |
"109b Gemlight Computer Ltd.", |
"109c Megachips Corporation", |
"109d Zida Technologies Ltd.", |
"109e Brooktree Corporation", |
" 032e Bt878 Video Capture", |
" 0350 Bt848 Video Capture", |
" 0351 Bt849A Video capture", |
" 0369 Bt878 Video Capture", |
" 1002 0001 TV-Wonder", |
" 1002 0003 TV-Wonder/VE", |
" 036c Bt879(??) Video Capture", |
" 13e9 0070 Win/TV (Video Section)", |
" 036e Bt878 Video Capture", |
" 0070 13eb WinTV Series", |
" 0070 ff01 Viewcast Osprey 200", |
" 0071 0101 DigiTV PCI", |
" 107d 6606 WinFast TV 2000", |
" 11bd 0012 PCTV pro (TV + FM stereo receiver)", |
" 11bd 001c PCTV Sat (DBC receiver)", |
" 127a 0001 Bt878 Mediastream Controller NTSC", |
" 127a 0002 Bt878 Mediastream Controller PAL BG", |
" 127a 0003 Bt878a Mediastream Controller PAL BG", |
" 127a 0048 Bt878/832 Mediastream Controller", |
" 144f 3000 MagicTView CPH060 - Video", |
" 1461 0002 TV98 Series (TV/No FM/Remote)", |
" 1461 0003 AverMedia UltraTV PCI 350", |
" 1461 0004 AVerTV WDM Video Capture", |
" 1461 0761 AverTV DVB-T", |
" 14f1 0001 Bt878 Mediastream Controller NTSC", |
" 14f1 0002 Bt878 Mediastream Controller PAL BG", |
" 14f1 0003 Bt878a Mediastream Controller PAL BG", |
" 14f1 0048 Bt878/832 Mediastream Controller", |
" 1822 0001 VisionPlus DVB card", |
" 1851 1850 FlyVideo'98 - Video", |
" 1851 1851 FlyVideo II", |
" 1852 1852 FlyVideo'98 - Video (with FM Tuner)", |
" 18ac d500 DViCO FusionHDTV5 Lite", |
" 270f fc00 Digitop DTT-1000", |
" bd11 1200 PCTV pro (TV + FM stereo receiver)", |
" 036f Bt879 Video Capture", |
" 127a 0044 Bt879 Video Capture NTSC", |
" 127a 0122 Bt879 Video Capture PAL I", |
" 127a 0144 Bt879 Video Capture NTSC", |
" 127a 0222 Bt879 Video Capture PAL BG", |
" 127a 0244 Bt879a Video Capture NTSC", |
" 127a 0322 Bt879 Video Capture NTSC", |
" 127a 0422 Bt879 Video Capture NTSC", |
" 127a 1122 Bt879 Video Capture PAL I", |
" 127a 1222 Bt879 Video Capture PAL BG", |
" 127a 1322 Bt879 Video Capture NTSC", |
" 127a 1522 Bt879a Video Capture PAL I", |
" 127a 1622 Bt879a Video Capture PAL BG", |
" 127a 1722 Bt879a Video Capture NTSC", |
" 14f1 0044 Bt879 Video Capture NTSC", |
" 14f1 0122 Bt879 Video Capture PAL I", |
" 14f1 0144 Bt879 Video Capture NTSC", |
" 14f1 0222 Bt879 Video Capture PAL BG", |
" 14f1 0244 Bt879a Video Capture NTSC", |
" 14f1 0322 Bt879 Video Capture NTSC", |
" 14f1 0422 Bt879 Video Capture NTSC", |
" 14f1 1122 Bt879 Video Capture PAL I", |
" 14f1 1222 Bt879 Video Capture PAL BG", |
" 14f1 1322 Bt879 Video Capture NTSC", |
" 14f1 1522 Bt879a Video Capture PAL I", |
" 14f1 1622 Bt879a Video Capture PAL BG", |
" 14f1 1722 Bt879a Video Capture NTSC", |
" 1851 1850 FlyVideo'98 - Video", |
" 1851 1851 FlyVideo II", |
" 1852 1852 FlyVideo'98 - Video (with FM Tuner)", |
" 0370 Bt880 Video Capture", |
" 1851 1850 FlyVideo'98", |
" 1851 1851 FlyVideo'98 EZ - video", |
" 1852 1852 FlyVideo'98 (with FM Tuner)", |
" 0878 Bt878 Audio Capture", |
" 0070 13eb WinTV Series", |
" 0070 ff01 Viewcast Osprey 200", |
" 0071 0101 DigiTV PCI", |
" 1002 0001 TV-Wonder", |
" 1002 0003 TV-Wonder/VE", |
" 11bd 0012 PCTV pro (TV + FM stereo receiver, audio section)", |
" 11bd 001c PCTV Sat (DBC receiver)", |
" 127a 0001 Bt878 Video Capture (Audio Section)", |
" 127a 0002 Bt878 Video Capture (Audio Section)", |
" 127a 0003 Bt878 Video Capture (Audio Section)", |
" 127a 0048 Bt878 Video Capture (Audio Section)", |
" 13e9 0070 Win/TV (Audio Section)", |
" 144f 3000 MagicTView CPH060 - Audio", |
" 1461 0002 Avermedia PCTV98 Audio Capture", |
" 1461 0004 AVerTV WDM Audio Capture", |
" 1461 0761 AVerTV DVB-T", |
" 14f1 0001 Bt878 Video Capture (Audio Section)", |
" 14f1 0002 Bt878 Video Capture (Audio Section)", |
" 14f1 0003 Bt878 Video Capture (Audio Section)", |
" 14f1 0048 Bt878 Video Capture (Audio Section)", |
" 1822 0001 VisionPlus DVB Card", |
" 18ac d500 DViCO FusionHDTV5 Lite", |
" 270f fc00 Digitop DTT-1000", |
" bd11 1200 PCTV pro (TV + FM stereo receiver, audio section)", |
" 0879 Bt879 Audio Capture", |
" 127a 0044 Bt879 Video Capture (Audio Section)", |
" 127a 0122 Bt879 Video Capture (Audio Section)", |
" 127a 0144 Bt879 Video Capture (Audio Section)", |
" 127a 0222 Bt879 Video Capture (Audio Section)", |
" 127a 0244 Bt879 Video Capture (Audio Section)", |
" 127a 0322 Bt879 Video Capture (Audio Section)", |
" 127a 0422 Bt879 Video Capture (Audio Section)", |
" 127a 1122 Bt879 Video Capture (Audio Section)", |
" 127a 1222 Bt879 Video Capture (Audio Section)", |
" 127a 1322 Bt879 Video Capture (Audio Section)", |
" 127a 1522 Bt879 Video Capture (Audio Section)", |
" 127a 1622 Bt879 Video Capture (Audio Section)", |
" 127a 1722 Bt879 Video Capture (Audio Section)", |
" 14f1 0044 Bt879 Video Capture (Audio Section)", |
" 14f1 0122 Bt879 Video Capture (Audio Section)", |
" 14f1 0144 Bt879 Video Capture (Audio Section)", |
" 14f1 0222 Bt879 Video Capture (Audio Section)", |
" 14f1 0244 Bt879 Video Capture (Audio Section)", |
" 14f1 0322 Bt879 Video Capture (Audio Section)", |
" 14f1 0422 Bt879 Video Capture (Audio Section)", |
" 14f1 1122 Bt879 Video Capture (Audio Section)", |
" 14f1 1222 Bt879 Video Capture (Audio Section)", |
" 14f1 1322 Bt879 Video Capture (Audio Section)", |
" 14f1 1522 Bt879 Video Capture (Audio Section)", |
" 14f1 1622 Bt879 Video Capture (Audio Section)", |
" 14f1 1722 Bt879 Video Capture (Audio Section)", |
" 0880 Bt880 Audio Capture", |
" 2115 BtV 2115 Mediastream controller", |
" 2125 BtV 2125 Mediastream controller", |
" 2164 BtV 2164", |
" 2165 BtV 2165", |
" 8230 Bt8230 ATM Segment/Reassembly Ctrlr (SRC)", |
" 8472 Bt8472", |
" 8474 Bt8474", |
"109f Trigem Computer Inc.", |
"10a0 Meidensha Corporation", |
"10a1 Juko Electronics Ind. Co. Ltd", |
"10a2 Quantum Corporation", |
"10a3 Everex Systems Inc", |
"10a4 Globe Manufacturing Sales", |
"10a5 Smart Link Ltd.", |
" 3052 SmartPCI562 56K Modem", |
" 5449 SmartPCI561 modem", |
"10a6 Informtech Industrial Ltd.", |
"10a7 Benchmarq Microelectronics", |
"10a8 Sierra Semiconductor", |
" 0000 STB Horizon 64", |
"10a9 Silicon Graphics, Inc.", |
" 0001 Crosstalk to PCI Bridge", |
" 0002 Linc I/O controller", |
" 0003 IOC3 I/O controller", |
" 0004 O2 MACE", |
" 0005 RAD Audio", |
" 0006 HPCEX", |
" 0007 RPCEX", |
" 0008 DiVO VIP", |
" 0009 AceNIC Gigabit Ethernet", |
" 10a9 8002 AceNIC Gigabit Ethernet", |
" 0010 AMP Video I/O", |
" 0011 GRIP", |
" 0012 SGH PSHAC GSN", |
" 1001 Magic Carpet", |
" 1002 Lithium", |
" 1003 Dual JPEG 1", |
" 1004 Dual JPEG 2", |
" 1005 Dual JPEG 3", |
" 1006 Dual JPEG 4", |
" 1007 Dual JPEG 5", |
" 1008 Cesium", |
" 100a IOC4 I/O controller", |
" 2001 Fibre Channel", |
" 2002 ASDE", |
" 4001 TIO-CE PCI Express Bridge", |
" 4002 TIO-CE PCI Express Port", |
" 8001 O2 1394", |
" 8002 G-net NT", |
" 8010 Broadcom e-net [SGI IO9/IO10 BaseIO]", |
" 8018 Broadcom e-net [SGI A330 Server BaseIO]", |
"10aa ACC Microelectronics", |
" 0000 ACCM 2188", |
"10ab Digicom", |
"10ac Honeywell IAC", |
"10ad Symphony Labs", |
" 0001 W83769F", |
" 0003 SL82C103", |
" 0005 SL82C105", |
" 0103 SL82c103", |
" 0105 SL82c105", |
" 0565 W83C553", |
"10ae Cornerstone Technology", |
"10af Micro Computer Systems Inc", |
"10b0 CardExpert Technology", |
"10b1 Cabletron Systems Inc", |
"10b2 Raytheon Company", |
"10b3 Databook Inc", |
" 3106 DB87144", |
" b106 DB87144", |
"10b4 STB Systems Inc", |
" 1b1d Velocity 128 3D", |
" 10b4 237e Velocity 4400", |
"10b5 PLX Technology, Inc.", |
" 0001 i960 PCI bus interface", |
" 1042 Brandywine / jxi2, Inc. - PMC-SyncClock32, IRIG A & B, Nasa 36", |
" 1076 VScom 800 8 port serial adaptor", |
" 1077 VScom 400 4 port serial adaptor", |
" 1078 VScom 210 2 port serial and 1 port parallel adaptor", |
" 1103 VScom 200 2 port serial adaptor", |
" 1146 VScom 010 1 port parallel adaptor", |
" 1147 VScom 020 2 port parallel adaptor", |
" 2540 IXXAT CAN-Interface PC-I 04/PCI", |
" 2724 Thales PCSM Security Card", |
" 6540 PCI6540/6466 PCI-PCI bridge (transparent mode)", |
" 4c53 10e0 PSL09 PrPMC", |
" 6541 PCI6540/6466 PCI-PCI bridge (non-transparent mode, primary side)", |
" 4c53 10e0 PSL09 PrPMC", |
" 6542 PCI6540/6466 PCI-PCI bridge (non-transparent mode, secondary side)", |
" 4c53 10e0 PSL09 PrPMC", |
" 8111 PEX 8111 PCI Express-to-PCI Bridge", |
" 8114 PEX 8114 PCI Express-to-PCI/PCI-X Bridge", |
" 8516 PEX 8516 Versatile PCI Express Switch", |
" 8532 PEX 8532 Versatile PCI Express Switch", |
" 9030 PCI <-> IOBus Bridge Hot Swap", |
" 10b5 2862 Alpermann+Velte PCL PCI LV (3V/5V): Timecode Reader Board", |
" 10b5 2906 Alpermann+Velte PCI TS (3V/5V): Time Synchronisation Board", |
" 10b5 2940 Alpermann+Velte PCL PCI D (3V/5V): Timecode Reader Board", |
" 10b5 2977 IXXAT iPC-I XC16/PCI CAN Board", |
" 10b5 2978 SH ARC-PCIu SOHARD ARCNET card", |
" 10b5 3025 Alpermann+Velte PCL PCI L (3V/5V): Timecode Reader Board", |
" 10b5 3068 Alpermann+Velte PCL PCI HD (3V/5V): Timecode Reader Board", |
" 1397 3136 4xS0-ISDN PCI Adapter", |
" 1397 3137 S2M-E1-ISDN PCI Adapter", |
" 1518 0200 Kontron ThinkIO-C", |
" 15ed 1002 MCCS 8-port Serial Hot Swap", |
" 15ed 1003 MCCS 16-port Serial Hot Swap", |
" 9036 9036", |
" 9050 PCI <-> IOBus Bridge", |
" 10b5 1067 IXXAT CAN i165", |
" 10b5 1172 IK220 (Heidenhain)", |
" 10b5 2036 SatPak GPS", |
" 10b5 2221 Alpermann+Velte PCL PCI LV: Timecode Reader Board", |
" 10b5 2273 SH ARC-PCI SOHARD ARCNET card", |
" 10b5 2431 Alpermann+Velte PCL PCI D: Timecode Reader Board", |
" 10b5 2905 Alpermann+Velte PCI TS: Time Synchronisation Board", |
" 10b5 9050 MP9050", |
" 1498 0362 TPMC866 8 Channel Serial Card", |
" 1522 0001 RockForce 4 Port V.90 Data/Fax/Voice Modem", |
" 1522 0002 RockForce 2 Port V.90 Data/Fax/Voice Modem", |
" 1522 0003 RockForce 6 Port V.90 Data/Fax/Voice Modem", |
" 1522 0004 RockForce 8 Port V.90 Data/Fax/Voice Modem", |
" 1522 0010 RockForce2000 4 Port V.90 Data/Fax/Voice Modem", |
" 1522 0020 RockForce2000 2 Port V.90 Data/Fax/Voice Modem", |
" 15ed 1000 Macrolink MCCS 8-port Serial", |
" 15ed 1001 Macrolink MCCS 16-port Serial", |
" 15ed 1002 Macrolink MCCS 8-port Serial Hot Swap", |
" 15ed 1003 Macrolink MCCS 16-port Serial Hot Swap", |
" 5654 2036 OpenSwitch 6 Telephony card", |
" 5654 3132 OpenSwitch 12 Telephony card", |
" 5654 5634 OpenLine4 Telephony Card", |
" d531 c002 PCIntelliCAN 2xSJA1000 CAN bus", |
" d84d 4006 EX-4006 1P", |
" d84d 4008 EX-4008 1P EPP/ECP", |
" d84d 4014 EX-4014 2P", |
" d84d 4018 EX-4018 3P EPP/ECP", |
" d84d 4025 EX-4025 1S(16C550) RS-232", |
" d84d 4027 EX-4027 1S(16C650) RS-232", |
" d84d 4028 EX-4028 1S(16C850) RS-232", |
" d84d 4036 EX-4036 2S(16C650) RS-232", |
" d84d 4037 EX-4037 2S(16C650) RS-232", |
" d84d 4038 EX-4038 2S(16C850) RS-232", |
" d84d 4052 EX-4052 1S(16C550) RS-422/485", |
" d84d 4053 EX-4053 2S(16C550) RS-422/485", |
" d84d 4055 EX-4055 4S(16C550) RS-232", |
" d84d 4058 EX-4055 4S(16C650) RS-232", |
" d84d 4065 EX-4065 8S(16C550) RS-232", |
" d84d 4068 EX-4068 8S(16C650) RS-232", |
" d84d 4078 EX-4078 2S(16C552) RS-232+1P", |
" 9054 PCI <-> IOBus Bridge", |
" 10b5 2455 Wessex Techology PHIL-PCI", |
" 10b5 2696 Innes Corp AM Radcap card", |
" 10b5 2717 Innes Corp Auricon card", |
" 10b5 2844 Innes Corp TVS Encoder card", |
" 12c7 4001 Intel Dialogic DM/V960-4T1 PCI", |
" 12d9 0002 PCI Prosody Card rev 1.5", |
" 16df 0011 PIKA PrimeNet MM PCI", |
" 16df 0012 PIKA PrimeNet MM cPCI 8", |
" 16df 0013 PIKA PrimeNet MM cPCI 8 (without CAS Signaling)", |
" 16df 0014 PIKA PrimeNet MM cPCI 4", |
" 16df 0015 PIKA Daytona MM", |
" 16df 0016 PIKA InLine MM", |
" 9056 Francois", |
" 10b5 2979 CellinkBlade 11 - CPCI board VoATM AAL1", |
" 9060 9060", |
" 906d 9060SD", |
" 125c 0640 Aries 16000P", |
" 906e 9060ES", |
" 9080 9080", |
" 103c 10eb (Agilent) E2777B 83K Series Optical Communication Interface", |
" 103c 10ec (Agilent) E6978-66442 PCI CIC", |
" 10b5 9080 9080 [real subsystem ID not set]", |
" 129d 0002 Aculab PCI Prosidy card", |
" 12d9 0002 PCI Prosody Card", |
" 12df 4422 4422PCI ['Do-All' Telemetry Data Aquisition System]", |
" bb04 B&B 3PCIOSD1A Isolated PCI Serial", |
"10b6 Madge Networks", |
" 0001 Smart 16/4 PCI Ringnode", |
" 0002 Smart 16/4 PCI Ringnode Mk2", |
" 10b6 0002 Smart 16/4 PCI Ringnode Mk2", |
" 10b6 0006 16/4 CardBus Adapter", |
" 0003 Smart 16/4 PCI Ringnode Mk3", |
" 0e11 b0fd Compaq NC4621 PCI, 4/16, WOL", |
" 10b6 0003 Smart 16/4 PCI Ringnode Mk3", |
" 10b6 0007 Presto PCI Plus Adapter", |
" 0004 Smart 16/4 PCI Ringnode Mk1", |
" 0006 16/4 Cardbus Adapter", |
" 10b6 0006 16/4 CardBus Adapter", |
" 0007 Presto PCI Adapter", |
" 10b6 0007 Presto PCI", |
" 0009 Smart 100/16/4 PCI-HS Ringnode", |
" 10b6 0009 Smart 100/16/4 PCI-HS Ringnode", |
" 000a Smart 100/16/4 PCI Ringnode", |
" 10b6 000a Smart 100/16/4 PCI Ringnode", |
" 000b 16/4 CardBus Adapter Mk2", |
" 10b6 0008 16/4 CardBus Adapter Mk2", |
" 10b6 000b 16/4 Cardbus Adapter Mk2", |
" 000c RapidFire 3140V2 16/4 TR Adapter", |
" 10b6 000c RapidFire 3140V2 16/4 TR Adapter", |
" 1000 Collage 25/155 ATM Client Adapter", |
" 1001 Collage 155 ATM Server Adapter", |
"10b7 3Com Corporation", |
" 0001 3c985 1000BaseSX (SX/TX)", |
" 0013 AR5212 802.11abg NIC (3CRDAG675)", |
" 10b7 2031 3CRDAG675 11a/b/g Wireless PCI Adapter", |
" 0910 3C910-A01", |
" 1006 MINI PCI type 3B Data Fax Modem", |
" 1007 Mini PCI 56k Winmodem", |
" 10b7 615c Mini PCI 56K Modem", |
" 1201 3c982-TXM 10/100baseTX Dual Port A [Hydra]", |
" 1202 3c982-TXM 10/100baseTX Dual Port B [Hydra]", |
" 1700 3c940 10/100/1000Base-T [Marvell]", |
" 1043 80eb A7V600/P4P800/K8V motherboard", |
" 10b7 0010 3C940 Gigabit LOM Ethernet Adapter", |
" 10b7 0020 3C941 Gigabit LOM Ethernet Adapter", |
" 147b 1407 KV8-MAX3 motherboard", |
" 3390 3c339 TokenLink Velocity", |
" 3590 3c359 TokenLink Velocity XL", |
" 10b7 3590 TokenLink Velocity XL Adapter (3C359/359B)", |
" 4500 3c450 HomePNA [Tornado]", |
" 5055 3c555 Laptop Hurricane", |
" 5057 3c575 Megahertz 10/100 LAN CardBus [Boomerang]", |
" 10b7 5a57 3C575 Megahertz 10/100 LAN Cardbus PC Card", |
" 5157 3cCFE575BT Megahertz 10/100 LAN CardBus [Cyclone]", |
" 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card", |
" 5257 3cCFE575CT CardBus [Cyclone]", |
" 10b7 5c57 FE575C-3Com 10/100 LAN CardBus-Fast Ethernet", |
" 5900 3c590 10BaseT [Vortex]", |
" 5920 3c592 EISA 10mbps Demon/Vortex", |
" 5950 3c595 100BaseTX [Vortex]", |
" 5951 3c595 100BaseT4 [Vortex]", |
" 5952 3c595 100Base-MII [Vortex]", |
" 5970 3c597 EISA Fast Demon/Vortex", |
" 5b57 3c595 Megahertz 10/100 LAN CardBus [Boomerang]", |
" 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card", |
" 6000 3CRSHPW796 [OfficeConnect Wireless CardBus]", |
" 6001 3com 3CRWE154G72 [Office Connect Wireless LAN Adapter]", |
" 6055 3c556 Hurricane CardBus [Cyclone]", |
" 6056 3c556B CardBus [Tornado]", |
" 10b7 6556 10/100 Mini PCI Ethernet Adapter", |
" 6560 3cCFE656 CardBus [Cyclone]", |
" 10b7 656a 3CCFEM656 10/100 LAN+56K Modem CardBus", |
" 6561 3cCFEM656 10/100 LAN+56K Modem CardBus", |
" 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus", |
" 6562 3cCFEM656B 10/100 LAN+Winmodem CardBus [Cyclone]", |
" 10b7 656b 3CCFEM656B 10/100 LAN+56K Modem CardBus", |
" 6563 3cCFEM656B 10/100 LAN+56K Modem CardBus", |
" 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus", |
" 6564 3cXFEM656C 10/100 LAN+Winmodem CardBus [Tornado]", |
" 7646 3cSOHO100-TX Hurricane", |
" 7770 3CRWE777 PCI(PLX) Wireless Adaptor [Airconnect]", |
" 7940 3c803 FDDILink UTP Controller", |
" 7980 3c804 FDDILink SAS Controller", |
" 7990 3c805 FDDILink DAS Controller", |
" 80eb 3c940B 10/100/1000Base-T", |
" 8811 Token ring", |
" 9000 3c900 10BaseT [Boomerang]", |
" 9001 3c900 10Mbps Combo [Boomerang]", |
" 9004 3c900B-TPO Etherlink XL [Cyclone]", |
" 10b7 9004 3C900B-TPO Etherlink XL TPO 10Mb", |
" 9005 3c900B-Combo Etherlink XL [Cyclone]", |
" 10b7 9005 3C900B-Combo Etherlink XL Combo", |
" 9006 3c900B-TPC Etherlink XL [Cyclone]", |
" 900a 3c900B-FL 10base-FL [Cyclone]", |
" 9050 3c905 100BaseTX [Boomerang]", |
" 9051 3c905 100BaseT4 [Boomerang]", |
" 9055 3c905B 100BaseTX [Cyclone]", |
" 1028 0080 3C905B Fast Etherlink XL 10/100", |
" 1028 0081 3C905B Fast Etherlink XL 10/100", |
" 1028 0082 3C905B Fast Etherlink XL 10/100", |
" 1028 0083 3C905B Fast Etherlink XL 10/100", |
" 1028 0084 3C905B Fast Etherlink XL 10/100", |
" 1028 0085 3C905B Fast Etherlink XL 10/100", |
" 1028 0086 3C905B Fast Etherlink XL 10/100", |
" 1028 0087 3C905B Fast Etherlink XL 10/100", |
" 1028 0088 3C905B Fast Etherlink XL 10/100", |
" 1028 0089 3C905B Fast Etherlink XL 10/100", |
" 1028 0090 3C905B Fast Etherlink XL 10/100", |
" 1028 0091 3C905B Fast Etherlink XL 10/100", |
" 1028 0092 3C905B Fast Etherlink XL 10/100", |
" 1028 0093 3C905B Fast Etherlink XL 10/100", |
" 1028 0094 3C905B Fast Etherlink XL 10/100", |
" 1028 0095 3C905B Fast Etherlink XL 10/100", |
" 1028 0096 3C905B Fast Etherlink XL 10/100", |
" 1028 0097 3C905B Fast Etherlink XL 10/100", |
" 1028 0098 3C905B Fast Etherlink XL 10/100", |
" 1028 0099 3C905B Fast Etherlink XL 10/100", |
" 10b7 9055 3C905B Fast Etherlink XL 10/100", |
" 9056 3c905B-T4 Fast EtherLink XL [Cyclone]", |
" 9058 3c905B Deluxe Etherlink 10/100/BNC [Cyclone]", |
" 905a 3c905B-FX Fast Etherlink XL FX 100baseFx [Cyclone]", |
" 9200 3c905C-TX/TX-M [Tornado]", |
" 1028 0095 3C920 Integrated Fast Ethernet Controller", |
" 1028 0097 3C920 Integrated Fast Ethernet Controller", |
" 1028 00fe Optiplex GX240", |
" 1028 012a 3C920 Integrated Fast Ethernet Controller [Latitude C640]", |
" 10b7 1000 3C905C-TX Fast Etherlink for PC Management NIC", |
" 10b7 7000 10/100 Mini PCI Ethernet Adapter", |
" 10f1 2466 Tiger MPX S2466 (3C920 Integrated Fast Ethernet Controller)", |
" 9201 3C920B-EMB Integrated Fast Ethernet Controller [Tornado]", |
" 1043 80ab A7N8X Deluxe onboard 3C920B-EMB Integrated Fast Ethernet Controller", |
" 9202 3Com 3C920B-EMB-WNM Integrated Fast Ethernet Controller", |
" 9210 3C920B-EMB-WNM Integrated Fast Ethernet Controller", |
" 9300 3CSOHO100B-TX 910-A01 [tulip]", |
" 9800 3c980-TX Fast Etherlink XL Server Adapter [Cyclone]", |
" 10b7 9800 3c980-TX Fast Etherlink XL Server Adapter", |
" 9805 3c980-C 10/100baseTX NIC [Python-T]", |
" 10b7 1201 EtherLink Server 10/100 Dual Port A", |
" 10b7 1202 EtherLink Server 10/100 Dual Port B", |
" 10b7 9805 3c980 10/100baseTX NIC [Python-T]", |
" 10f1 2462 Thunder K7 S2462", |
" 9900 3C990-TX [Typhoon]", |
" 9902 3CR990-TX-95 [Typhoon 56-bit]", |
" 9903 3CR990-TX-97 [Typhoon 168-bit]", |
" 9904 3C990B-TX-M/3C990BSVR [Typhoon2]", |
" 10b7 1000 3CR990B-TX-M [Typhoon2]", |
" 10b7 2000 3CR990BSVR [Typhoon2 Server]", |
" 9905 3CR990-FX-95/97/95 [Typhon Fiber]", |
" 10b7 1101 3CR990-FX-95 [Typhoon Fiber 56-bit]", |
" 10b7 1102 3CR990-FX-97 [Typhoon Fiber 168-bit]", |
" 10b7 2101 3CR990-FX-95 Server [Typhoon Fiber 56-bit]", |
" 10b7 2102 3CR990-FX-97 Server [Typhoon Fiber 168-bit]", |
" 9908 3CR990SVR95 [Typhoon Server 56-bit]", |
" 9909 3CR990SVR97 [Typhoon Server 168-bit]", |
" 990a 3C990SVR [Typhoon Server]", |
" 990b 3C990SVR [Typhoon Server]", |
"10b8 Standard Microsystems Corp [SMC]", |
" 0005 83c170 EPIC/100 Fast Ethernet Adapter", |
" 1055 e000 LANEPIC 10/100 [EVB171Q-PCI]", |
" 1055 e002 LANEPIC 10/100 [EVB171G-PCI]", |
" 10b8 a011 EtherPower II 10/100", |
" 10b8 a014 EtherPower II 10/100", |
" 10b8 a015 EtherPower II 10/100", |
" 10b8 a016 EtherPower II 10/100", |
" 10b8 a017 EtherPower II 10/100", |
" 0006 83c175 EPIC/100 Fast Ethernet Adapter", |
" 1055 e100 LANEPIC Cardbus Fast Ethernet Adapter", |
" 1055 e102 LANEPIC Cardbus Fast Ethernet Adapter", |
" 1055 e300 LANEPIC Cardbus Fast Ethernet Adapter", |
" 1055 e302 LANEPIC Cardbus Fast Ethernet Adapter", |
" 10b8 a012 LANEPIC Cardbus Fast Ethernet Adapter", |
" 13a2 8002 LANEPIC Cardbus Fast Ethernet Adapter", |
" 13a2 8006 LANEPIC Cardbus Fast Ethernet Adapter", |
" 1000 FDC 37c665", |
" 1001 FDC 37C922", |
" 2802 SMC2802W [EZ Connect g]", |
" a011 83C170QF", |
" b106 SMC34C90", |
"10b9 ALi Corporation", |
" 0101 CMI8338/C3DX PCI Audio Device", |
" 0111 C-Media CMI8738/C3DX Audio Device (OEM)", |
" 10b9 0111 C-Media CMI8738/C3DX Audio Device (OEM)", |
" 0780 Multi-IO Card", |
" 0782 Multi-IO Card", |
" 1435 M1435", |
" 1445 M1445", |
" 1449 M1449", |
" 1451 M1451", |
" 1461 M1461", |
" 1489 M1489", |
" 1511 M1511 [Aladdin]", |
" 1512 M1512 [Aladdin]", |
" 1513 M1513 [Aladdin]", |
" 1521 M1521 [Aladdin III]", |
" 10b9 1521 ALI M1521 Aladdin III CPU Bridge", |
" 1523 M1523", |
" 10b9 1523 ALI M1523 ISA Bridge", |
" 1531 M1531 [Aladdin IV]", |
" 1533 M1533/M1535 PCI to ISA Bridge [Aladdin IV/V/V+]", |
" 1014 053b ThinkPad R40e (2684-HVG) PCI to ISA Bridge", |
" 10b9 1533 ALi M1533 Aladdin IV/V ISA Bridge", |
" 1541 M1541", |
" 10b9 1541 ALI M1541 Aladdin V/V+ AGP System Controller", |
" 1543 M1543", |
" 1563 M1563 HyperTransport South Bridge", |
" 1573 PCI to LPC Controller", |
" 1621 M1621", |
" 1631 ALI M1631 PCI North Bridge Aladdin Pro III", |
" 1632 M1632M Northbridge+Trident", |
" 1641 ALI M1641 PCI North Bridge Aladdin Pro IV", |
" 1644 M1644/M1644T Northbridge+Trident", |
" 1646 M1646 Northbridge+Trident", |
" 1647 M1647 Northbridge [MAGiK 1 / MobileMAGiK 1]", |
" 1651 M1651/M1651T Northbridge [Aladdin-Pro 5/5M,Aladdin-Pro 5T/5TM]", |
" 1671 M1671 Super P4 Northbridge [AGP4X,PCI and SDR/DDR]", |
" 1672 M1672 Northbridge [CyberALADDiN-P4]", |
" 1681 M1681 P4 Northbridge [AGP8X,HyperTransport and SDR/DDR]", |
" 1687 M1687 K8 Northbridge [AGP8X and HyperTransport]", |
" 1689 M1689 K8 Northbridge [Super K8 Single Chip]", |
" 1695 M1695 K8 Northbridge [PCI Express and HyperTransport]", |
" 1697 M1697 HTT Host Bridge", |
" 3141 M3141", |
" 3143 M3143", |
" 3145 M3145", |
" 3147 M3147", |
" 3149 M3149", |
" 3151 M3151", |
" 3307 M3307", |
" 3309 M3309", |
" 3323 M3325 Video/Audio Decoder", |
" 5212 M4803", |
" 5215 MS4803", |
" 5217 M5217H", |
" 5219 M5219", |
" 5225 M5225", |
" 5228 M5228 ALi ATA/RAID Controller", |
" 5229 M5229 IDE", |
" 1014 050f ThinkPad R30", |
" 1014 053d ThinkPad R40e (2684-HVG) builtin IDE", |
" 103c 0024 Pavilion ze4400 builtin IDE", |
" 1043 8053 A7A266 Motherboard IDE", |
" 5235 M5225", |
" 5237 USB 1.1 Controller", |
" 1014 0540 ThinkPad R40e (2684-HVG) builtin USB", |
" 103c 0024 Pavilion ze4400 builtin USB", |
" 104d 810f VAIO PCG-U1 USB/OHCI Revision 1.0", |
" 5239 USB 2.0 Controller", |
" 5243 M1541 PCI to AGP Controller", |
" 5246 AGP8X Controller", |
" 5247 PCI to AGP Controller", |
" 5249 M5249 HTT to PCI Bridge", |
" 524b PCI Express Root Port", |
" 524c PCI Express Root Port", |
" 524d PCI Express Root Port", |
" 524e PCI Express Root Port", |
" 5251 M5251 P1394 OHCI 1.0 Controller", |
" 5253 M5253 P1394 OHCI 1.1 Controller", |
" 5261 M5261 Ethernet Controller", |
" 5263 M5263 Ethernet Controller", |
" 5281 ALi M5281 Serial ATA / RAID Host Controller", |
" 5287 ULi 5287 SATA", |
" 5288 ULi M5288 SATA", |
" 5289 ULi 5289 SATA", |
" 5450 Lucent Technologies Soft Modem AMR", |
" 5451 M5451 PCI AC-Link Controller Audio Device", |
" 1014 0506 ThinkPad R30", |
" 1014 053e ThinkPad R40e (2684-HVG) builtin Audio", |
" 103c 0024 Pavilion ze4400 builtin Audio", |
" 10b9 5451 HP Compaq nc4010 (DY885AA#ABN)", |
" 5453 M5453 PCI AC-Link Controller Modem Device", |
" 5455 M5455 PCI AC-Link Controller Audio Device", |
" 5457 M5457 AC'97 Modem Controller", |
" 1014 0535 ThinkPad R40e (2684-HVG) builtin modem", |
" 103c 0024 Pavilion ze4400 builtin Modem Device", |
" 5459 SmartLink SmartPCI561 56K Modem", |
" 545a SmartLink SmartPCI563 56K Modem", |
" 5461 High Definition Audio/AC'97 Host Controller", |
" 5471 M5471 Memory Stick Controller", |
" 5473 M5473 SD-MMC Controller", |
" 7101 M7101 Power Management Controller [PMU]", |
" 1014 0510 ThinkPad R30", |
" 1014 053c ThinkPad R40e (2684-HVG) Power Management Controller", |
" 103c 0024 Pavilion ze4400", |
"10ba Mitsubishi Electric Corp.", |
" 0301 AccelGraphics AccelECLIPSE", |
" 0304 AccelGALAXY A2100 [OEM Evans & Sutherland]", |
" 0308 Tornado 3000 [OEM Evans & Sutherland]", |
" 1002 VG500 [VolumePro Volume Rendering Accelerator]", |
"10bb Dapha Electronics Corporation", |
"10bc Advanced Logic Research", |
"10bd Surecom Technology", |
" 0e34 NE-34", |
"10be Tseng Labs International Co.", |
"10bf Most Inc", |
"10c0 Boca Research Inc.", |
"10c1 ICM Co., Ltd.", |
"10c2 Auspex Systems Inc.", |
"10c3 Samsung Semiconductors, Inc.", |
" 1100 Smartether100 SC1100 LAN Adapter (i82557B)", |
"10c4 Award Software International Inc.", |
"10c5 Xerox Corporation", |
"10c6 Rambus Inc.", |
"10c7 Media Vision", |
"10c8 Neomagic Corporation", |
" 0001 NM2070 [MagicGraph 128]", |
" 0002 NM2090 [MagicGraph 128V]", |
" 0003 NM2093 [MagicGraph 128ZV]", |
" 0004 NM2160 [MagicGraph 128XD]", |
" 1014 00ba MagicGraph 128XD", |
" 1025 1007 MagicGraph 128XD", |
" 1028 0074 MagicGraph 128XD", |
" 1028 0075 MagicGraph 128XD", |
" 1028 007d MagicGraph 128XD", |
" 1028 007e MagicGraph 128XD", |
" 1033 802f MagicGraph 128XD", |
" 104d 801b MagicGraph 128XD", |
" 104d 802f MagicGraph 128XD", |
" 104d 830b MagicGraph 128XD", |
" 10ba 0e00 MagicGraph 128XD", |
" 10c8 0004 MagicGraph 128XD", |
" 10cf 1029 MagicGraph 128XD", |
" 10f7 8308 MagicGraph 128XD", |
" 10f7 8309 MagicGraph 128XD", |
" 10f7 830b MagicGraph 128XD", |
" 10f7 830d MagicGraph 128XD", |
" 10f7 8312 MagicGraph 128XD", |
" 0005 NM2200 [MagicGraph 256AV]", |
" 1014 00dd ThinkPad 570", |
" 1028 0088 Latitude CPi A", |
" 0006 NM2360 [MagicMedia 256ZX]", |
" 0016 NM2380 [MagicMedia 256XL+]", |
" 10c8 0016 MagicMedia 256XL+", |
" 0025 NM2230 [MagicGraph 256AV+]", |
" 0083 NM2093 [MagicGraph 128ZV+]", |
" 8005 NM2200 [MagicMedia 256AV Audio]", |
" 0e11 b0d1 MagicMedia 256AV Audio Device on Discovery", |
" 0e11 b126 MagicMedia 256AV Audio Device on Durango", |
" 1014 00dd MagicMedia 256AV Audio Device on BlackTip Thinkpad", |
" 1025 1003 MagicMedia 256AV Audio Device on TravelMate 720", |
" 1028 0088 Latitude CPi A", |
" 1028 008f MagicMedia 256AV Audio Device on Colorado Inspiron", |
" 103c 0007 MagicMedia 256AV Audio Device on Voyager II", |
" 103c 0008 MagicMedia 256AV Audio Device on Voyager III", |
" 103c 000d MagicMedia 256AV Audio Device on Omnibook 900", |
" 10c8 8005 MagicMedia 256AV Audio Device on FireAnt", |
" 110a 8005 MagicMedia 256AV Audio Device", |
" 14c0 0004 MagicMedia 256AV Audio Device", |
" 8006 NM2360 [MagicMedia 256ZX Audio]", |
" 8016 NM2380 [MagicMedia 256XL+ Audio]", |
"10c9 Dataexpert Corporation", |
"10ca Fujitsu Microelectr., Inc.", |
"10cb Omron Corporation", |
"10cc Mai Logic Incorporated", |
" 0660 Articia S Host Bridge", |
" 0661 Articia S PCI Bridge", |
"10cd Advanced System Products, Inc", |
" 1100 ASC1100", |
" 1200 ASC1200 [(abp940) Fast SCSI-II]", |
" 1300 ABP940-U / ABP960-U", |
" 10cd 1310 ASC1300 SCSI Adapter", |
" 2300 ABP940-UW", |
" 2500 ABP940-U2W", |
"10ce Radius", |
"10cf Fujitsu Limited.", |
" 2001 mb86605", |
"10d1 FuturePlus Systems Corp.", |
"10d2 Molex Incorporated", |
"10d3 Jabil Circuit Inc", |
"10d4 Hualon Microelectronics", |
"10d5 Autologic Inc.", |
"10d6 Cetia", |
"10d7 BCM Advanced Research", |
"10d8 Advanced Peripherals Labs", |
"10d9 Macronix, Inc. [MXIC]", |
" 0431 MX98715", |
" 0512 MX98713", |
" 0531 MX987x5", |
" 1186 1200 DFE-540TX ProFAST 10/100 Adapter", |
" 8625 MX86250", |
" 8626 Macronix MX86251 + 3Dfx Voodoo Rush", |
" 8888 MX86200", |
"10da Compaq IPG-Austin", |
" 0508 TC4048 Token Ring 4/16", |
" 3390 Tl3c3x9", |
"10db Rohm LSI Systems, Inc.", |
"10dc CERN/ECP/EDU", |
" 0001 STAR/RD24 SCI-PCI (PMC)", |
" 0002 TAR/RD24 SCI-PCI (PMC)", |
" 0021 HIPPI destination", |
" 0022 HIPPI source", |
" 10dc ATT2C15-3 FPGA", |
"10dd Evans & Sutherland", |
" 0100 Lightning 1200", |
"10de nVidia Corporation", |
" 0008 NV1 [EDGE 3D]", |
" 0009 NV1 [EDGE 3D]", |
" 0010 NV2 [Mutara V08]", |
" 0020 NV4 [RIVA TNT]", |
" 1043 0200 V3400 TNT", |
" 1048 0c18 Erazor II SGRAM", |
" 1048 0c19 Erazor II", |
" 1048 0c1b Erazor II", |
" 1048 0c1c Erazor II", |
" 1092 0550 Viper V550", |
" 1092 0552 Viper V550", |
" 1092 4804 Viper V550", |
" 1092 4808 Viper V550", |
" 1092 4810 Viper V550", |
" 1092 4812 Viper V550", |
" 1092 4815 Viper V550", |
" 1092 4820 Viper V550 with TV out", |
" 1092 4822 Viper V550", |
" 1092 4904 Viper V550", |
" 1092 4914 Viper V550", |
" 1092 8225 Viper V550", |
" 10b4 273d Velocity 4400", |
" 10b4 273e Velocity 4400", |
" 10b4 2740 Velocity 4400", |
" 10de 0020 Riva TNT", |
" 1102 1015 Graphics Blaster CT6710", |
" 1102 1016 Graphics Blaster RIVA TNT", |
" 0028 NV5 [RIVA TNT2/TNT2 Pro]", |
" 1043 0200 AGP-V3800 SGRAM", |
" 1043 0201 AGP-V3800 SDRAM", |
" 1043 0205 PCI-V3800", |
" 1043 4000 AGP-V3800PRO", |
" 1048 0c21 Synergy II", |
" 1048 0c28 Erazor III", |
" 1048 0c29 Erazor III", |
" 1048 0c2a Erazor III", |
" 1048 0c2b Erazor III", |
" 1048 0c31 Erazor III Pro", |
" 1048 0c32 Erazor III Pro", |
" 1048 0c33 Erazor III Pro", |
" 1048 0c34 Erazor III Pro", |
" 107d 2134 WinFast 3D S320 II + TV-Out", |
" 1092 4804 Viper V770", |
" 1092 4a00 Viper V770", |
" 1092 4a02 Viper V770 Ultra", |
" 1092 5a00 RIVA TNT2/TNT2 Pro", |
" 1092 6a02 Viper V770 Ultra", |
" 1092 7a02 Viper V770 Ultra", |
" 10de 0005 RIVA TNT2 Pro", |
" 10de 000f Compaq NVIDIA TNT2 Pro", |
" 1102 1020 3D Blaster RIVA TNT2", |
" 1102 1026 3D Blaster RIVA TNT2 Digital", |
" 14af 5810 Maxi Gamer Xentor", |
" 0029 NV5 [RIVA TNT2 Ultra]", |
" 1043 0200 AGP-V3800 Deluxe", |
" 1043 0201 AGP-V3800 Ultra SDRAM", |
" 1043 0205 PCI-V3800 Ultra", |
" 1048 0c2e Erazor III Ultra", |
" 1048 0c2f Erazor III Ultra", |
" 1048 0c30 Erazor III Ultra", |
" 1102 1021 3D Blaster RIVA TNT2 Ultra", |
" 1102 1029 3D Blaster RIVA TNT2 Ultra", |
" 1102 102f 3D Blaster RIVA TNT2 Ultra", |
" 14af 5820 Maxi Gamer Xentor 32", |
" 002a NV5 [Riva TnT2]", |
" 002b NV5 [Riva TnT2]", |
" 002c NV6 [Vanta/Vanta LT]", |
" 1043 0200 AGP-V3800 Combat SDRAM", |
" 1043 0201 AGP-V3800 Combat", |
" 1048 0c20 TNT2 Vanta", |
" 1048 0c21 TNT2 Vanta", |
" 1092 6820 Viper V730", |
" 1102 1031 CT6938 VANTA 8MB", |
" 1102 1034 CT6894 VANTA 16MB", |
" 14af 5008 Maxi Gamer Phoenix 2", |
" 002d NV5M64 [RIVA TNT2 Model 64/Model 64 Pro]", |
" 1043 0200 AGP-V3800M", |
" 1043 0201 AGP-V3800M", |
" 1048 0c3a Erazor III LT", |
" 1048 0c3b Erazor III LT", |
" 10de 001e M64 AGP4x", |
" 1102 1023 CT6892 RIVA TNT2 Value", |
" 1102 1024 CT6932 RIVA TNT2 Value 32Mb", |
" 1102 102c CT6931 RIVA TNT2 Value [Jumper]", |
" 1462 8808 MSI-8808", |
" 1554 1041 Pixelview RIVA TNT2 M64", |
" 1569 002d Palit Microsystems Daytona TNT2 M64", |
" 002e NV6 [Vanta]", |
" 002f NV6 [Vanta]", |
" 0034 MCP04 SMBus", |
" 0035 MCP04 IDE", |
" 0036 MCP04 Serial ATA Controller", |
" 0037 MCP04 Ethernet Controller", |
" 0038 MCP04 Ethernet Controller", |
" 003a MCP04 AC'97 Audio Controller", |
" 003b MCP04 USB Controller", |
" 003c MCP04 USB Controller", |
" 003d MCP04 PCI Bridge", |
" 003e MCP04 Serial ATA Controller", |
" 0040 NV40 [GeForce 6800 Ultra]", |
" 0041 NV40 [GeForce 6800]", |
" 1043 817b V9999 Gamer Edition", |
" 0042 NV40.2 [GeForce 6800 LE]", |
" 0043 NV40.3", |
" 0044 NV40 [GeForce 6800 XT]", |
" 0045 NV40 [GeForce 6800 GT]", |
" 0047 NV40 [GeForce 6800 GS]", |
" 1682 2109 GeForce 6800 GS", |
" 0049 NV40GL", |
" 004e NV40GL [Quadro FX 4000]", |
" 0050 CK804 ISA Bridge", |
" 1043 815a K8N4-E Mainboard", |
" 1458 0c11 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 0051 CK804 ISA Bridge", |
" 0052 CK804 SMBus", |
" 1043 815a K8N4-E Mainboard", |
" 1458 0c11 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 0053 CK804 IDE", |
" 1043 815a K8N4-E Mainboard", |
" 1458 5002 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 0054 CK804 Serial ATA Controller", |
" 1458 b003 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 0055 CK804 Serial ATA Controller", |
" 1043 815a K8N4-E Mainboard", |
" 1458 b003 GA-K8N Ultra-9 Mainboard", |
" 0056 CK804 Ethernet Controller", |
" 0057 CK804 Ethernet Controller", |
" 1043 8141 K8N4-E Mainboard", |
" 1458 e000 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 0058 CK804 AC'97 Modem", |
" 0059 CK804 AC'97 Audio Controller", |
" 1043 812a K8N4-E Mainboard", |
" 005a CK804 USB Controller", |
" 1043 815a K8N4-E Mainboard", |
" 1458 5004 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 005b CK804 USB Controller", |
" 1043 815a K8N4-E Mainboard", |
" 1458 5004 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 005c CK804 PCI Bridge", |
" 005d CK804 PCIE Bridge", |
" 005e CK804 Memory Controller", |
" 10f1 2891 Thunder K8SRE Mainboard", |
" 1458 5000 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 005f CK804 Memory Controller", |
" 0060 nForce2 ISA Bridge", |
" 1043 80ad A7N8X Mainboard", |
" a0a0 03ba UK79G-1394 motherboard", |
" 0064 nForce2 SMBus (MCP)", |
" a0a0 03bb UK79G-1394 motherboard", |
" 0065 nForce2 IDE", |
" a0a0 03b2 UK79G-1394 motherboard", |
" 0066 nForce2 Ethernet Controller", |
" 1043 80a7 A7N8X Mainboard onboard nForce2 Ethernet", |
" 0067 nForce2 USB Controller", |
" 1043 0c11 A7N8X Mainboard", |
" 0068 nForce2 USB Controller", |
" 1043 0c11 A7N8X Mainboard", |
" a0a0 03b4 UK79G-1394 motherboard", |
" 006a nForce2 AC97 Audio Controler (MCP)", |
" a0a0 0304 UK79G-1394 motherboard", |
" 006b nForce Audio Processing Unit", |
" 10de 006b nForce2 MCP Audio Processing Unit", |
" 006c nForce2 External PCI Bridge", |
" 006d nForce2 PCI Bridge", |
" 006e nForce2 FireWire (IEEE 1394) Controller", |
" a0a0 0306 UK79G-1394 motherboard", |
" 0080 MCP2A ISA bridge", |
" 147b 1c09 NV7 Motherboard", |
" 0084 MCP2A SMBus", |
" 147b 1c09 NV7 Motherboard", |
" 0085 MCP2A IDE", |
" 147b 1c09 NV7 Motherboard", |
" 0086 MCP2A Ethernet Controller", |
" 0087 MCP2A USB Controller", |
" 147b 1c09 NV7 Motherboard", |
" 0088 MCP2A USB Controller", |
" 147b 1c09 NV7 Motherboard", |
" 008a MCP2S AC'97 Audio Controller", |
" 147b 1c09 NV7 Motherboard", |
" 008b MCP2A PCI Bridge", |
" 008c MCP2A Ethernet Controller", |
" 008e nForce2 Serial ATA Controller", |
" 0090 G70 [GeForce 7800 GTX]", |
" 0091 G70 [GeForce 7800 GTX]", |
" 0092 G70 [GeForce 7800 GT]", |
" 0093 G70 [GeForce 7800 GS]", |
" 0098 GeForce Go 7800", |
" 0099 GE Force Go 7800 GTX", |
" 009d G70GL [Quadro FX4500]", |
" 00a0 NV5 [Aladdin TNT2]", |
" 14af 5810 Maxi Gamer Xentor", |
" 00c0 NV41 [GeForce 6800 GS]", |
" 00c1 NV41.1 [GeForce 6800]", |
" 00c2 NV41.2 [GeForce 6800 LE]", |
" 00c3 NV42 [Geforce 6800 XT]", |
" 00c8 NV41.8 [GeForce Go 6800]", |
" 00c9 NV41.9 [GeForce Go 6800 Ultra]", |
" 00cc NV41 [Quadro FX Go1400]", |
" 00cd NV41 [Quadro FX 3450/4000 SDI]", |
" 00ce NV41GL [Quadro FX 1400]", |
" 00d0 nForce3 LPC Bridge", |
" 00d1 nForce3 Host Bridge", |
" 00d2 nForce3 AGP Bridge", |
" 00d3 CK804 Memory Controller", |
" 00d4 nForce3 SMBus", |
" 00d5 nForce3 IDE", |
" 00d6 nForce3 Ethernet", |
" 00d7 nForce3 USB 1.1", |
" 00d8 nForce3 USB 2.0", |
" 00d9 nForce3 Audio", |
" 00da nForce3 Audio", |
" 00dd nForce3 PCI Bridge", |
" 00df CK8S Ethernet Controller", |
" 147b 1c0b NF8 Mainboard", |
" 00e0 nForce3 250Gb LPC Bridge", |
" 147b 1c0b NF8 Mainboard", |
" 00e1 nForce3 250Gb Host Bridge", |
" 147b 1c0b NF8 Mainboard", |
" 00e2 nForce3 250Gb AGP Host to PCI Bridge", |
" 00e3 CK8S Serial ATA Controller (v2.5)", |
" 147b 1c0b NF8 Mainboard", |
" 00e4 nForce 250Gb PCI System Management", |
" 147b 1c0b NF8 Mainboard", |
" 00e5 CK8S Parallel ATA Controller (v2.5)", |
" 147b 1c0b NF8 Mainboard", |
" 00e6 CK8S Ethernet Controller", |
" 00e7 CK8S USB Controller", |
" 147b 1c0b NF8 Mainboard", |
" 00e8 nForce3 EHCI USB 2.0 Controller", |
" 147b 1c0b NF8 Mainboard", |
" 00ea nForce3 250Gb AC'97 Audio Controller", |
" 147b 1c0b NF8 Mainboard", |
" 00ed nForce3 250Gb PCI-to-PCI Bridge", |
" 00ee CK8S Serial ATA Controller (v2.5)", |
" 00f0 NV40 [GeForce 6800/GeForce 6800 Ultra]", |
" 00f1 NV43 [GeForce 6600/GeForce 6600 GT]", |
" 1043 81a6 N6600GT TD 128M AGP", |
" 1682 2119 GeForce 6600 GT AGP 128MB DDR3 DUAL DVI TV", |
" 00f2 NV43 [GeForce 6600/GeForce 6600 GT]", |
" 1682 211c GeForce 6600 256MB DDR DUAL DVI TV", |
" 00f3 NV43 [GeForce 6200]", |
" 00f4 NV43 [GeForce 6600 LE]", |
" 00f5 G70 [GeForce 7800 GS]", |
" 00f6 NV43 [GeForce 6600 GS]", |
" 00f8 NV45GL [Quadro FX 3400/4400]", |
" 00f9 NV40 [GeForce 6800 Ultra/GeForce 6800 GT]", |
" 1682 2120 GEFORCE 6800 GT PCI-E", |
" 00fa NV36 [GeForce PCX 5750]", |
" 00fb NV35 [GeForce PCX 5900]", |
" 00fc NV37GL [Quadro FX 330/GeForce PCX 5300]", |
" 00fd NV37GL [Quadro FX 330/Quadro NVS280]", |
" 00fe NV38GL [Quadro FX 1300]", |
" 00ff NV18 [GeForce PCX 4300]", |
" 0100 NV10 [GeForce 256 SDR]", |
" 1043 0200 AGP-V6600 SGRAM", |
" 1043 0201 AGP-V6600 SDRAM", |
" 1043 4008 AGP-V6600 SGRAM", |
" 1043 4009 AGP-V6600 SDRAM", |
" 1048 0c41 Erazor X", |
" 1048 0c43 ERAZOR X PCI", |
" 1048 0c48 Synergy Force", |
" 1102 102d CT6941 GeForce 256", |
" 14af 5022 3D Prophet SE", |
" 0101 NV10DDR [GeForce 256 DDR]", |
" 1043 0202 AGP-V6800 DDR", |
" 1043 400a AGP-V6800 DDR SGRAM", |
" 1043 400b AGP-V6800 DDR SDRAM", |
" 1048 0c42 Erazor X", |
" 107d 2822 WinFast GeForce 256", |
" 1102 102e CT6971 GeForce 256 DDR", |
" 14af 5021 3D Prophet DDR-DVI", |
" 0103 NV10GL [Quadro]", |
" 1048 0c40 GLoria II-64", |
" 1048 0c44 GLoria II", |
" 1048 0c45 GLoria II", |
" 1048 0c4a GLoria II-64 Pro", |
" 1048 0c4b GLoria II-64 Pro DVII", |
" 0110 NV11 [GeForce2 MX/MX 400]", |
" 1043 4015 AGP-V7100 Pro", |
" 1043 4031 V7100 Pro with TV output", |
" 1048 0c60 Gladiac MX", |
" 1048 0c61 Gladiac 511PCI", |
" 1048 0c63 Gladiac 511TV-OUT 32MB", |
" 1048 0c64 Gladiac 511TV-OUT 64MB", |
" 1048 0c65 Gladiac 511TWIN", |
" 1048 0c66 Gladiac 311", |
" 10de 0091 Dell OEM GeForce 2 MX 400", |
" 10de 00a1 Apple OEM GeForce2 MX", |
" 1462 8817 MSI GeForce2 MX400 Pro32S [MS-8817]", |
" 14af 7102 3D Prophet II MX", |
" 14af 7103 3D Prophet II MX Dual-Display", |
" 0111 NV11DDR [GeForce2 MX 100 DDR/200 DDR]", |
" 0112 NV11 [GeForce2 Go]", |
" 0113 NV11GL [Quadro2 MXR/EX/Go]", |
" 0140 NV43 [GeForce 6600 GT]", |
" 0141 NV43 [GeForce 6600]", |
" 1458 3124 GV-NX66128DP Turbo Force Edition", |
" 0142 NV43 [GeForce 6600 PCIe]", |
" 0144 NV43 [GeForce Go 6600]", |
" 0145 NV43 [GeForce 6610 XL]", |
" 0146 NV43 [Geforce Go 6600TE/6200TE]", |
" 0148 NV43 [GeForce Go 6600]", |
" 0149 NV43 [GeForce Go 6600 GT]", |
" 014a Quadro NVS 440", |
" 014c Quadro FX 550", |
" 014e NV43GL [Quadro FX 540]", |
" 014f NV43 [GeForce 6200]", |
" 0150 NV15 [GeForce2 GTS/Pro]", |
" 1043 4016 V7700 AGP Video Card", |
" 1048 0c50 Gladiac", |
" 1048 0c52 Gladiac-64", |
" 107d 2840 WinFast GeForce2 GTS with TV output", |
" 107d 2842 WinFast GeForce 2 Pro", |
" 1462 8831 Creative GeForce2 Pro", |
" 0151 NV15DDR [GeForce2 Ti]", |
" 1043 405f V7700Ti", |
" 1462 5506 Creative 3D Blaster Geforce2 Titanium", |
" 0152 NV15BR [GeForce2 Ultra, Bladerunner]", |
" 1048 0c56 GLADIAC Ultra", |
" 0153 NV15GL [Quadro2 Pro]", |
" 0161 GeForce 6200 TurboCache(TM)", |
" 0162 NV43 [GeForce 6200 SE]", |
" 0164 NV44 [GeForce Go 6200]", |
" 0165 NV44 [Quadro NVS 285]", |
" 0166 NV43 [GeForce Go 6400]", |
" 0167 GeForce Go 6200 TurboCache", |
" 0168 NV43 [GeForce Go 6200 TurboCache]", |
" 0170 NV17 [GeForce4 MX 460]", |
" 0171 NV17 [GeForce4 MX 440]", |
" 10b0 0002 Gainward Pro/600 TV", |
" 10de 0008 Apple OEM GeForce4 MX 440", |
" 1462 8661 G4MX440-VTP", |
" 1462 8730 MX440SES-T (MS-8873)", |
" 1462 8852 GeForce4 MX440 PCI", |
" 147b 8f00 Abit Siluro GeForce4MX440", |
" 0172 NV17 [GeForce4 MX 420]", |
" 0173 NV17 [GeForce4 MX 440-SE]", |
" 0174 NV17 [GeForce4 440 Go]", |
" 0175 NV17 [GeForce4 420 Go]", |
" 0176 NV17 [GeForce4 420 Go 32M]", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 0177 NV17 [GeForce4 460 Go]", |
" 0178 NV17GL [Quadro4 550 XGL]", |
" 0179 NV17 [GeForce4 420 Go 32M]", |
" 10de 0179 GeForce4 MX (Mac)", |
" 017a NV17GL [Quadro4 200/400 NVS]", |
" 017b NV17GL [Quadro4 550 XGL]", |
" 017c NV17GL [Quadro4 500 GoGL]", |
" 017d NV17 [GeForce4 410 Go 16M]", |
" 0181 NV18 [GeForce4 MX 440 AGP 8x]", |
" 1043 806f V9180 Magic", |
" 1462 8880 MS-StarForce GeForce4 MX 440 with AGP8X", |
" 1462 8900 MS-8890 GeForce 4 MX440 AGP8X", |
" 1462 9350 MSI Geforce4 MX T8X with AGP8X", |
" 147b 8f0d Siluro GF4 MX-8X", |
" 0182 NV18 [GeForce4 MX 440SE AGP 8x]", |
" 0183 NV18 [GeForce4 MX 420 AGP 8x]", |
" 0185 NV18 [GeForce4 MX 4000 AGP 8x]", |
" 0186 NV18M [GeForce4 448 Go]", |
" 0187 NV18M [GeForce4 488 Go]", |
" 0188 NV18GL [Quadro4 580 XGL]", |
" 018a NV18GL [Quadro4 NVS AGP 8x]", |
" 018b NV18GL [Quadro4 380 XGL]", |
" 018c Quadro NVS 50 PCI", |
" 018d NV18M [GeForce4 448 Go]", |
" 01a0 NVCrush11 [GeForce2 MX Integrated Graphics]", |
" 01a4 nForce CPU bridge", |
" 01ab nForce 420 Memory Controller (DDR)", |
" 01ac nForce 220/420 Memory Controller", |
" 01ad nForce 220/420 Memory Controller", |
" 01b0 nForce Audio", |
" 01b1 nForce Audio", |
" 01b2 nForce ISA Bridge", |
" 01b4 nForce PCI System Management", |
" 01b7 nForce AGP to PCI Bridge", |
" 01b8 nForce PCI-to-PCI bridge", |
" 01bc nForce IDE", |
" 01c1 nForce AC'97 Modem Controller", |
" 01c2 nForce USB Controller", |
" 01c3 nForce Ethernet Controller", |
" 01d1 GeForce 7300 LE", |
" 01d7 Quadro NVS 110M / GeForce Go 7300", |
" 01d8 GeForce Go 7400", |
" 01da Quadro NVS 110M", |
" 01de Quadro FX 350", |
" 10de 01dc Quadro FX Go350M", |
" 01df GeForce 7300 GS", |
" 01e0 nForce2 AGP (different version?)", |
" 147b 1c09 NV7 Motherboard", |
" 01e8 nForce2 AGP", |
" 01ea nForce2 Memory Controller 0", |
" a0a0 03b9 UK79G-1394 motherboard", |
" 01eb nForce2 Memory Controller 1", |
" a0a0 03b9 UK79G-1394 motherboard", |
" 01ec nForce2 Memory Controller 2", |
" a0a0 03b9 UK79G-1394 motherboard", |
" 01ed nForce2 Memory Controller 3", |
" a0a0 03b9 UK79G-1394 motherboard", |
" 01ee nForce2 Memory Controller 4", |
" a0a0 03b9 UK79G-1394 motherboard", |
" 01ef nForce2 Memory Controller 5", |
" a0a0 03b9 UK79G-1394 motherboard", |
" 01f0 NV18 [GeForce4 MX - nForce GPU]", |
" a0a0 03b5 UK79G-1394 motherboard", |
" 0200 NV20 [GeForce3]", |
" 1043 402f AGP-V8200 DDR", |
" 1048 0c70 GLADIAC 920", |
" 0201 NV20 [GeForce3 Ti 200]", |
" 0202 NV20 [GeForce3 Ti 500]", |
" 1043 405b V8200 T5", |
" 1545 002f Xtasy 6964", |
" 0203 NV20DCC [Quadro DCC]", |
" 0211 NV40 [GeForce 6800]", |
" 0212 NV40 [GeForce 6800 LE]", |
" 0215 NV40 [GeForce 6800 GT]", |
" 0218 NV40 [GeForce 6800 XT]", |
" 0221 NV43 [GeForce 6200]", |
" 0240 C51PV [GeForce 6150]", |
" 1462 7207 K8NGM2 series", |
" 0241 C51 PCI Express Bridge", |
" 0242 C51G [GeForce 6100]", |
" 0243 C51 PCI Express Bridge", |
" 0244 C51 PCI Express Bridge", |
" 0245 C51 PCI Express Bridge", |
" 0246 C51 PCI Express Bridge", |
" 0247 C51 PCI Express Bridge", |
" 0248 C51 PCI Express Bridge", |
" 0249 C51 PCI Express Bridge", |
" 024a C51 PCI Express Bridge", |
" 024b C51 PCI Express Bridge", |
" 024c C51 PCI Express Bridge", |
" 024d C51 PCI Express Bridge", |
" 024e C51 PCI Express Bridge", |
" 024f C51 PCI Express Bridge", |
" 0250 NV25 [GeForce4 Ti 4600]", |
" 0251 NV25 [GeForce4 Ti 4400]", |
" 1043 8023 v8440 GeForce 4 Ti4400", |
" 0252 NV25 [GeForce4 Ti]", |
" 0253 NV25 [GeForce4 Ti 4200]", |
" 107d 2896 WinFast A250 LE TD (Dual VGA/TV-out/DVI)", |
" 147b 8f09 Siluro (Dual VGA/TV-out/DVI)", |
" 0258 NV25GL [Quadro4 900 XGL]", |
" 0259 NV25GL [Quadro4 750 XGL]", |
" 025b NV25GL [Quadro4 700 XGL]", |
" 0260 MCP51 LPC Bridge", |
" 1462 7207 K8NGM2 series", |
" 0261 MCP51 LPC Bridge", |
" 0262 MCP51 LPC Bridge", |
" 0263 MCP51 LPC Bridge", |
" 0264 MCP51 SMBus", |
" 1462 7207 K8NGM2 series", |
" 0265 MCP51 IDE", |
" 1462 7207 K8NGM2 series", |
" 0266 MCP51 Serial ATA Controller", |
" 1462 7207 K8NGM2 series", |
" 0267 MCP51 Serial ATA Controller", |
" 1462 7207 K8NGM2 series", |
" 0268 MCP51 Ethernet Controller", |
" 0269 MCP51 Ethernet Controller", |
" 1462 7207 K8NGM2 series", |
" 026a MCP51 MCI", |
" 026b MCP51 AC97 Audio Controller", |
" 026c MCP51 High Definition Audio", |
" 1462 7207 K8NGM2 series", |
" 026d MCP51 USB Controller", |
" 1462 7207 K8NGM2 series", |
" 026e MCP51 USB Controller", |
" 1462 7207 K8NGM2 series", |
" 026f MCP51 PCI Bridge", |
" 0270 MCP51 Host Bridge", |
" 1462 7207 K8NGM2 series", |
" 0271 MCP51 PMU", |
" 0272 MCP51 Memory Controller 0", |
" 027e C51 Memory Controller 2", |
" 1462 7207 K8NGM2 series", |
" 027f C51 Memory Controller 3", |
" 1462 7207 K8NGM2 series", |
" 0280 NV28 [GeForce4 Ti 4800]", |
" 0281 NV28 [GeForce4 Ti 4200 AGP 8x]", |
" 0282 NV28 [GeForce4 Ti 4800 SE]", |
" 0286 NV28 [GeForce4 Ti 4200 Go AGP 8x]", |
" 0288 NV28GL [Quadro4 980 XGL]", |
" 0289 NV28GL [Quadro4 780 XGL]", |
" 028c NV28GLM [Quadro4 700 GoGL]", |
" 0290 GeForce 7900 GTX", |
" 0291 GeForce 7900 GT", |
" 029a G71 [Quadro FX 2500M]", |
" 029b G71 [Quadro FX 1500M]", |
" 029c Quadro FX 5500", |
" 029d Quadro FX 3500", |
" 029e Quadro FX 1500", |
" 02a0 NV2A [XGPU]", |
" 02e1 GeForce 7600 GS", |
" 02f0 C51 Host Bridge", |
" 1462 7207 K8NGM2 series", |
" 02f1 C51 Host Bridge", |
" 02f2 C51 Host Bridge", |
" 02f3 C51 Host Bridge", |
" 02f4 C51 Host Bridge", |
" 02f5 C51 Host Bridge", |
" 02f6 C51 Host Bridge", |
" 02f7 C51 Host Bridge", |
" 02f8 C51 Memory Controller 5", |
" 1462 7207 K8NGM2 series", |
" 02f9 C51 Memory Controller 4", |
" 1462 7207 K8NGM2 series", |
" 02fa C51 Memory Controller 0", |
" 1462 7207 K8NGM2 series", |
" 02fb C51 PCI Express Bridge", |
" 02fc C51 PCI Express Bridge", |
" 02fd C51 PCI Express Bridge", |
" 02fe C51 Memory Controller 1", |
" 1462 7207 K8NGM2 series", |
" 02ff C51 Host Bridge", |
" 1462 7207 K8NGM2 series", |
" 0300 NV30 [GeForce FX]", |
" 0301 NV30 [GeForce FX 5800 Ultra]", |
" 0302 NV30 [GeForce FX 5800]", |
" 0308 NV30GL [Quadro FX 2000]", |
" 0309 NV30GL [Quadro FX 1000]", |
" 0311 NV31 [GeForce FX 5600 Ultra]", |
" 0312 NV31 [GeForce FX 5600]", |
" 0313 NV31", |
" 0314 NV31 [GeForce FX 5600XT]", |
" 1043 814a V9560XT/TD", |
" 0316 NV31M", |
" 0317 NV31M Pro", |
" 031a NV31M [GeForce FX Go5600]", |
" 031b NV31M [GeForce FX Go5650]", |
" 031c NVIDIA Quadro FX Go700", |
" 031d NV31GLM", |
" 031e NV31GLM Pro", |
" 031f NV31GLM Pro", |
" 0320 NV34 [GeForce FX 5200]", |
" 0321 NV34 [GeForce FX 5200 Ultra]", |
" 0322 NV34 [GeForce FX 5200]", |
" 1462 9171 MS-8917 (FX5200-T128)", |
" 1462 9360 MS-8936 (FX5200-T128)", |
" 0323 NV34 [GeForce FX 5200LE]", |
" 0324 NV34M [GeForce FX Go5200]", |
" 1028 0196 Inspiron 5160", |
" 1071 8160 MIM2000", |
" 0325 NV34M [GeForce FX Go5250]", |
" 0326 NV34 [GeForce FX 5500]", |
" 0327 NV34 [GeForce FX 5100]", |
" 0328 NV34M [GeForce FX Go5200 32M/64M]", |
" 0329 NV34M [GeForce FX Go5200]", |
" 032a NV34GL [Quadro NVS 280 PCI]", |
" 032b NV34GL [Quadro FX 500/600 PCI]", |
" 032c NV34GLM [GeForce FX Go 5300]", |
" 032d NV34 [GeForce FX Go5100]", |
" 032f NV34GL", |
" 0330 NV35 [GeForce FX 5900 Ultra]", |
" 0331 NV35 [GeForce FX 5900]", |
" 1043 8145 V9950GE", |
" 0332 NV35 [GeForce FX 5900XT]", |
" 0333 NV38 [GeForce FX 5950 Ultra]", |
" 0334 NV35 [GeForce FX 5900ZT]", |
" 0338 NV35GL [Quadro FX 3000]", |
" 033f NV35GL [Quadro FX 700]", |
" 0341 NV36.1 [GeForce FX 5700 Ultra]", |
" 0342 NV36.2 [GeForce FX 5700]", |
" 0343 NV36 [GeForce FX 5700LE]", |
" 0344 NV36.4 [GeForce FX 5700VE]", |
" 0345 NV36.5", |
" 0347 NV36 [GeForce FX Go5700]", |
" 103c 006a NX9500", |
" 0348 NV36 [GeForce FX Go5700]", |
" 0349 NV36M Pro", |
" 034b NV36MAP", |
" 034c NV36 [Quadro FX Go1000]", |
" 034e NV36GL [Quadro FX 1100]", |
" 034f NV36GL", |
" 0360 MCP55 LPC Bridge", |
" 0361 MCP55 LPC Bridge", |
" 0362 MCP55 LPC Bridge", |
" 0363 MCP55 LPC Bridge", |
" 0364 MCP55 LPC Bridge", |
" 0365 MCP55 LPC Bridge", |
" 0366 MCP55 LPC Bridge", |
" 0367 MCP55 LPC Bridge", |
" 0368 MCP55 SMBus", |
" 0369 MCP55 Memory Controller", |
" 036a MCP55 Memory Controller", |
" 036c MCP55 USB Controller", |
" 036d MCP55 USB Controller", |
" 036e MCP55 IDE", |
" 0371 MCP55 High Definition Audio", |
" 0372 MCP55 Ethernet", |
" 0373 MCP55 Ethernet", |
" 037a MCP55 Memory Controller", |
" 037e MCP55 SATA Controller", |
" 037f MCP55 SATA Controller", |
" 0391 G70 [GeForce 7600 GT]", |
" 0392 G70 [GeForce 7600 GS]", |
" 0398 G70 [GeForce Go 7600]", |
" 039e Quadro FX 560", |
" 03e0 MCP61 LPC Bridge", |
" 03e1 MCP61 LPC Bridge", |
" 03e2 MCP61 LPC Bridge", |
" 03e3 MCP61 LPC Bridge", |
" 03e4 MCP61 High Definition Audio", |
" 03e5 MCP61 Ethernet", |
" 03e6 MCP61 Ethernet", |
" 03e7 MCP61 SATA Controller", |
" 03ea MCP61 Memory Controller", |
" 03eb MCP61 SMBus", |
" 03ec MCP61 IDE", |
" 03ee MCP61 Ethernet", |
" 03ef MCP61 Ethernet", |
" 03f0 MCP61 High Definition Audio", |
" 03f1 MCP61 USB Controller", |
" 03f2 MCP61 USB Controller", |
" 03f5 MCP61 Memory Controller", |
" 03f6 MCP61 SATA Controller", |
" 03f7 MCP61 SATA Controller", |
"10df Emulex Corporation", |
" 1ae5 LP6000 Fibre Channel Host Adapter", |
" f085 LP850 Fibre Channel Host Adapter", |
" f095 LP952 Fibre Channel Host Adapter", |
" f098 LP982 Fibre Channel Host Adapter", |
" f0a1 Thor LightPulse Fibre Channel Host Adapter", |
" f0a5 Thor LightPulse Fibre Channel Host Adapter", |
" f0b5 Viper LightPulse Fibre Channel Host Adapter", |
" f0d1 Helios LightPulse Fibre Channel Host Adapter", |
" f0d5 Helios LightPulse Fibre Channel Host Adapter", |
" f0e1 Zephyr LightPulse Fibre Channel Host Adapter", |
" f0e5 Zephyr LightPulse Fibre Channel Host Adapter", |
" f0f5 Neptune LightPulse Fibre Channel Host Adapter", |
" f700 LP7000 Fibre Channel Host Adapter", |
" f701 LP7000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)", |
" f800 LP8000 Fibre Channel Host Adapter", |
" f801 LP8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)", |
" f900 LP9000 Fibre Channel Host Adapter", |
" f901 LP9000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)", |
" f980 LP9802 Fibre Channel Host Adapter", |
" f981 LP9802 Fibre Channel Host Adapter Alternate ID", |
" f982 LP9802 Fibre Channel Host Adapter Alternate ID", |
" fa00 Thor-X LightPulse Fibre Channel Host Adapter", |
" fb00 Viper LightPulse Fibre Channel Host Adapter", |
" fc00 Thor-X LightPulse Fibre Channel Host Adapter", |
" fc10 Helios-X LightPulse Fibre Channel Host Adapter", |
" fc20 Zephyr-X LightPulse Fibre Channel Host Adapter", |
" fd00 Helios-X LightPulse Fibre Channel Host Adapter", |
" fe00 Zephyr-X LightPulse Fibre Channel Host Adapter", |
" ff00 Neptune LightPulse Fibre Channel Host Adapter", |
"10e0 Integrated Micro Solutions Inc.", |
" 5026 IMS5026/27/28", |
" 5027 IMS5027", |
" 5028 IMS5028", |
" 8849 IMS8849", |
" 8853 IMS8853", |
" 9128 IMS9128 [Twin turbo 128]", |
"10e1 Tekram Technology Co.,Ltd.", |
" 0391 TRM-S1040", |
" 10e1 0391 DC-315U SCSI-3 Host Adapter", |
" 690c DC-690c", |
" dc29 DC-290", |
"10e2 Aptix Corporation", |
"10e3 Tundra Semiconductor Corp.", |
" 0000 CA91C042 [Universe]", |
" 0148 Tsi148 [Tempe]", |
" 0860 CA91C860 [QSpan]", |
" 0862 CA91C862A [QSpan-II]", |
" 8260 CA91L8200B [Dual PCI PowerSpan II]", |
" 8261 CA91L8260B [Single PCI PowerSpan II]", |
"10e4 Tandem Computers", |
" 8029 Realtek 8029 Network Card", |
"10e5 Micro Industries Corporation", |
"10e6 Gainbery Computer Products Inc.", |
"10e7 Vadem", |
"10e8 Applied Micro Circuits Corp.", |
" 1072 INES GPIB-PCI (AMCC5920 based)", |
" 2011 Q-Motion Video Capture/Edit board", |
" 4750 S5930 [Matchmaker]", |
" 5920 S5920", |
" 8043 LANai4.x [Myrinet LANai interface chip]", |
" 8062 S5933_PARASTATION", |
" 807d S5933 [Matchmaker]", |
" 8088 Kongsberg Spacetec Format Synchronizer", |
" 8089 Kongsberg Spacetec Serial Output Board", |
" 809c S5933_HEPC3", |
" 80d7 PCI-9112", |
" 80d9 PCI-9118", |
" 80da PCI-9812", |
" 811a PCI-IEEE1355-DS-DE Interface", |
" 814c Fastcom ESCC-PCI (Commtech, Inc.)", |
" 8170 S5933 [Matchmaker] (Chipset Development Tool)", |
" 81e6 Multimedia video controller", |
" 8291 Fastcom 232/8-PCI (Commtech, Inc.)", |
" 82c4 Fastcom 422/4-PCI (Commtech, Inc.)", |
" 82c5 Fastcom 422/2-PCI (Commtech, Inc.)", |
" 82c6 Fastcom IG422/1-PCI (Commtech, Inc.)", |
" 82c7 Fastcom IG232/2-PCI (Commtech, Inc.)", |
" 82ca Fastcom 232/4-PCI (Commtech, Inc.)", |
" 82db AJA HDNTV HD SDI Framestore", |
" 82e2 Fastcom DIO24H-PCI (Commtech, Inc.)", |
" 8851 S5933 on Innes Corp FM Radio Capture card", |
"10e9 Alps Electric Co., Ltd.", |
"10ea Intergraphics Systems", |
" 1680 IGA-1680", |
" 1682 IGA-1682", |
" 1683 IGA-1683", |
" 2000 CyberPro 2000", |
" 2010 CyberPro 2000A", |
" 5000 CyberPro 5000", |
" 5050 CyberPro 5050", |
" 5202 CyberPro 5202", |
" 5252 CyberPro5252", |
"10eb Artists Graphics", |
" 0101 3GA", |
" 8111 Twist3 Frame Grabber", |
"10ec Realtek Semiconductor Co., Ltd.", |
" 0139 Zonet Zen3200", |
" 8029 RTL-8029(AS)", |
" 10b8 2011 EZ-Card (SMC1208)", |
" 10ec 8029 RTL-8029(AS)", |
" 1113 1208 EN1208", |
" 1186 0300 DE-528", |
" 1259 2400 AT-2400", |
" 8129 RTL-8129", |
" 10ec 8129 RT8129 Fast Ethernet Adapter", |
" 8138 RT8139 (B/C) Cardbus Fast Ethernet Adapter", |
" 10ec 8138 RT8139 (B/C) Fast Ethernet Adapter", |
" 8139 RTL-8139/8139C/8139C+", |
" 0357 000a TTP-Monitoring Card V2.0", |
" 1025 005a TravelMate 290", |
" 1025 8920 ALN-325", |
" 1025 8921 ALN-325", |
" 103c 006a NX9500", |
" 1043 8109 P5P800-MX Mainboard", |
" 1071 8160 MIM2000", |
" 10bd 0320 EP-320X-R", |
" 10ec 8139 RT8139", |
" 1113 ec01 FNC-0107TX", |
" 1186 1300 DFE-538TX", |
" 1186 1320 SN5200", |
" 1186 8139 DRN-32TX", |
" 11f6 8139 FN22-3(A) LinxPRO Ethernet Adapter", |
" 1259 2500 AT-2500TX", |
" 1259 2503 AT-2500TX/ACPI", |
" 1429 d010 ND010", |
" 1432 9130 EN-9130TX", |
" 1436 8139 RT8139", |
" 1458 e000 GA-7VM400M/7VT600 Motherboard", |
" 1462 788c 865PE Neo2-V Mainboard", |
" 146c 1439 FE-1439TX", |
" 1489 6001 GF100TXRII", |
" 1489 6002 GF100TXRA", |
" 149c 139a LFE-8139ATX", |
" 149c 8139 LFE-8139TX", |
" 14cb 0200 LNR-100 Family 10/100 Base-TX Ethernet", |
" 1695 9001 Onboard RTL8101L 10/100 MBit", |
" 1799 5000 F5D5000 PCI Card/Desktop Network PCI Card", |
" 1904 8139 RTL8139D Fast Ethernet Adapter", |
" 2646 0001 EtheRx", |
" 8e2e 7000 KF-230TX", |
" 8e2e 7100 KF-230TX/2", |
" a0a0 0007 ALN-325C", |
" 8169 RTL-8169 Gigabit Ethernet", |
" 1025 0079 Aspire 5024WLMi", |
" 1259 c107 CG-LAPCIGT", |
" 1371 434e ProG-2000L", |
" 1458 e000 GA-8I915ME-G Mainboard", |
" 1462 702c K8T NEO 2 motherboard", |
" 8180 RTL8180L 802.11b MAC", |
" 8185 RTL-8185 IEEE 802.11a/b/g Wireless LAN Controller", |
" 8197 SmartLAN56 56K Modem", |
"10ed Ascii Corporation", |
" 7310 V7310", |
"10ee Xilinx Corporation", |
" 0205 Wildcard TE205P", |
" 0210 Wildcard TE210P", |
" 0314 Wildcard TE405P/TE410P (1st Gen)", |
" 0405 Wildcard TE405P (2nd Gen)", |
" 0410 Wildcard TE410P (2nd Gen)", |
" 3fc0 RME Digi96", |
" 3fc1 RME Digi96/8", |
" 3fc2 RME Digi96/8 Pro", |
" 3fc3 RME Digi96/8 Pad", |
" 3fc4 RME Digi9652 (Hammerfall)", |
" 3fc5 RME Hammerfall DSP", |
" 3fc6 RME Hammerfall DSP MADI", |
" 8381 Ellips Santos Frame Grabber", |
" d154 Copley Controls CAN card (PCI-CAN-02)", |
"10ef Racore Computer Products, Inc.", |
" 8154 M815x Token Ring Adapter", |
"10f0 Peritek Corporation", |
"10f1 Tyan Computer", |
" 2865 Tyan Thunder K8E S2865", |
"10f2 Achme Computer, Inc.", |
"10f3 Alaris, Inc.", |
"10f4 S-MOS Systems, Inc.", |
"10f5 NKK Corporation", |
" a001 NDR4000 [NR4600 Bridge]", |
"10f6 Creative Electronic Systems SA", |
"10f7 Matsushita Electric Industrial Co., Ltd.", |
"10f8 Altos India Ltd", |
"10f9 PC Direct", |
"10fa Truevision", |
" 000c TARGA 1000", |
"10fb Thesys Gesellschaft fuer Mikroelektronik mbH", |
" 186f TH 6255", |
"10fc I-O Data Device, Inc.", |
" 0003 Cardbus IDE Controller", |
" 0005 Cardbus SCSI CBSC II", |
"10fd Soyo Computer, Inc", |
"10fe Fast Multimedia AG", |
"10ff NCube", |
"1100 Jazz Multimedia", |
"1101 Initio Corporation", |
" 1060 INI-A100U2W", |
" 9100 INI-9100/9100W", |
" 9400 INI-940", |
" 9401 INI-950", |
" 9500 360P", |
" 9502 Initio INI-9100UW Ultra Wide SCSI Controller INIC-950P chip", |
"1102 Creative Labs", |
" 0002 SB Live! EMU10k1", |
" 1102 0020 CT4850 SBLive! Value", |
" 1102 0021 CT4620 SBLive!", |
" 1102 002f SBLive! mainboard implementation", |
" 1102 100a SB Live! 5.1 Digital OEM [SB0220]", |
" 1102 4001 E-mu APS", |
" 1102 8022 CT4780 SBLive! Value", |
" 1102 8023 CT4790 SoundBlaster PCI512", |
" 1102 8024 CT4760 SBLive!", |
" 1102 8025 SBLive! Mainboard Implementation", |
" 1102 8026 CT4830 SBLive! Value", |
" 1102 8027 CT4832 SBLive! Value", |
" 1102 8028 CT4760 SBLive! OEM version", |
" 1102 8031 CT4831 SBLive! Value", |
" 1102 8040 CT4760 SBLive!", |
" 1102 8051 CT4850 SBLive! Value", |
" 1102 8061 SBLive! Player 5.1", |
" 1102 8064 SBLive! 5.1 Model SB0100", |
" 1102 8065 SBLive! 5.1 Digital Model SB0220", |
" 1102 8067 SBLive! 5.1 eMicro 28028", |
" 0004 SB Audigy", |
" 1102 0051 SB0090 Audigy Player", |
" 1102 0053 SB0090 Audigy Player/OEM", |
" 1102 0058 SB0090 Audigy Player/OEM", |
" 1102 1007 SB0240 Audigy 2 Platinum 6.1", |
" 1102 2002 SB Audigy 2 ZS (SB0350)", |
" 0006 [SB Live! Value] EMU10k1X", |
" 0007 SB Audigy LS", |
" 1102 0007 SBLive! 24bit", |
" 1102 1001 SB0310 Audigy LS", |
" 1102 1002 SB0312 Audigy LS", |
" 1102 1006 SB0410 SBLive! 24-bit", |
" 1462 1009 K8N Diamond", |
" 0008 SB0400 Audigy2 Value", |
" 1102 0008 EMU0404 Digital Audio System", |
" 4001 SB Audigy FireWire Port", |
" 1102 0010 SB Audigy FireWire Port", |
" 7002 SB Live! Game Port", |
" 1102 0020 Gameport Joystick", |
" 7003 SB Audigy Game Port", |
" 1102 0040 SB Audigy MIDI/Game Port", |
" 7004 [SB Live! Value] Input device controller", |
" 7005 SB Audigy LS Game Port", |
" 1102 1001 SB0310 Audigy LS MIDI/Game port", |
" 1102 1002 SB0312 Audigy LS MIDI/Game port", |
" 8064 SB0100 [SBLive! 5.1 OEM]", |
" 8938 Ectiva EV1938", |
" 1033 80e5 SlimTower-Jim (NEC)", |
" 1071 7150 Mitac 7150", |
" 110a 5938 Siemens Scenic Mobile 510PIII", |
" 13bd 100c Ceres-C (Sharp, Intel BX)", |
" 13bd 100d Sharp, Intel Banister", |
" 13bd 100e TwinHead P09S/P09S3 (Sharp)", |
" 13bd f6f1 Marlin (Sharp)", |
" 14ff 0e70 P88TE (TWINHEAD INTERNATIONAL Corp)", |
" 14ff c401 Notebook 9100/9200/2000 (TWINHEAD INTERNATIONAL Corp)", |
" 156d b400 G400 - Geo (AlphaTop (Taiwan))", |
" 156d b550 G560 (AlphaTop (Taiwan))", |
" 156d b560 G560 (AlphaTop (Taiwan))", |
" 156d b700 G700/U700 (AlphaTop (Taiwan))", |
" 156d b795 G795 (AlphaTop (Taiwan))", |
" 156d b797 G797 (AlphaTop (Taiwan))", |
"1103 Triones Technologies, Inc.", |
" 0003 HPT343/345/346/363", |
" 0004 HPT366/368/370/370A/372/372N", |
" 1103 0001 HPT370A", |
" 1103 0004 HPT366 UDMA66 (r1) / HPT368 UDMA66 (r2) / HPT370 UDMA100 (r3) / HPT370 UDMA100 RAID (r4)", |
" 1103 0005 HPT370 UDMA100", |
" 0005 HPT372A/372N", |
" 0006 HPT302/302N", |
" 0007 HPT371/371N", |
" 0008 HPT374", |
" 0009 HPT372N", |
"1104 RasterOps Corp.", |
"1105 Sigma Designs, Inc.", |
" 1105 REALmagic Xcard MPEG 1/2/3/4 DVD Decoder", |
" 8300 REALmagic Hollywood Plus DVD Decoder", |
" 8400 EM840x REALmagic DVD/MPEG-2 Audio/Video Decoder", |
" 8401 EM8401 REALmagic DVD/MPEG-2 A/V Decoder", |
" 8470 EM8470 REALmagic DVD/MPEG-4 A/V Decoder", |
" 8471 EM8471 REALmagic DVD/MPEG-4 A/V Decoder", |
" 8475 EM8475 REALmagic DVD/MPEG-4 A/V Decoder", |
" 1105 0001 REALmagic X-Card", |
" 8476 EM8476 REALmagic DVD/MPEG-4 A/V Decoder", |
" 127d 0000 CineView II", |
" 8485 EM8485 REALmagic DVD/MPEG-4 A/V Decoder", |
" 8486 EM8486 REALmagic DVD/MPEG-4 A/V Decoder", |
"1106 VIA Technologies, Inc.", |
" 0102 Embedded VIA Ethernet Controller", |
" 0130 VT6305 1394.A Controller", |
" 0204 K8M800 Host Bridge", |
" 0208 PT890 Host Bridge", |
" 0238 K8T890 Host Bridge", |
" 0258 PT880 Host Bridge", |
" 0259 CN400/PM880 Host Bridge", |
" 0269 KT880 Host Bridge", |
" 0282 K8T800Pro Host Bridge", |
" 1043 80a3 A8V Deluxe", |
" 0290 K8M890 Host Bridge", |
" 0293 PM896 Host Bridge", |
" 0296 P4M800 Host Bridge", |
" 0305 VT8363/8365 [KT133/KM133]", |
" 1019 0987 K7VZA Mainboard", |
" 1043 8033 A7V Mainboard", |
" 1043 803e A7V-E Mainboard", |
" 1043 8042 A7V133/A7V133-C Mainboard", |
" 147b a401 KT7/KT7-RAID/KT7A/KT7A-RAID Mainboard", |
" 0308 PT894 Host Bridge", |
" 0314 CN700/VN800/P4M800CE/Pro Host Bridge", |
" 0324 CX700 Host Bridge", |
" 0327 P4M890 Host Bridge", |
" 0336 K8M890CE Host Bridge", |
" 0340 PT900 Host Bridge", |
" 0351 VT3351 Host Bridge", |
" 0364 P4M900 Host Bridge", |
" 0391 VT8371 [KX133]", |
" 0501 VT8501 [Apollo MVP4]", |
" 0505 VT82C505", |
" 0561 VT82C576MV", |
" 0571 VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE", |
" 1019 0985 P6VXA Motherboard", |
" 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)", |
" 1043 8052 VT8233A Bus Master ATA100/66/33 IDE", |
" 1043 808c A7V8X / A7V333 motherboard", |
" 1043 80a1 A7V8X-X motherboard rev. 1.01", |
" 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard", |
" 1106 0571 VT82C586/B/VT82C686/A/B/VT8233/A/C/VT8235 PIPC Bus Master IDE", |
" 1179 0001 Magnia Z310", |
" 1297 f641 FX41 motherboard", |
" 1458 5002 GA-7VAX Mainboard", |
" 1462 7020 K8T NEO 2 motherboard", |
" 147b 1407 KV8-MAX3 motherboard", |
" 1849 0571 K7VT2/K7VT6 motherboard", |
" 0576 VT82C576 3V [Apollo Master]", |
" 0585 VT82C585VP [Apollo VP1/VPX]", |
" 0586 VT82C586/A/B PCI-to-ISA [Apollo VP]", |
" 1106 0000 MVP3 ISA Bridge", |
" 0591 VT8237A SATA 2-Port Controller", |
" 0595 VT82C595 [Apollo VP2]", |
" 0596 VT82C596 ISA [Mobile South]", |
" 1106 0000 VT82C596/A/B PCI to ISA Bridge", |
" 1458 0596 VT82C596/A/B PCI to ISA Bridge", |
" 0597 VT82C597 [Apollo VP3]", |
" 0598 VT82C598 [Apollo MVP3]", |
" 0601 VT8601 [Apollo ProMedia]", |
" 0605 VT8605 [ProSavage PM133]", |
" 1043 802c CUV4X mainboard", |
" 0680 VT82C680 [Apollo P6]", |
" 0686 VT82C686 [Apollo Super South]", |
" 1019 0985 P6VXA Motherboard", |
" 1043 802c CUV4X mainboard", |
" 1043 8033 A7V Mainboard", |
" 1043 803e A7V-E Mainboard", |
" 1043 8040 A7M266 Mainboard", |
" 1043 8042 A7V133/A7V133-C Mainboard", |
" 1106 0000 VT82C686/A PCI to ISA Bridge", |
" 1106 0686 VT82C686/A PCI to ISA Bridge", |
" 1179 0001 Magnia Z310", |
" 147b a702 KG7-Lite Mainboard", |
" 0691 VT82C693A/694x [Apollo PRO133x]", |
" 1019 0985 P6VXA Motherboard", |
" 1179 0001 Magnia Z310", |
" 1458 0691 VT82C691 Apollo Pro System Controller", |
" 0693 VT82C693 [Apollo Pro Plus]", |
" 0698 VT82C693A [Apollo Pro133 AGP]", |
" 0926 VT82C926 [Amazon]", |
" 1000 VT82C570MV", |
" 1106 VT82C570MV", |
" 1204 K8M800 Host Bridge", |
" 1208 PT890 Host Bridge", |
" 1238 K8T890 Host Bridge", |
" 1258 PT880 Host Bridge", |
" 1259 CN400/PM880 Host Bridge", |
" 1269 KT880 Host Bridge", |
" 1282 K8T800Pro Host Bridge", |
" 1290 K8M890 Host Bridge", |
" 1293 PM896 Host Bridge", |
" 1296 P4M800 Host Bridge", |
" 1308 PT894 Host Bridge", |
" 1314 CN700/VN800/P4M800CE/Pro Host Bridge", |
" 1324 CX700 Host Bridge", |
" 1327 P4M890 Host Bridge", |
" 1336 K8M890CE Host Bridge", |
" 1340 PT900 Host Bridge", |
" 1351 VT3351 Host Bridge", |
" 1364 P4M900 Host Bridge", |
" 1571 VT82C576M/VT82C586", |
" 1595 VT82C595/97 [Apollo VP2/97]", |
" 2204 K8M800 Host Bridge", |
" 2208 PT890 Host Bridge", |
" 2238 K8T890 Host Bridge", |
" 2258 PT880 Host Bridge", |
" 2259 CN400/PM880 Host Bridge", |
" 2269 KT880 Host Bridge", |
" 2282 K8T800Pro Host Bridge", |
" 2290 K8M890 Host Bridge", |
" 2293 PM896 Host Bridge", |
" 2296 P4M800 Host Bridge", |
" 2308 PT894 Host Bridge", |
" 2314 CN700/VN800/P4M800CE/Pro Host Bridge", |
" 2324 CX700 Host Bridge", |
" 2327 P4M890 Host Bridge", |
" 2336 K8M890CE Host Bridge", |
" 2340 PT900 Host Bridge", |
" 2351 VT3351 Host Bridge", |
" 2364 P4M900 Host Bridge", |
" 287a VT8251 PCI to PCI Bridge", |
" 287b VT8251 Host Bridge", |
" 287c VT8251 PCIE Root Port", |
" 287d VT8251 PCIE Root Port", |
" 287e VT8251 Ultra VLINK Controller", |
" 3022 CLE266", |
" 3038 VT82xxxxx UHCI USB 1.1 Controller", |
" 0925 1234 USB Controller", |
" 1019 0985 P6VXA Motherboard", |
" 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)", |
" 1043 8080 A7V333 motherboard", |
" 1043 808c VT6202 USB2.0 4 port controller", |
" 1043 80a1 A7V8X-X motherboard", |
" 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard", |
" 1179 0001 Magnia Z310", |
" 1458 5004 GA-7VAX Mainboard", |
" 1462 7020 K8T NEO 2 motherboard", |
" 147b 1407 KV8-MAX3 motherboard", |
" 182d 201d CN-029 USB2.0 4 port PCI Card", |
" 1849 3038 K7VT6", |
" 3040 VT82C586B ACPI", |
" 3043 VT86C100A [Rhine]", |
" 10bd 0000 VT86C100A Fast Ethernet Adapter", |
" 1106 0100 VT86C100A Fast Ethernet Adapter", |
" 1186 1400 DFE-530TX rev A", |
" 3044 IEEE 1394 Host Controller", |
" 1025 005a TravelMate 290", |
" 1043 808a A8V Deluxe", |
" 1458 1000 GA-7VT600-1394 Motherboard", |
" 1462 207d K8NGM2 series motherboard", |
" 1462 702d K8T NEO 2 motherboard", |
" 1462 971d MS-6917", |
" 3050 VT82C596 Power Management", |
" 3051 VT82C596 Power Management", |
" 3053 VT6105M [Rhine-III]", |
" 3057 VT82C686 [Apollo Super ACPI]", |
" 1019 0985 P6VXA Motherboard", |
" 1019 0987 K7VZA Motherboard", |
" 1043 8033 A7V Mainboard", |
" 1043 803e A7V-E Mainboard", |
" 1043 8040 A7M266 Mainboard", |
" 1043 8042 A7V133/A7V133-C Mainboard", |
" 1179 0001 Magnia Z310", |
" 3058 VT82C686 AC97 Audio Controller", |
" 0e11 0097 SoundMax Digital Integrated Audio", |
" 0e11 b194 Soundmax integrated digital audio", |
" 1019 0985 P6VXA Motherboard", |
" 1019 0987 K7VZA Motherboard", |
" 1043 1106 A7V133/A7V133-C Mainboard", |
" 1106 4511 Onboard Audio on EP7KXA", |
" 1458 7600 Onboard Audio", |
" 1462 3091 MS-6309 Onboard Audio", |
" 1462 3300 MS-6330 Onboard Audio", |
" 15dd 7609 Onboard Audio", |
" 3059 VT8233/A/8235/8237 AC97 Audio Controller", |
" 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)", |
" 1043 8095 A7V8X Motherboard (Realtek ALC650 codec)", |
" 1043 80a1 A7V8X-X Motherboard", |
" 1043 80b0 A7V600/K8V Deluxe motherboard (ADI AD1980 codec [SoundMAX])", |
" 1043 812a A8V Deluxe motherboard (Realtek ALC850 codec)", |
" 1106 3059 L7VMM2 Motherboard", |
" 1106 4161 K7VT2 motherboard", |
" 1106 4170 PCPartner P4M800-8237R Motherboard", |
" 1106 4552 Soyo KT-600 Dragon Plus (Realtek ALC 650)", |
" 1297 c160 FX41 motherboard (Realtek ALC650 codec)", |
" 1458 a002 GA-7VAX Onboard Audio (Realtek ALC650)", |
" 1462 0080 K8T NEO 2 motherboard", |
" 1462 3800 KT266 onboard audio", |
" 147b 1407 KV8-MAX3 motherboard", |
" 1849 9761 K7VT6 motherboard", |
" 4005 4710 MSI K7T266 Pro2-RU (MSI-6380 v2) onboard audio (Realtek/ALC 200/200P)", |
" a0a0 01b6 AK77-8XN onboard audio", |
" 3065 VT6102 [Rhine-II]", |
" 1043 80a1 A7V8X-X Motherboard", |
" 1106 0102 VT6102 [Rhine II] Embeded Ethernet Controller on VT8235", |
" 1186 1400 DFE-530TX rev A", |
" 1186 1401 DFE-530TX rev B", |
" 13b9 1421 LD-10/100AL PCI Fast Ethernet Adapter (rev.B)", |
" 147b 1c09 NV7 Motherboard", |
" 1695 3005 VT6103", |
" 1695 300c Realtek ALC655 sound chip", |
" 1849 3065 K7VT6 motherboard", |
" 3068 AC'97 Modem Controller", |
" 1462 309e MS-6309 Saturn Motherboard", |
" 3074 VT8233 PCI to ISA Bridge", |
" 1043 8052 VT8233A", |
" 3091 VT8633 [Apollo Pro266]", |
" 3099 VT8366/A/7 [Apollo KT266/A/333]", |
" 1043 8064 A7V266-E Mainboard", |
" 1043 807f A7V333 Mainboard", |
" 1849 3099 K7VT2 motherboard", |
" 3101 VT8653 Host Bridge", |
" 3102 VT8662 Host Bridge", |
" 3103 VT8615 Host Bridge", |
" 3104 USB 2.0", |
" 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)", |
" 1043 808c A7V8X motherboard", |
" 1043 80a1 A7V8X-X motherboard rev 1.01", |
" 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard", |
" 1297 f641 FX41 motherboard", |
" 1458 5004 GA-7VAX Mainboard", |
" 1462 7020 K8T NEO 2 motherboard", |
" 147b 1407 KV8-MAX3 motherboard", |
" 182d 201d CN-029 USB 2.0 4 port PCI Card", |
" 1849 3104 K7VT6 motherboard", |
" 3106 VT6105 [Rhine-III]", |
" 1186 1403 DFE-530TX rev C", |
" 3108 S3 Unichrome Pro VGA Adapter", |
" 3109 VT8233C PCI to ISA Bridge", |
" 3112 VT8361 [KLE133] Host Bridge", |
" 3113 VPX/VPX2 PCI to PCI Bridge Controller", |
" 3116 VT8375 [KM266/KL266] Host Bridge", |
" 1297 f641 FX41 motherboard", |
" 3118 S3 Unichrome Pro VGA Adapter", |
" 3119 VT6120/VT6121/VT6122 Gigabit Ethernet Adapter", |
" 3122 VT8623 [Apollo CLE266] integrated CastleRock graphics", |
" 3123 VT8623 [Apollo CLE266]", |
" 3128 VT8753 [P4X266 AGP]", |
" 3133 VT3133 Host Bridge", |
" 3147 VT8233A ISA Bridge", |
" 1043 808c A7V333 motherboard", |
" 3148 P4M266 Host Bridge", |
" 3149 VIA VT6420 SATA RAID Controller", |
" 1043 80ed A7V600/K8V Deluxe/K8V-X/A8V Deluxe motherboard", |
" 1458 b003 GA-7VM400AM(F) Motherboard", |
" 1462 7020 K8T Neo 2 Motherboard", |
" 147b 1407 KV8-MAX3 motherboard", |
" 147b 1408 KV7", |
" 1849 3149 K7VT6 motherboard", |
" 3156 P/KN266 Host Bridge", |
" 3164 VT6410 ATA133 RAID controller", |
" 1043 80f4 P4P800 Mainboard Deluxe ATX", |
" 1462 7028 915P/G Neo2", |
" 3168 VT8374 P4X400 Host Controller/AGP Bridge", |
" 3177 VT8235 ISA Bridge", |
" 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)", |
" 1043 808c A7V8X motherboard", |
" 1043 80a1 A7V8X-X motherboard", |
" 1297 f641 FX41 motherboard", |
" 1458 5001 GA-7VAX Mainboard", |
" 1849 3177 K7VT2 motherboard", |
" 3178 ProSavageDDR P4N333 Host Bridge", |
" 3188 VT8385 [K8T800 AGP] Host Bridge", |
" 1043 80a3 K8V Deluxe/K8V-X motherboard", |
" 147b 1407 KV8-MAX3 motherboard", |
" 3189 VT8377 [KT400/KT600 AGP] Host Bridge", |
" 1043 807f A7V8X motherboard", |
" 1458 5000 GA-7VAX Mainboard", |
" 1849 3189 K7VT6 motherboard", |
" 3204 K8M800 Host Bridge", |
" 3205 VT8378 [KM400/A] Chipset Host Bridge", |
" 1458 5000 GA-7VM400M Motherboard", |
" 3208 PT890 Host Bridge", |
" 3213 VPX/VPX2 PCI to PCI Bridge Controller", |
" 3218 K8T800M Host Bridge", |
" 3227 VT8237 ISA bridge [KT600/K8T800/K8T890 South]", |
" 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard", |
" 1106 3227 DFI KT600-AL Motherboard", |
" 1458 5001 GA-7VT600 Motherboard", |
" 147b 1407 KV8-MAX3 motherboard", |
" 1849 3227 K7VT4 motherboard", |
" 3238 K8T890 Host Bridge", |
" 3249 VT6421 IDE RAID Controller", |
" 324a CX700 PCI to PCI Bridge", |
" 324b CX700 Host Bridge", |
" 324e CX700 Internal Module Bus", |
" 3258 PT880 Host Bridge", |
" 3259 CN400/PM880 Host Bridge", |
" 3269 KT880 Host Bridge", |
" 3282 K8T800Pro Host Bridge", |
" 3287 VT8251 PCI to ISA Bridge", |
" 3288 VIA High Definition Audio Controller", |
" 3290 K8M890 Host Bridge", |
" 3296 P4M800 Host Bridge", |
" 3324 CX700 Host Bridge", |
" 3327 P4M890 Host Bridge", |
" 3336 K8M890CE Host Bridge", |
" 3337 VT8237A PCI to ISA Bridge", |
" 3340 PT900 Host Bridge", |
" 3344 UniChrome Pro IGP", |
" 3349 VT8251 AHCI/SATA 4-Port Controller", |
" 3351 VT3351 Host Bridge", |
" 3364 P4M900 Host Bridge", |
" 337a VT8237A PCI to PCI Bridge", |
" 337b VT8237A Host Bridge", |
" 4149 VIA VT6420 (ATA133) Controller", |
" 4204 K8M800 Host Bridge", |
" 4208 PT890 Host Bridge", |
" 4238 K8T890 Host Bridge", |
" 4258 PT880 Host Bridge", |
" 4259 CN400/PM880 Host Bridge", |
" 4269 KT880 Host Bridge", |
" 4282 K8T800Pro Host Bridge", |
" 4290 K8M890 Host Bridge", |
" 4293 PM896 Host Bridge", |
" 4296 P4M800 Host Bridge", |
" 4308 PT894 Host Bridge", |
" 4314 CN700/VN800/P4M800CE/Pro Host Bridge", |
" 4324 CX700 Host Bridge", |
" 4327 P4M890 Host Bridge", |
" 4336 K8M890CE Host Bridge", |
" 4340 PT900 Host Bridge", |
" 4351 VT3351 Host Bridge", |
" 4364 P4M900 Host Bridge", |
" 5030 VT82C596 ACPI [Apollo PRO]", |
" 5208 PT890 I/O APIC Interrupt Controller", |
" 5238 K8T890 I/O APIC Interrupt Controller", |
" 5290 K8M890 I/O APIC Interrupt Controller", |
" 5308 PT894 I/O APIC Interrupt Controller", |
" 5327 P4M890 I/O APIC Interrupt Controller", |
" 5336 K8M890CE I/O APIC Interrupt Controller", |
" 5340 PT900 I/O APIC Interrupt Controller", |
" 5351 VT3351 I/O APIC Interrupt Controller", |
" 5364 P4M900 I/O APIC Interrupt Controller", |
" 6100 VT85C100A [Rhine II]", |
" 6327 P4M890 Security Device", |
" 7204 K8M800 Host Bridge", |
" 7205 VT8378 [S3 UniChrome] Integrated Video", |
" 1458 d000 Gigabyte GA-7VM400(A)M(F) Motherboard", |
" 7208 PT890 Host Bridge", |
" 7238 K8T890 Host Bridge", |
" 7258 PT880 Host Bridge", |
" 7259 CN400/PM880 Host Bridge", |
" 7269 KT880 Host Bridge", |
" 7282 K8T800Pro Host Bridge", |
" 7290 K8M890 Host Bridge", |
" 7293 PM896 Host Bridge", |
" 7296 P4M800 Host Bridge", |
" 7308 PT894 Host Bridge", |
" 7314 CN700/VN800/P4M800CE/Pro Host Bridge", |
" 7324 CX700 Host Bridge", |
" 7327 P4M890 Host Bridge", |
" 7336 K8M890CE Host Bridge", |
" 7340 PT900 Host Bridge", |
" 7351 VT3351 Host Bridge", |
" 7364 P4M900 Host Bridge", |
" 8231 VT8231 [PCI-to-ISA Bridge]", |
" 8235 VT8235 ACPI", |
" 8305 VT8363/8365 [KT133/KM133 AGP]", |
" 8324 CX700 PCI to ISA Bridge", |
" 8391 VT8371 [KX133 AGP]", |
" 8501 VT8501 [Apollo MVP4 AGP]", |
" 8596 VT82C596 [Apollo PRO AGP]", |
" 8597 VT82C597 [Apollo VP3 AGP]", |
" 8598 VT82C598/694x [Apollo MVP3/Pro133x AGP]", |
" 1019 0985 P6VXA Motherboard", |
" 8601 VT8601 [Apollo ProMedia AGP]", |
" 8605 VT8605 [PM133 AGP]", |
" 8691 VT82C691 [Apollo Pro]", |
" 8693 VT82C693 [Apollo Pro Plus] PCI Bridge", |
" a208 PT890 PCI to PCI Bridge Controller", |
" a238 K8T890 PCI to PCI Bridge Controller", |
" a327 P4M890 PCI to PCI Bridge Controller", |
" a364 P4M900 PCI to PCI Bridge Controller", |
" b091 VT8633 [Apollo Pro266 AGP]", |
" b099 VT8366/A/7 [Apollo KT266/A/333 AGP]", |
" b101 VT8653 AGP Bridge", |
" b102 VT8362 AGP Bridge", |
" b103 VT8615 AGP Bridge", |
" b112 VT8361 [KLE133] AGP Bridge", |
" b113 VPX/VPX2 I/O APIC Interrupt Controller", |
" b115 VT8363/8365 [KT133/KM133] PCI Bridge", |
" b168 VT8235 PCI Bridge", |
" b188 VT8237 PCI bridge [K8T800/K8T890 South]", |
" 147b 1407 KV8-MAX3 motherboard", |
" b198 VT8237 PCI Bridge", |
" b213 VPX/VPX2 I/O APIC Interrupt Controller", |
" b999 [K8T890 North / VT8237 South] PCI Bridge", |
" c208 PT890 PCI to PCI Bridge Controller", |
" c238 K8T890 PCI to PCI Bridge Controller", |
" c327 P4M890 PCI to PCI Bridge Controller", |
" c340 PT900 PCI to PCI Bridge Controller", |
" c364 P4M900 PCI to PCI Bridge Controller", |
" d104 VT8237 Integrated Fast Ethernet Controller", |
" d208 PT890 PCI to PCI Bridge Controller", |
" d213 VPX/VPX2 PCI to PCI Bridge Controller", |
" d238 K8T890 PCI to PCI Bridge Controller", |
" d340 PT900 PCI to PCI Bridge Controller", |
" e208 PT890 PCI to PCI Bridge Controller", |
" e238 K8T890 PCI to PCI Bridge Controller", |
" e340 PT900 PCI to PCI Bridge Controller", |
" f208 PT890 PCI to PCI Bridge Controller", |
" f238 K8T890 PCI to PCI Bridge Controller", |
" f340 PT900 PCI to PCI Bridge Controller", |
"1107 Stratus Computers", |
" 0576 VIA VT82C570MV [Apollo] (Wrong vendor ID!)", |
"1108 Proteon, Inc.", |
" 0100 p1690plus_AA", |
" 0101 p1690plus_AB", |
" 0105 P1690Plus", |
" 0108 P1690Plus", |
" 0138 P1690Plus", |
" 0139 P1690Plus", |
" 013c P1690Plus", |
" 013d P1690Plus", |
"1109 Cogent Data Technologies, Inc.", |
" 1400 EM110TX [EX110TX]", |
"110a Siemens Nixdorf AG", |
" 0002 Pirahna 2-port", |
" 0005 Tulip controller, power management, switch extender", |
" 0006 FSC PINC (I/O-APIC)", |
" 0015 FSC Multiprocessor Interrupt Controller", |
" 001d FSC Copernicus Management Controller", |
" 007b FSC Remote Service Controller, mailbox device", |
" 007c FSC Remote Service Controller, shared memory device", |
" 007d FSC Remote Service Controller, SMIC device", |
" 2101 HST SAPHIR V Primary PCI (ISDN/PMx)", |
" 2102 DSCC4 PEB/PEF 20534 DMA Supported Serial Communication Controller with 4 Channels", |
" 2104 Eicon Diva 2.02 compatible passive ISDN card", |
" 3142 SIMATIC NET CP 5613A1 (Profibus Adapter)", |
" 4021 SIMATIC NET CP 5512 (Profibus and MPI Cardbus Adapter)", |
" 4029 SIMATIC NET CP 5613A2 (Profibus Adapter)", |
" 4942 FPGA I-Bus Tracer for MBD", |
" 6120 SZB6120", |
"110b Chromatic Research Inc.", |
" 0001 Mpact Media Processor", |
" 0004 Mpact 2", |
"110c Mini-Max Technology, Inc.", |
"110d Znyx Advanced Systems", |
"110e CPU Technology", |
"110f Ross Technology", |
"1110 Powerhouse Systems", |
" 6037 Firepower Powerized SMP I/O ASIC", |
" 6073 Firepower Powerized SMP I/O ASIC", |
"1111 Santa Cruz Operation", |
"1112 Osicom Technologies Inc", |
" 2200 FDDI Adapter", |
" 2300 Fast Ethernet Adapter", |
" 2340 4 Port Fast Ethernet Adapter", |
" 2400 ATM Adapter", |
"1113 Accton Technology Corporation", |
" 1211 SMC2-1211TX", |
" 103c 1207 EN-1207D Fast Ethernet Adapter", |
" 1113 1211 EN-1207D Fast Ethernet Adapter", |
" 1216 EN-1216 Ethernet Adapter", |
" 1113 2242 EN2242 10/100 Ethernet Mini-PCI Card", |
" 111a 1020 SpeedStream 1020 PCI 10/100 Ethernet Adaptor [EN-1207F-TX ?]", |
" 1217 EN-1217 Ethernet Adapter", |
" 5105 10Mbps Network card", |
" 9211 EN-1207D Fast Ethernet Adapter", |
" 1113 9211 EN-1207D Fast Ethernet Adapter", |
" 9511 21x4x DEC-Tulip compatible Fast Ethernet", |
" d301 CPWNA100 (Philips wireless PCMCIA)", |
" ec02 SMC 1244TX v3", |
"1114 Atmel Corporation", |
" 0506 at76c506 802.11b Wireless Network Adaptor", |
"1115 3D Labs", |
"1116 Data Translation", |
" 0022 DT3001", |
" 0023 DT3002", |
" 0024 DT3003", |
" 0025 DT3004", |
" 0026 DT3005", |
" 0027 DT3001-PGL", |
" 0028 DT3003-PGL", |
"1117 Datacube, Inc", |
" 9500 Max-1C SVGA card", |
" 9501 Max-1C image processing", |
"1118 Berg Electronics", |
"1119 ICP Vortex Computersysteme GmbH", |
" 0000 GDT 6000/6020/6050", |
" 0001 GDT 6000B/6010", |
" 0002 GDT 6110/6510", |
" 0003 GDT 6120/6520", |
" 0004 GDT 6530", |
" 0005 GDT 6550", |
" 0006 GDT 6117/6517", |
" 0007 GDT 6127/6527", |
" 0008 GDT 6537", |
" 0009 GDT 6557/6557-ECC", |
" 000a GDT 6115/6515", |
" 000b GDT 6125/6525", |
" 000c GDT 6535", |
" 000d GDT 6555", |
" 0010 GDT 6115/6515", |
" 0011 GDT 6125/6525", |
" 0012 GDT 6535", |
" 0013 GDT 6555/6555-ECC", |
" 0100 GDT 6117RP/6517RP", |
" 0101 GDT 6127RP/6527RP", |
" 0102 GDT 6537RP", |
" 0103 GDT 6557RP", |
" 0104 GDT 6111RP/6511RP", |
" 0105 GDT 6121RP/6521RP", |
" 0110 GDT 6117RD/6517RD", |
" 0111 GDT 6127RD/6527RD", |
" 0112 GDT 6537RD", |
" 0113 GDT 6557RD", |
" 0114 GDT 6111RD/6511RD", |
" 0115 GDT 6121RD/6521RD", |
" 0118 GDT 6118RD/6518RD/6618RD", |
" 0119 GDT 6128RD/6528RD/6628RD", |
" 011a GDT 6538RD/6638RD", |
" 011b GDT 6558RD/6658RD", |
" 0120 GDT 6117RP2/6517RP2", |
" 0121 GDT 6127RP2/6527RP2", |
" 0122 GDT 6537RP2", |
" 0123 GDT 6557RP2", |
" 0124 GDT 6111RP2/6511RP2", |
" 0125 GDT 6121RP2/6521RP2", |
" 0136 GDT 6113RS/6513RS", |
" 0137 GDT 6123RS/6523RS", |
" 0138 GDT 6118RS/6518RS/6618RS", |
" 0139 GDT 6128RS/6528RS/6628RS", |
" 013a GDT 6538RS/6638RS", |
" 013b GDT 6558RS/6658RS", |
" 013c GDT 6533RS/6633RS", |
" 013d GDT 6543RS/6643RS", |
" 013e GDT 6553RS/6653RS", |
" 013f GDT 6563RS/6663RS", |
" 0166 GDT 7113RN/7513RN/7613RN", |
" 0167 GDT 7123RN/7523RN/7623RN", |
" 0168 GDT 7118RN/7518RN/7518RN", |
" 0169 GDT 7128RN/7528RN/7628RN", |
" 016a GDT 7538RN/7638RN", |
" 016b GDT 7558RN/7658RN", |
" 016c GDT 7533RN/7633RN", |
" 016d GDT 7543RN/7643RN", |
" 016e GDT 7553RN/7653RN", |
" 016f GDT 7563RN/7663RN", |
" 01d6 GDT 4x13RZ", |
" 01d7 GDT 4x23RZ", |
" 01f6 GDT 8x13RZ", |
" 01f7 GDT 8x23RZ", |
" 01fc GDT 8x33RZ", |
" 01fd GDT 8x43RZ", |
" 01fe GDT 8x53RZ", |
" 01ff GDT 8x63RZ", |
" 0210 GDT 6519RD/6619RD", |
" 0211 GDT 6529RD/6629RD", |
" 0260 GDT 7519RN/7619RN", |
" 0261 GDT 7529RN/7629RN", |
" 02ff GDT MAXRP", |
" 0300 GDT NEWRX", |
"111a Efficient Networks, Inc", |
" 0000 155P-MF1 (FPGA)", |
" 0002 155P-MF1 (ASIC)", |
" 0003 ENI-25P ATM", |
" 111a 0000 ENI-25p Miniport ATM Adapter", |
" 0005 SpeedStream (LANAI)", |
" 111a 0001 ENI-3010 ATM", |
" 111a 0009 ENI-3060 ADSL (VPI=0)", |
" 111a 0101 ENI-3010 ATM", |
" 111a 0109 ENI-3060CO ADSL (VPI=0)", |
" 111a 0809 ENI-3060 ADSL (VPI=0 or 8)", |
" 111a 0909 ENI-3060CO ADSL (VPI=0 or 8)", |
" 111a 0a09 ENI-3060 ADSL (VPI=<0..15>)", |
" 0007 SpeedStream ADSL", |
" 111a 1001 ENI-3061 ADSL [ASIC]", |
" 1203 SpeedStream 1023 Wireless PCI Adapter", |
"111b Teledyne Electronic Systems", |
"111c Tricord Systems Inc.", |
" 0001 Powerbis Bridge", |
"111d Integrated Device Technology, Inc.", |
" 0001 IDT77201/77211 155Mbps ATM SAR Controller [NICStAR]", |
" 0003 IDT77222/77252 155Mbps ATM MICRO ABR SAR Controller", |
" 0004 IDT77V252 155Mbps ATM MICRO ABR SAR Controller", |
" 0005 IDT77V222 155Mbps ATM MICRO ABR SAR Controller", |
"111e Eldec", |
"111f Precision Digital Images", |
" 4a47 Precision MX Video engine interface", |
" 5243 Frame capture bus interface", |
"1120 EMC Corporation", |
"1121 Zilog", |
"1122 Multi-tech Systems, Inc.", |
"1123 Excellent Design, Inc.", |
"1124 Leutron Vision AG", |
" 2581 Picport Monochrome", |
"1125 Eurocore", |
"1126 Vigra", |
"1127 FORE Systems Inc", |
" 0200 ForeRunner PCA-200 ATM", |
" 0210 PCA-200PC", |
" 0250 ATM", |
" 0300 ForeRunner PCA-200EPC ATM", |
" 0310 ATM", |
" 0400 ForeRunnerHE ATM Adapter", |
" 1127 0400 ForeRunnerHE ATM", |
"1129 Firmworks", |
"112a Hermes Electronics Company, Ltd.", |
"112b Linotype - Hell AG", |
"112c Zenith Data Systems", |
"112d Ravicad", |
"112e Infomedia Microelectronics Inc.", |
"112f Imaging Technology Inc", |
" 0000 MVC IC-PCI", |
" 0001 MVC IM-PCI Video frame grabber/processor", |
" 0008 PC-CamLink PCI framegrabber", |
"1130 Computervision", |
"1131 Philips Semiconductors", |
" 1561 USB 1.1 Host Controller", |
" 1562 USB 2.0 Host Controller", |
" 3400 SmartPCI56(UCB1500) 56K Modem", |
" 5400 TriMedia TM1000/1100", |
" 5402 TriMedia TM-1300", |
" 1244 0f00 Fritz!Card DSL", |
" 5405 TriMedia TM1500", |
" 5406 TriMedia TM1700", |
" 7130 SAA7130 Video Broadcast Decoder", |
" 102b 48d0 Matrox CronosPlus", |
" 1048 226b ELSA EX-VISION 300TV", |
" 1131 2001 10MOONS PCI TV CAPTURE CARD", |
" 1131 2005 Techcom (India) TV Tuner Card (SSD-TV-670)", |
" 1461 050c Nagase Sangyo TransGear 3000TV", |
" 1461 10ff AVerMedia DVD EZMaker", |
" 1461 2108 AverMedia AverTV/305", |
" 1461 2115 AverMedia AverTV Studio 305", |
" 153b 1152 Terratec Cinergy 200 TV", |
" 185b c100 Compro VideoMate TV PVR/FM", |
" 185b c901 Videomate DVB-T200", |
" 5168 0138 LifeView FlyVIDEO2000", |
" 7133 SAA7133/SAA7135 Video Broadcast Decoder", |
" 0000 4091 Beholder BeholdTV 409 FM", |
" 1019 4cb5 Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM)", |
" 1043 0210 FlyTV mini Asus Digimatrix", |
" 1043 4843 ASUS TV-FM 7133", |
" 1043 4845 TV-FM 7135", |
" 1043 4862 P7131 Dual", |
" 1131 2001 Proteus Pro [philips reference design]", |
" 1131 2018 Tiger reference design", |
" 1131 4ee9 MonsterTV Mobile", |
" 11bd 002b PCTV Stereo", |
" 11bd 002e PCTV 110i (saa7133)", |
" 12ab 0800 PURPLE TV", |
" 1421 0335 Instant TV DVB-T Cardbus", |
" 1421 1370 Instant TV (saa7135)", |
" 1435 7330 VFG7330", |
" 1435 7350 VFG7350", |
" 1461 1044 AVerTVHD MCE A180", |
" 1461 f31f Avermedia AVerTV GO 007 FM", |
" 1462 6231 TV@Anywhere plus", |
" 1489 0214 LifeView FlyTV Platinum FM", |
" 14c0 1212 LifeView FlyTV Platinum Mini2", |
" 153b 1160 Cinergy 250 PCI TV", |
" 153b 1162 Terratec Cinergy 400 mobile", |
" 185b c100 VideoMate TV", |
" 5168 0306 LifeView FlyDVB-T DUO", |
" 5168 0319 LifeView FlyDVB Trio", |
" 7134 SAA7134/SAA7135HL Video Broadcast Decoder", |
" 1019 4cb4 Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM)", |
" 1043 0210 Digimatrix TV", |
" 1043 4840 ASUS TV-FM 7134", |
" 1131 2004 EUROPA V3 reference design", |
" 1131 4e85 SKNet Monster TV", |
" 1131 6752 EMPRESS", |
" 11bd 002b PCTV Stereo", |
" 11bd 002d PCTV 300i DVB-T + PAL", |
" 1461 2c00 AverTV Hybrid+FM PCI", |
" 1461 9715 AVerTV Studio 307", |
" 1461 a70a Avermedia AVerTV 307", |
" 1461 a70b AverMedia M156 / Medion 2819", |
" 1461 d6ee Cardbus TV/Radio (E500)", |
" 1471 b7e9 AVerTV Cardbus plus", |
" 153b 1142 Terratec Cinergy 400 TV", |
" 153b 1143 Terratec Cinergy 600 TV", |
" 153b 1158 Terratec Cinergy 600 TV MK3", |
" 1540 9524 ProVideo PV952", |
" 16be 0003 Medion 7134", |
" 185b c200 Compro VideoMate Gold+ Pal", |
" 185b c900 Videomate DVB-T300", |
" 1894 a006 KNC One TV-Station DVR", |
" 1894 fe01 KNC One TV-Station RDS / Typhoon TV Tuner RDS", |
" 7145 SAA7145", |
" 7146 SAA7146", |
" 110a 0000 Fujitsu/Siemens DVB-C card rev1.5", |
" 110a ffff Fujitsu/Siemens DVB-C card rev1.5", |
" 1131 4f56 KNC1 DVB-S Budget", |
" 1131 4f60 Fujitsu-Siemens Activy DVB-S Budget Rev AL", |
" 1131 4f61 Activy DVB-S Budget Rev GR", |
" 1131 5f61 Activy DVB-T Budget", |
" 114b 2003 DVRaptor Video Edit/Capture Card", |
" 11bd 0006 DV500 Overlay", |
" 11bd 000a DV500 Overlay", |
" 11bd 000f DV500 Overlay", |
" 13c2 0000 Siemens/Technotrend/Hauppauge DVB card rev1.3 or rev1.5", |
" 13c2 0001 Technotrend/Hauppauge DVB card rev1.3 or rev1.6", |
" 13c2 0002 Technotrend/Hauppauge DVB card rev2.1", |
" 13c2 0003 Technotrend/Hauppauge DVB card rev2.1", |
" 13c2 0004 Technotrend/Hauppauge DVB card rev2.1", |
" 13c2 0006 Technotrend/Hauppauge DVB card rev1.3 or rev1.6", |
" 13c2 0008 Technotrend/Hauppauge DVB-T", |
" 13c2 000a Octal/Technotrend DVB-C for iTV", |
" 13c2 1003 Technotrend-Budget/Hauppauge WinTV-NOVA-S DVB card", |
" 13c2 1004 Technotrend-Budget/Hauppauge WinTV-NOVA-C DVB card", |
" 13c2 1005 Technotrend-Budget/Hauppauge WinTV-NOVA-T DVB card", |
" 13c2 100c Technotrend-Budget/Hauppauge WinTV-NOVA-CI DVB card", |
" 13c2 100f Technotrend-Budget/Hauppauge WinTV-NOVA-CI DVB card", |
" 13c2 1011 Technotrend-Budget/Hauppauge WinTV-NOVA-T DVB card", |
" 13c2 1013 SATELCO Multimedia DVB", |
" 13c2 1016 WinTV-NOVA-SE DVB card", |
" 13c2 1102 Technotrend/Hauppauge DVB card rev2.1", |
" 153b 1156 Terratec Cynergy 1200C", |
" 9730 SAA9730 Integrated Multimedia and Peripheral Controller", |
"1132 Mitel Corp.", |
"1133 Eicon Networks Corporation", |
" 7901 EiconCard S90", |
" 7902 EiconCard S90", |
" 7911 EiconCard S91", |
" 7912 EiconCard S91", |
" 7941 EiconCard S94", |
" 7942 EiconCard S94", |
" 7943 EiconCard S94", |
" 7944 EiconCard S94", |
" b921 EiconCard P92", |
" b922 EiconCard P92", |
" b923 EiconCard P92", |
" e001 Diva Pro 2.0 S/T", |
" e002 Diva 2.0 S/T PCI", |
" e003 Diva Pro 2.0 U", |
" e004 Diva 2.0 U PCI", |
" e005 Diva 2.01 S/T PCI", |
" e006 Diva CT S/T PCI", |
" e007 Diva CT U PCI", |
" e008 Diva CT Lite S/T PCI", |
" e009 Diva CT Lite U PCI", |
" e00a Diva ISDN+V.90 PCI", |
" e00b Diva 2.02 PCI S/T", |
" e00c Diva 2.02 PCI U", |
" e00d Diva ISDN Pro 3.0 PCI", |
" e00e Diva ISDN+CT S/T PCI Rev 2", |
" e010 Diva Server BRI-2M PCI", |
" 110a 0021 Fujitsu Siemens ISDN S0", |
" e011 Diva Server BRI S/T Rev 2", |
" e012 Diva Server 4BRI-8M PCI", |
" e013 Diva Server 4BRI Rev 2", |
" 1133 1300 Diva Server V-4BRI-8", |
" 1133 e013 Diva Server 4BRI-8M 2.0 PCI", |
" e014 Diva Server PRI-30M PCI", |
" e015 DIVA Server PRI Rev 2", |
" 1133 e015 Diva Server PRI 2.0 PCI", |
" e016 Diva Server Voice 4BRI PCI", |
" e017 Diva Server Voice 4BRI Rev 2", |
" 1133 e017 Diva Server Voice 4BRI-8M 2.0 PCI", |
" e018 Diva Server BRI-2M 2.0 PCI", |
" 1133 1800 Diva Server V-BRI-2", |
" 1133 e018 Diva Server BRI-2M 2.0 PCI", |
" e019 Diva Server Voice PRI Rev 2", |
" 1133 e019 Diva Server Voice PRI 2.0 PCI", |
" e01a Diva Server 2FX", |
" e01b Diva Server Voice BRI-2M 2.0 PCI", |
" 1133 e01b Diva Server Voice BRI-2M 2.0 PCI", |
" e01c Diva Server PRI Rev 3", |
" 1133 1c01 Diva Server PRI/E1/T1-8", |
" 1133 1c02 Diva Server PRI/T1-24", |
" 1133 1c03 Diva Server PRI/E1-30", |
" 1133 1c04 Diva Server PRI/E1/T1", |
" 1133 1c05 Diva Server V-PRI/T1-24", |
" 1133 1c06 Diva Server V-PRI/E1-30", |
" 1133 1c07 Diva Server PRI/E1/T1-8 Cornet NQ", |
" 1133 1c08 Diva Server PRI/T1-24 Cornet NQ", |
" 1133 1c09 Diva Server PRI/E1-30 Cornet NQ", |
" 1133 1c0a Diva Server PRI/E1/T1 Cornet NQ", |
" 1133 1c0b Diva Server V-PRI/T1-24 Cornet NQ", |
" 1133 1c0c Diva Server V-PRI/E1-30 Cornet NQ", |
" e01e Diva Server 2PRI", |
" e020 Diva Server 4PRI", |
" e022 Diva Server Analog-2P", |
" e024 Diva Server Analog-4P", |
" 1133 2400 Diva Server V-Analog-4P", |
" 1133 e024 Diva Server Analog-4P", |
" e028 Diva Server Analog-8P", |
" 1133 2800 Diva Server V-Analog-8P", |
" 1133 e028 Diva Server Analog-8P", |
" e02a Diva Server IPM-300", |
" e02c Diva Server IPM-600", |
"1134 Mercury Computer Systems", |
" 0001 Raceway Bridge", |
" 0002 Dual PCI to RapidIO Bridge", |
"1135 Fuji Xerox Co Ltd", |
" 0001 Printer controller", |
"1136 Momentum Data Systems", |
"1137 Cisco Systems Inc", |
"1138 Ziatech Corporation", |
" 8905 8905 [STD 32 Bridge]", |
"1139 Dynamic Pictures, Inc", |
" 0001 VGA Compatable 3D Graphics", |
"113a FWB Inc", |
"113b Network Computing Devices", |
"113c Cyclone Microsystems, Inc.", |
" 0000 PCI-9060 i960 Bridge", |
" 0001 PCI-SDK [PCI i960 Evaluation Platform]", |
" 0911 PCI-911 [i960Jx-based Intelligent I/O Controller]", |
" 0912 PCI-912 [i960CF-based Intelligent I/O Controller]", |
" 0913 PCI-913", |
" 0914 PCI-914 [I/O Controller w/ secondary PCI bus]", |
"113d Leading Edge Products Inc", |
"113e Sanyo Electric Co - Computer Engineering Dept", |
"113f Equinox Systems, Inc.", |
" 0808 SST-64P Adapter", |
" 1010 SST-128P Adapter", |
" 80c0 SST-16P DB Adapter", |
" 80c4 SST-16P RJ Adapter", |
" 80c8 SST-16P Adapter", |
" 8888 SST-4P Adapter", |
" 9090 SST-8P Adapter", |
"1140 Intervoice Inc", |
"1141 Crest Microsystem Inc", |
"1142 Alliance Semiconductor Corporation", |
" 3210 AP6410", |
" 6422 ProVideo 6422", |
" 6424 ProVideo 6424", |
" 6425 ProMotion AT25", |
" 643d ProMotion AT3D", |
"1143 NetPower, Inc", |
"1144 Cincinnati Milacron", |
" 0001 Noservo controller", |
"1145 Workbit Corporation", |
" 8007 NinjaSCSI-32 Workbit", |
" f007 NinjaSCSI-32 KME", |
" f010 NinjaSCSI-32 Workbit", |
" f012 NinjaSCSI-32 Logitec", |
" f013 NinjaSCSI-32 Logitec", |
" f015 NinjaSCSI-32 Melco", |
" f020 NinjaSCSI-32 Sony PCGA-DVD51", |
"1146 Force Computers", |
"1147 Interface Corp", |
"1148 SysKonnect", |
" 4000 FDDI Adapter", |
" 0e11 b03b Netelligent 100 FDDI DAS Fibre SC", |
" 0e11 b03c Netelligent 100 FDDI SAS Fibre SC", |
" 0e11 b03d Netelligent 100 FDDI DAS UTP", |
" 0e11 b03e Netelligent 100 FDDI SAS UTP", |
" 0e11 b03f Netelligent 100 FDDI SAS Fibre MIC", |
" 1148 5521 FDDI SK-5521 (SK-NET FDDI-UP)", |
" 1148 5522 FDDI SK-5522 (SK-NET FDDI-UP DAS)", |
" 1148 5541 FDDI SK-5541 (SK-NET FDDI-FP)", |
" 1148 5543 FDDI SK-5543 (SK-NET FDDI-LP)", |
" 1148 5544 FDDI SK-5544 (SK-NET FDDI-LP DAS)", |
" 1148 5821 FDDI SK-5821 (SK-NET FDDI-UP64)", |
" 1148 5822 FDDI SK-5822 (SK-NET FDDI-UP64 DAS)", |
" 1148 5841 FDDI SK-5841 (SK-NET FDDI-FP64)", |
" 1148 5843 FDDI SK-5843 (SK-NET FDDI-LP64)", |
" 1148 5844 FDDI SK-5844 (SK-NET FDDI-LP64 DAS)", |
" 4200 Token Ring adapter", |
" 4300 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link)", |
" 1148 9821 SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T)", |
" 1148 9822 SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link)", |
" 1148 9841 SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX)", |
" 1148 9842 SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link)", |
" 1148 9843 SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX)", |
" 1148 9844 SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link)", |
" 1148 9861 SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition)", |
" 1148 9862 SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link)", |
" 1148 9871 SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX)", |
" 1148 9872 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link)", |
" 1259 2970 AT-2970SX Gigabit Ethernet Adapter", |
" 1259 2971 AT-2970LX Gigabit Ethernet Adapter", |
" 1259 2972 AT-2970TX Gigabit Ethernet Adapter", |
" 1259 2973 AT-2971SX Gigabit Ethernet Adapter", |
" 1259 2974 AT-2971T Gigabit Ethernet Adapter", |
" 1259 2975 AT-2970SX/2SC Gigabit Ethernet Adapter", |
" 1259 2976 AT-2970LX/2SC Gigabit Ethernet Adapter", |
" 1259 2977 AT-2970TX/2TX Gigabit Ethernet Adapter", |
" 4320 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter, PCI64, Fiber ZX/SC", |
" 1148 0121 Marvell RDK-8001 Adapter", |
" 1148 0221 Marvell RDK-8002 Adapter", |
" 1148 0321 Marvell RDK-8003 Adapter", |
" 1148 0421 Marvell RDK-8004 Adapter", |
" 1148 0621 Marvell RDK-8006 Adapter", |
" 1148 0721 Marvell RDK-8007 Adapter", |
" 1148 0821 Marvell RDK-8008 Adapter", |
" 1148 0921 Marvell RDK-8009 Adapter", |
" 1148 1121 Marvell RDK-8011 Adapter", |
" 1148 1221 Marvell RDK-8012 Adapter", |
" 1148 3221 SK-9521 V2.0 10/100/1000Base-T Adapter", |
" 1148 5021 SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter", |
" 1148 5041 SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter", |
" 1148 5043 SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter", |
" 1148 5051 SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter", |
" 1148 5061 SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter", |
" 1148 5071 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter", |
" 1148 9521 SK-9521 10/100/1000Base-T Adapter", |
" 4400 SK-9Dxx Gigabit Ethernet Adapter", |
" 4500 SK-9Mxx Gigabit Ethernet Adapter", |
" 9000 SK-9S21 10/100/1000Base-T Server Adapter, PCI-X, Copper RJ-45", |
" 9843 [Fujitsu] Gigabit Ethernet", |
" 9e00 SK-9E21D 10/100/1000Base-T Adapter, Copper RJ-45", |
" 1148 2100 SK-9E21 Server Adapter", |
" 1148 21d0 SK-9E21D 10/100/1000Base-T Adapter", |
" 1148 2200 SK-9E22 Server Adapter", |
" 1148 8100 SK-9E81 Server Adapter", |
" 1148 8200 SK-9E82 Server Adapter", |
" 1148 9100 SK-9E91 Server Adapter", |
" 1148 9200 SK-9E92 Server Adapter", |
"1149 Win System Corporation", |
"114a VMIC", |
" 5579 VMIPCI-5579 (Reflective Memory Card)", |
" 5587 VMIPCI-5587 (Reflective Memory Card)", |
" 6504 VMIC PCI 7755 FPGA", |
" 7587 VMIVME-7587", |
"114b Canopus Co., Ltd", |
"114c Annabooks", |
"114d IC Corporation", |
"114e Nikon Systems Inc", |
"114f Digi International", |
" 0002 AccelePort EPC", |
" 0003 RightSwitch SE-6", |
" 0004 AccelePort Xem", |
" 0005 AccelePort Xr", |
" 0006 AccelePort Xr,C/X", |
" 0009 AccelePort Xr/J", |
" 000a AccelePort EPC/J", |
" 000c DataFirePRIme T1 (1-port)", |
" 000d SyncPort 2-Port (x.25/FR)", |
" 0011 AccelePort 8r EIA-232 (IBM)", |
" 0012 AccelePort 8r EIA-422", |
" 0014 AccelePort 8r EIA-422", |
" 0015 AccelePort Xem", |
" 0016 AccelePort EPC/X", |
" 0017 AccelePort C/X", |
" 001a DataFirePRIme E1 (1-port)", |
" 001b AccelePort C/X (IBM)", |
" 001d DataFire RAS T1/E1/PRI", |
" 114f 0050 DataFire RAS E1 Adapter", |
" 114f 0051 DataFire RAS Dual E1 Adapter", |
" 114f 0052 DataFire RAS T1 Adapter", |
" 114f 0053 DataFire RAS Dual T1 Adapter", |
" 0023 AccelePort RAS", |
" 0024 DataFire RAS B4 ST/U", |
" 114f 0030 DataFire RAS BRI U Adapter", |
" 114f 0031 DataFire RAS BRI S/T Adapter", |
" 0026 AccelePort 4r 920", |
" 0027 AccelePort Xr 920", |
" 0028 ClassicBoard 4", |
" 0029 ClassicBoard 8", |
" 0034 AccelePort 2r 920", |
" 0035 DataFire DSP T1/E1/PRI cPCI", |
" 0040 AccelePort Xp", |
" 0042 AccelePort 2p", |
" 0043 AccelePort 4p", |
" 0044 AccelePort 8p", |
" 0045 AccelePort 16p", |
" 004e AccelePort 32p", |
" 0070 Datafire Micro V IOM2 (Europe)", |
" 0071 Datafire Micro V (Europe)", |
" 0072 Datafire Micro V IOM2 (North America)", |
" 0073 Datafire Micro V (North America)", |
" 00b0 Digi Neo 4", |
" 00b1 Digi Neo 8", |
" 00c8 Digi Neo 2 DB9", |
" 00c9 Digi Neo 2 DB9 PRI", |
" 00ca Digi Neo 2 RJ45", |
" 00cb Digi Neo 2 RJ45 PRI", |
" 00d0 ClassicBoard 4 422", |
" 00d1 ClassicBoard 8 422", |
" 6001 Avanstar", |
"1150 Thinking Machines Corp", |
"1151 JAE Electronics Inc.", |
"1152 Megatek", |
"1153 Land Win Electronic Corp", |
"1154 Melco Inc", |
"1155 Pine Technology Ltd", |
"1156 Periscope Engineering", |
"1157 Avsys Corporation", |
"1158 Voarx R & D Inc", |
" 3011 Tokenet/vg 1001/10m anylan", |
" 9050 Lanfleet/Truevalue", |
" 9051 Lanfleet/Truevalue", |
"1159 Mutech Corp", |
" 0001 MV-1000", |
"115a Harlequin Ltd", |
"115b Parallax Graphics", |
"115c Photron Ltd.", |
"115d Xircom", |
" 0003 Cardbus Ethernet 10/100", |
" 1014 0181 10/100 EtherJet Cardbus Adapter", |
" 1014 1181 10/100 EtherJet Cardbus Adapter", |
" 1014 8181 10/100 EtherJet Cardbus Adapter", |
" 1014 9181 10/100 EtherJet Cardbus Adapter", |
" 115d 0181 Cardbus Ethernet 10/100", |
" 115d 0182 RealPort2 CardBus Ethernet 10/100 (R2BE-100)", |
" 115d 1181 Cardbus Ethernet 10/100", |
" 1179 0181 Cardbus Ethernet 10/100", |
" 8086 8181 EtherExpress PRO/100 Mobile CardBus 32 Adapter", |
" 8086 9181 EtherExpress PRO/100 Mobile CardBus 32 Adapter", |
" 0005 Cardbus Ethernet 10/100", |
" 1014 0182 10/100 EtherJet Cardbus Adapter", |
" 1014 1182 10/100 EtherJet Cardbus Adapter", |
" 115d 0182 Cardbus Ethernet 10/100", |
" 115d 1182 Cardbus Ethernet 10/100", |
" 0007 Cardbus Ethernet 10/100", |
" 1014 0182 10/100 EtherJet Cardbus Adapter", |
" 1014 1182 10/100 EtherJet Cardbus Adapter", |
" 115d 0182 Cardbus Ethernet 10/100", |
" 115d 1182 Cardbus Ethernet 10/100", |
" 000b Cardbus Ethernet 10/100", |
" 1014 0183 10/100 EtherJet Cardbus Adapter", |
" 115d 0183 Cardbus Ethernet 10/100", |
" 000c Mini-PCI V.90 56k Modem", |
" 000f Cardbus Ethernet 10/100", |
" 1014 0183 10/100 EtherJet Cardbus Adapter", |
" 115d 0183 Cardbus Ethernet 10/100", |
" 00d4 Mini-PCI K56Flex Modem", |
" 0101 Cardbus 56k modem", |
" 115d 1081 Cardbus 56k Modem", |
" 0103 Cardbus Ethernet + 56k Modem", |
" 1014 9181 Cardbus 56k Modem", |
" 1115 1181 Cardbus Ethernet 100 + 56k Modem", |
" 115d 1181 CBEM56G-100 Ethernet + 56k Modem", |
" 8086 9181 PRO/100 LAN + Modem56 CardBus", |
"115e Peer Protocols Inc", |
"115f Maxtor Corporation", |
"1160 Megasoft Inc", |
"1161 PFU Limited", |
"1162 OA Laboratory Co Ltd", |
"1163 Rendition", |
" 0001 Verite 1000", |
" 2000 Verite V2000/V2100/V2200", |
" 1092 2000 Stealth II S220", |
"1164 Advanced Peripherals Technologies", |
"1165 Imagraph Corporation", |
" 0001 Motion TPEG Recorder/Player with audio", |
"1166 Broadcom", |
" 0000 CMIC-LE", |
" 0005 CNB20-LE Host Bridge", |
" 0006 CNB20HE Host Bridge", |
" 0007 CNB20-LE Host Bridge", |
" 0008 CNB20HE Host Bridge", |
" 0009 CNB20LE Host Bridge", |
" 0010 CIOB30", |
" 0011 CMIC-HE", |
" 0012 CMIC-WS Host Bridge (GC-LE chipset)", |
" 0013 CNB20-HE Host Bridge", |
" 0014 CMIC-LE Host Bridge (GC-LE chipset)", |
" 0015 CMIC-GC Host Bridge", |
" 0016 CMIC-GC Host Bridge", |
" 0017 GCNB-LE Host Bridge", |
" 0036 HT1000 PCI/PCI-X bridge", |
" 0101 CIOB-X2 PCI-X I/O Bridge", |
" 0104 HT1000 PCI/PCI-X bridge", |
" 0110 CIOB-E I/O Bridge with Gigabit Ethernet", |
" 0130 HT1000 PCI-X bridge", |
" 0132 HT1000 PCI-Express bridge", |
" 0200 OSB4 South Bridge", |
" 0201 CSB5 South Bridge", |
" 4c53 1080 CT8 mainboard", |
" 0203 CSB6 South Bridge", |
" 1734 1012 Primergy RX300", |
" 0205 HT1000 Legacy South Bridge", |
" 0211 OSB4 IDE Controller", |
" 0212 CSB5 IDE Controller", |
" 4c53 1080 CT8 mainboard", |
" 0213 CSB6 RAID/IDE Controller", |
" 1028 c134 Poweredge SC600", |
" 1734 1012 Primergy RX300", |
" 0214 HT1000 Legacy IDE controller", |
" 0217 CSB6 IDE Controller", |
" 1028 4134 Poweredge SC600", |
" 0220 OSB4/CSB5 OHCI USB Controller", |
" 4c53 1080 CT8 mainboard", |
" 0221 CSB6 OHCI USB Controller", |
" 1734 1012 Primergy RX300", |
" 0223 HT1000 USB Controller", |
" 0225 CSB5 LPC bridge", |
" 0227 GCLE-2 Host Bridge", |
" 1734 1012 Primergy RX300", |
" 0230 CSB5 LPC bridge", |
" 4c53 1080 CT8 mainboard", |
" 0234 HT1000 LPC Bridge", |
" 0240 K2 SATA", |
" 0241 RAIDCore RC4000", |
" 0242 RAIDCore BC4000", |
" 024a BCM5785 (HT1000) SATA Native SATA Mode", |
" 024b BCM5785 (HT1000) PATA/IDE Mode", |
"1167 Mutoh Industries Inc", |
"1168 Thine Electronics Inc", |
"1169 Centre for Development of Advanced Computing", |
"116a Polaris Communications", |
" 6100 Bus/Tag Channel", |
" 6800 Escon Channel", |
" 7100 Bus/Tag Channel", |
" 7800 Escon Channel", |
"116b Connectware Inc", |
"116c Intelligent Resources Integrated Systems", |
"116d Martin-Marietta", |
"116e Electronics for Imaging", |
"116f Workstation Technology", |
"1170 Inventec Corporation", |
"1171 Loughborough Sound Images Plc", |
"1172 Altera Corporation", |
"1173 Adobe Systems, Inc", |
"1174 Bridgeport Machines", |
"1175 Mitron Computer Inc.", |
"1176 SBE Incorporated", |
"1177 Silicon Engineering", |
"1178 Alfa, Inc.", |
" afa1 Fast Ethernet Adapter", |
"1179 Toshiba America Info Systems", |
" 0102 Extended IDE Controller", |
" 0103 EX-IDE Type-B", |
" 0404 DVD Decoder card", |
" 0406 Tecra Video Capture device", |
" 0407 DVD Decoder card (Version 2)", |
" 0601 CPU to PCI bridge", |
" 1179 0001 Satellite Pro", |
" 0603 ToPIC95 PCI to CardBus Bridge for Notebooks", |
" 060a ToPIC95", |
" 1179 0001 Satellite Pro", |
" 060f ToPIC97", |
" 0617 ToPIC100 PCI to Cardbus Bridge with ZV Support", |
" 0618 CPU to PCI and PCI to ISA bridge", |
" 0701 FIR Port", |
" 0804 TC6371AF SmartMedia Controller", |
" 0805 SD TypA Controller", |
" 0d01 FIR Port Type-DO", |
" 1179 0001 FIR Port Type-DO", |
"117a A-Trend Technology", |
"117b L G Electronics, Inc.", |
"117c Atto Technology", |
" 0030 Ultra320 SCSI Host Adapter", |
" 117c 8013 ExpressPCI UL4D", |
" 117c 8014 ExpressPCI UL4S", |
"117d Becton & Dickinson", |
"117e T/R Systems", |
"117f Integrated Circuit Systems", |
"1180 Ricoh Co Ltd", |
" 0465 RL5c465", |
" 0466 RL5c466", |
" 0475 RL5c475", |
" 144d c006 vpr Matrix 170B4 CardBus bridge", |
" 0476 RL5c476 II", |
" 1014 0185 ThinkPad A/T/X Series", |
" 1028 0188 Inspiron 6000 laptop", |
" 1043 1967 V6800V", |
" 1043 1987 Asus A4K and Z81K notebooks, possibly others ( mid-2005 machines )", |
" 104d 80df Vaio PCG-FX403", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 144d c00c P35 notebook", |
" 14ef 0220 PCD-RP-220S", |
" 17aa 201c Thinkpad X60s", |
" 0477 RL5c477", |
" 0478 RL5c478", |
" 1014 0184 ThinkPad A30p (2653-64G)", |
" 0511 R5C511", |
" 0522 R5C522 IEEE 1394 Controller", |
" 1014 01cf ThinkPad A30p (2653-64G)", |
" 1043 1967 V6800V", |
" 0551 R5C551 IEEE 1394 Controller", |
" 144d c006 vpr Matrix 170B4", |
" 0552 R5C552 IEEE 1394 Controller", |
" 1014 0511 ThinkPad A/T/X Series", |
" 1028 0188 Inspiron 6000 laptop", |
" 144d c00c P35 notebook", |
" 17aa 201e Thinkpad X60s", |
" 0554 R5C554", |
" 0575 R5C575 SD Bus Host Adapter", |
" 0576 R5C576 SD Bus Host Adapter", |
" 0592 R5C592 Memory Stick Bus Host Adapter", |
" 1043 1967 V6800V", |
" 144d c018 X20 IV", |
" 0811 R5C811", |
" 0822 R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter", |
" 1014 0556 Thinkpad X40", |
" 1014 0598 Thinkpad Z60m", |
" 1028 0188 Inspiron 6000 laptop", |
" 1028 01a2 Inspiron 9200", |
" 1043 1967 ASUS V6800V", |
" 144d c018 X20 IV", |
" 17aa 201d Thinkpad X60s", |
" 0841 R5C841 CardBus/SD/SDIO/MMC/MS/MSPro/xD/IEEE1394", |
" 0852 xD-Picture Card Controller", |
" 1043 1967 V6800V", |
"1181 Telmatics International", |
"1183 Fujikura Ltd", |
"1184 Forks Inc", |
"1185 Dataworld International Ltd", |
"1186 D-Link System Inc", |
" 0100 DC21041", |
" 1002 DL10050 Sundance Ethernet", |
" 1186 1002 DFE-550TX", |
" 1186 1012 DFE-580TX", |
" 1025 AirPlus Xtreme G DWL-G650 Adapter", |
" 1026 AirXpert DWL-AG650 Wireless Cardbus Adapter", |
" 1043 AirXpert DWL-AG650 Wireless Cardbus Adapter", |
" 1300 RTL8139 Ethernet", |
" 1186 1300 DFE-538TX 10/100 Ethernet Adapter", |
" 1186 1301 DFE-530TX+ 10/100 Ethernet Adapter", |
" 1186 1303 DFE-528TX 10/100 Fast Ethernet PCI Adapter", |
" 1340 DFE-690TXD CardBus PC Card", |
" 1541 DFE-680TXD CardBus PC Card", |
" 1561 DRP-32TXD Cardbus PC Card", |
" 2027 AirPlus Xtreme G DWL-G520 Adapter", |
" 3203 AirPlus Xtreme G DWL-G520 Adapter", |
" 3300 DWL-510 2.4GHz Wireless PCI Adapter", |
" 3a03 AirPro DWL-A650 Wireless Cardbus Adapter(rev.B)", |
" 3a04 AirPro DWL-AB650 Multimode Wireless Cardbus Adapter", |
" 3a05 AirPro DWL-AB520 Multimode Wireless PCI Adapter", |
" 3a07 AirXpert DWL-AG650 Wireless Cardbus Adapter", |
" 3a08 AirXpert DWL-AG520 Wireless PCI Adapter", |
" 3a10 AirXpert DWL-AG650 Wireless Cardbus Adapter(rev.B)", |
" 3a11 AirXpert DWL-AG520 Wireless PCI Adapter(rev.B)", |
" 3a12 AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C)", |
" 3a13 AirPlus DWL-G520 Wireless PCI Adapter(rev.B)", |
" 3a14 AirPremier DWL-AG530 Wireless PCI Adapter", |
" 3a63 AirXpert DWL-AG660 Wireless Cardbus Adapter", |
" 4000 DL2000-based Gigabit Ethernet", |
" 4300 DGE-528T Gigabit Ethernet Adapter", |
" 4b01 DGE-530T Gigabit Ethernet Adapter (rev 11)", |
" 4c00 Gigabit Ethernet Adapter", |
" 1186 4c00 DGE-530T Gigabit Ethernet Adapter", |
" 8400 D-Link DWL-650+ CardBus PC Card", |
"1187 Advanced Technology Laboratories, Inc.", |
"1188 Shima Seiki Manufacturing Ltd.", |
"1189 Matsushita Electronics Co Ltd", |
"118a Hilevel Technology", |
"118b Hypertec Pty Limited", |
"118c Corollary, Inc", |
" 0014 PCIB [C-bus II to PCI bus host bridge chip]", |
" 1117 Intel 8-way XEON Profusion Chipset [Cache Coherency Filter]", |
"118d BitFlow Inc", |
" 0001 Raptor-PCI framegrabber", |
" 0012 Model 12 Road Runner Frame Grabber", |
" 0014 Model 14 Road Runner Frame Grabber", |
" 0024 Model 24 Road Runner Frame Grabber", |
" 0044 Model 44 Road Runner Frame Grabber", |
" 0112 Model 12 Road Runner Frame Grabber", |
" 0114 Model 14 Road Runner Frame Grabber", |
" 0124 Model 24 Road Runner Frame Grabber", |
" 0144 Model 44 Road Runner Frame Grabber", |
" 0212 Model 12 Road Runner Frame Grabber", |
" 0214 Model 14 Road Runner Frame Grabber", |
" 0224 Model 24 Road Runner Frame Grabber", |
" 0244 Model 44 Road Runner Frame Grabber", |
" 0312 Model 12 Road Runner Frame Grabber", |
" 0314 Model 14 Road Runner Frame Grabber", |
" 0324 Model 24 Road Runner Frame Grabber", |
" 0344 Model 44 Road Runner Frame Grabber", |
"118e Hermstedt GmbH", |
"118f Green Logic", |
"1190 Tripace", |
" c731 TP-910/920/940 PCI Ultra(Wide) SCSI Adapter", |
"1191 Artop Electronic Corp", |
" 0003 SCSI Cache Host Adapter", |
" 0004 ATP8400", |
" 0005 ATP850UF", |
" 0006 ATP860 NO-BIOS", |
" 0007 ATP860", |
" 0008 ATP865 NO-ROM", |
" 0009 ATP865", |
" 8002 AEC6710 SCSI-2 Host Adapter", |
" 8010 AEC6712UW SCSI", |
" 8020 AEC6712U SCSI", |
" 8030 AEC6712S SCSI", |
" 8040 AEC6712D SCSI", |
" 8050 AEC6712SUW SCSI", |
" 8060 AEC6712 SCSI", |
" 8080 AEC67160 SCSI", |
" 8081 AEC67160S SCSI", |
" 808a AEC67162 2-ch. LVD SCSI", |
"1192 Densan Company Ltd", |
"1193 Zeitnet Inc.", |
" 0001 1221", |
" 0002 1225", |
"1194 Toucan Technology", |
"1195 Ratoc System Inc", |
"1196 Hytec Electronics Ltd", |
"1197 Gage Applied Sciences, Inc.", |
" 010c CompuScope 82G 8bit 2GS/s Analog Input Card", |
"1198 Lambda Systems Inc", |
"1199 Attachmate Corporation", |
"119a Mind Share, Inc.", |
"119b Omega Micro Inc.", |
" 1221 82C092G", |
"119c Information Technology Inst.", |
"119d Bug, Inc. Sapporo Japan", |
"119e Fujitsu Microelectronics Ltd.", |
" 0001 FireStream 155", |
" 0003 FireStream 50", |
"119f Bull HN Information Systems", |
"11a0 Convex Computer Corporation", |
"11a1 Hamamatsu Photonics K.K.", |
"11a2 Sierra Research and Technology", |
"11a3 Deuretzbacher GmbH & Co. Eng. KG", |
"11a4 Barco Graphics NV", |
"11a5 Microunity Systems Eng. Inc", |
"11a6 Pure Data Ltd.", |
"11a7 Power Computing Corp.", |
"11a8 Systech Corp.", |
"11a9 InnoSys Inc.", |
" 4240 AMCC S933Q Intelligent Serial Card", |
"11aa Actel", |
"11ab Marvell Technology Group Ltd.", |
" 0146 GT-64010/64010A System Controller", |
" 138f W8300 802.11 Adapter (rev 07)", |
" 1fa6 Marvell W8300 802.11 Adapter", |
" 1fa7 88W8310 and 88W8000G [Libertas] 802.11g client chipset", |
" 1faa 88w8335 [Libertas] 802.11b/g Wireless", |
" 1385 4e00 WG511 v2 54MBit/ Wireless PC-Card", |
" 4320 88E8001 Gigabit Ethernet Controller", |
" 1019 0f38 Marvell 88E8001 Gigabit Ethernet Controller (ECS)", |
" 1019 8001 Marvell 88E8001 Gigabit Ethernet Controller (ECS)", |
" 1043 173c Marvell 88E8001 Gigabit Ethernet Controller (Asus)", |
" 1043 811a Marvell 88E8001 Gigabit Ethernet Controller (Asus)", |
" 105b 0c19 Marvell 88E8001 Gigabit Ethernet Controller (Foxconn)", |
" 10b8 b452 EZ Card 1000 (SMC9452TXV.2)", |
" 11ab 0121 Marvell RDK-8001", |
" 11ab 0321 Marvell RDK-8003", |
" 11ab 1021 Marvell RDK-8010", |
" 11ab 4320 Marvell Yukon Gigabit Ethernet 10/100/1000Baset-T Constroller (Asus)", |
" 11ab 5021 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (64 bit)", |
" 11ab 9521 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (32 bit)", |
" 1458 e000 Marvell 88E8001 Gigabit Ethernet Controller (Gigabyte)", |
" 147b 1406 Marvell 88E8001 Gigabit Ethernet Controller (Abit)", |
" 15d4 0047 Marvell 88E8001 Gigabit Ethernet Controller (Iwill)", |
" 1695 9025 Marvell 88E8001 Gigabit Ethernet Controller (Epox)", |
" 17f2 1c03 Marvell 88E8001 Gigabit Ethernet Controller (Albatron)", |
" 270f 2803 Marvell 88E8001 Gigabit Ethernet Controller (Chaintech)", |
" 4340 88E8021 PCI-X IPMI Gigabit Ethernet Controller", |
" 4341 88E8022 PCI-X IPMI Gigabit Ethernet Controller", |
" 4342 88E8061 PCI-E IPMI Gigabit Ethernet Controller", |
" 4343 88E8062 PCI-E IPMI Gigabit Ethernet Controller", |
" 4344 88E8021 PCI-X IPMI Gigabit Ethernet Controller", |
" 4345 88E8022 PCI-X IPMI Gigabit Ethernet Controller", |
" 4346 88E8061 PCI-E IPMI Gigabit Ethernet Controller", |
" 4347 88E8062 PCI-E IPMI Gigabit Ethernet Controller", |
" 4350 88E8035 PCI-E Fast Ethernet Controller", |
" 1179 0001 Marvell 88E8035 Fast Ethernet Controller (Toshiba)", |
" 11ab 3521 Marvell RDK-8035", |
" 1854 000d Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 000e Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 000f Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0011 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0012 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0016 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0017 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0018 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0019 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 001c Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 001e Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0020 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 4351 88E8036 PCI-E Fast Ethernet Controller", |
" 107b 4009 Marvell 88E8036 Fast Ethernet Controller (Wistron)", |
" 10f7 8338 Marvell 88E8036 Fast Ethernet Controller (Panasonic)", |
" 1179 0001 Marvell 88E8036 Fast Ethernet Controller (Toshiba)", |
" 1179 ff00 Marvell 88E8036 Fast Ethernet Controller (Compal)", |
" 1179 ff10 Marvell 88E8036 Fast Ethernet Controller (Inventec)", |
" 11ab 3621 Marvell RDK-8036", |
" 13d1 ac12 Abocom EFE3K - 10/100 Ethernet Expresscard", |
" 161f 203d Marvell 88E8036 Fast Ethernet Controller (Arima)", |
" 1854 000d Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 000e Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 000f Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0011 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0012 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0016 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0017 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0018 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0019 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 001c Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 001e Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0020 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 4352 88E8038 PCI-E Fast Ethernet Controller", |
" 4360 88E8052 PCI-E ASF Gigabit Ethernet Controller", |
" 1043 8134 Marvell 88E8052 Gigabit Ethernet Controller (Asus)", |
" 107b 4009 Marvell 88E8052 Gigabit Ethernet Controller (Wistron)", |
" 11ab 5221 Marvell RDK-8052", |
" 1458 e000 Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte)", |
" 1462 052c Marvell 88E8052 Gigabit Ethernet Controller (MSI)", |
" 1849 8052 Marvell 88E8052 Gigabit Ethernet Controller (ASRock)", |
" a0a0 0509 Marvell 88E8052 Gigabit Ethernet Controller (Aopen)", |
" 4361 88E8050 PCI-E ASF Gigabit Ethernet Controller", |
" 107b 3015 Marvell 88E8050 Gigabit Ethernet Controller (Gateway)", |
" 11ab 5021 Marvell 88E8050 Gigabit Ethernet Controller (Intel)", |
" 8086 3063 D925XCVLK mainboard", |
" 8086 3439 Marvell 88E8050 Gigabit Ethernet Controller (Intel)", |
" 4362 88E8053 PCI-E Gigabit Ethernet Controller", |
" 103c 2a0d Marvell 88E8053 Gigabit Ethernet Controller (Asus)", |
" 1043 8142 Marvell 88E8053 Gigabit Ethernet controller PCIe (Asus)", |
" 109f 3197 Marvell 88E8053 Gigabit Ethernet Controller (Trigem)", |
" 10f7 8338 Marvell 88E8053 Gigabit Ethernet Controller (Panasonic)", |
" 10fd a430 Marvell 88E8053 Gigabit Ethernet Controller (SOYO)", |
" 1179 0001 Marvell 88E8053 Gigabit Ethernet Controller (Toshiba)", |
" 1179 ff00 Marvell 88E8053 Gigabit Ethernet Controller (Compal)", |
" 1179 ff10 Marvell 88E8053 Gigabit Ethernet Controller (Inventec)", |
" 11ab 5321 Marvell RDK-8053", |
" 1297 c240 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)", |
" 1297 c241 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)", |
" 1297 c242 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)", |
" 1297 c243 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)", |
" 1297 c244 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)", |
" 13d1 ac11 EGE5K - Giga Ethernet Expresscard", |
" 1458 e000 Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte)", |
" 1462 058c Marvell 88E8053 Gigabit Ethernet Controller (MSI)", |
" 14c0 0012 Marvell 88E8053 Gigabit Ethernet Controller (Compal)", |
" 1558 04a0 Marvell 88E8053 Gigabit Ethernet Controller (Clevo)", |
" 15bd 1003 Marvell 88E8053 Gigabit Ethernet Controller (DFI)", |
" 161f 203c Marvell 88E8053 Gigabit Ethernet Controller (Arima)", |
" 161f 203d Marvell 88E8053 Gigabit Ethernet Controller (Arima)", |
" 1695 9029 Marvell 88E8053 Gigabit Ethernet Controller (Epox)", |
" 17f2 2c08 Marvell 88E8053 Gigabit Ethernet Controller (Albatron)", |
" 17ff 0585 Marvell 88E8053 Gigabit Ethernet Controller (Quanta)", |
" 1849 8053 Marvell 88E8053 Gigabit Ethernet Controller (ASRock)", |
" 1854 000b Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 000c Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 0010 Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 0013 Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 0014 Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 0015 Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 001a Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 001b Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 001d Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 001f Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 0021 Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 0022 Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 270f 2801 Marvell 88E8053 Gigabit Ethernet Controller (Chaintech)", |
" a0a0 0506 Marvell 88E8053 Gigabit Ethernet Controller (Aopen)", |
" 4363 88E8055 PCI-E Gigabit Ethernet Controller", |
" 4611 GT-64115 System Controller", |
" 4620 GT-64120/64120A/64121A System Controller", |
" 4801 GT-48001", |
" 5005 Belkin F5D5005 Gigabit Desktop Network PCI Card", |
" 5040 MV88SX5040 4-port SATA I PCI-X Controller", |
" 5041 MV88SX5041 4-port SATA I PCI-X Controller", |
" 5080 MV88SX5080 8-port SATA I PCI-X Controller", |
" 5081 MV88SX5081 8-port SATA I PCI-X Controller", |
" 6041 MV88SX6041 4-port SATA II PCI-X Controller", |
" 6081 MV88SX6081 8-port SATA II PCI-X Controller", |
" 6460 MV64360/64361/64362 System Controller", |
" 6480 MV64460/64461/64462 System Controller", |
" f003 GT-64010 Primary Image Piranha Image Generator", |
"11ac Canon Information Systems Research Aust.", |
"11ad Lite-On Communications Inc", |
" 0002 LNE100TX", |
" 11ad 0002 LNE100TX", |
" 11ad 0003 LNE100TX", |
" 11ad f003 LNE100TX", |
" 11ad ffff LNE100TX", |
" 1385 f004 FA310TX", |
" c115 LNE100TX [Linksys EtherFast 10/100]", |
" 11ad c001 LNE100TX [ver 2.0]", |
"11ae Aztech System Ltd", |
"11af Avid Technology Inc.", |
" 0001 Cinema", |
" ee40 Digidesign Audiomedia III", |
"11b0 V3 Semiconductor Inc.", |
" 0002 V300PSC", |
" 0292 V292PBC [Am29030/40 Bridge]", |
" 0960 V96xPBC", |
" c960 V96DPC", |
"11b1 Apricot Computers", |
"11b2 Eastman Kodak", |
"11b3 Barr Systems Inc.", |
"11b4 Leitch Technology International", |
"11b5 Radstone Technology Plc", |
"11b6 United Video Corp", |
"11b7 Motorola", |
"11b8 XPoint Technologies, Inc", |
" 0001 Quad PeerMaster", |
"11b9 Pathlight Technology Inc.", |
" c0ed SSA Controller", |
"11ba Videotron Corp", |
"11bb Pyramid Technology", |
"11bc Network Peripherals Inc", |
" 0001 NP-PCI", |
"11bd Pinnacle Systems Inc.", |
" 002e PCTV 40i", |
" bede AV/DV Studio Capture Card", |
"11be International Microcircuits Inc", |
"11bf Astrodesign, Inc.", |
"11c0 Hewlett Packard", |
"11c1 Agere Systems", |
" 0440 56k WinModem", |
" 1033 8015 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 1033 8047 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 1033 804f LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 10cf 102c LB LT Modem V.90 56k", |
" 10cf 104a BIBLO LT Modem 56k", |
" 10cf 105f LB2 LT Modem V.90 56k", |
" 1179 0001 Internal V.90 Modem", |
" 11c1 0440 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 122d 4101 MDP7800-U Modem", |
" 122d 4102 MDP7800SP-U Modem", |
" 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 13e0 0440 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 13e0 0441 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 13e0 0450 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 13e0 f100 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 13e0 f101 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 144d 2101 LT56PV Modem", |
" 149f 0440 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 0441 56k WinModem", |
" 1033 804d LT WinModem 56k Data+Fax", |
" 1033 8065 LT WinModem 56k Data+Fax", |
" 1092 0440 Supra 56i", |
" 1179 0001 Internal V.90 Modem", |
" 11c1 0440 LT WinModem 56k Data+Fax", |
" 11c1 0441 LT WinModem 56k Data+Fax", |
" 122d 4100 MDP7800-U Modem", |
" 13e0 0040 LT WinModem 56k Data+Fax", |
" 13e0 0100 LT WinModem 56k Data+Fax", |
" 13e0 0410 LT WinModem 56k Data+Fax", |
" 13e0 0420 TelePath Internet 56k WinModem", |
" 13e0 0440 LT WinModem 56k Data+Fax", |
" 13e0 0443 LT WinModem 56k Data+Fax", |
" 13e0 f102 LT WinModem 56k Data+Fax", |
" 1416 9804 CommWave 56k Modem", |
" 141d 0440 LT WinModem 56k Data+Fax", |
" 144f 0441 Lucent 56k V.90 DF Modem", |
" 144f 0449 Lucent 56k V.90 DF Modem", |
" 144f 110d Lucent Win Modem", |
" 1468 0441 Presario 56k V.90 DF Modem", |
" 1668 0440 Lucent Win Modem", |
" 0442 56k WinModem", |
" 11c1 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 11c1 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 13e0 0412 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 13e0 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 13fc 2471 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 144d 2104 LT56PT Modem", |
" 144f 1104 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 149f 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 1668 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 0443 LT WinModem", |
" 0444 LT WinModem", |
" 0445 LT WinModem", |
" 8086 2203 PRO/100+ MiniPCI (probably an Ambit U98.003.C.00 combo card)", |
" 8086 2204 PRO/100+ MiniPCI on Armada E500", |
" 0446 LT WinModem", |
" 0447 LT WinModem", |
" 0448 WinModem 56k", |
" 1014 0131 Lucent Win Modem", |
" 1033 8066 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 13e0 0030 56k Voice Modem", |
" 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 1668 2400 LT WinModem 56k (MiniPCI Ethernet+Modem)", |
" 0449 WinModem 56k", |
" 0e11 b14d 56k V.90 Modem", |
" 13e0 0020 LT WinModem 56k Data+Fax", |
" 13e0 0041 TelePath Internet 56k WinModem", |
" 1436 0440 Lucent Win Modem", |
" 144f 0449 Lucent 56k V.90 DFi Modem", |
" 1468 0410 IBM ThinkPad T23 (2647-4MG)", |
" 1468 0440 Lucent Win Modem", |
" 1468 0449 Presario 56k V.90 DFi Modem", |
" 044a F-1156IV WinModem (V90, 56KFlex)", |
" 10cf 1072 LB Global LT Modem", |
" 13e0 0012 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 13e0 0042 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 144f 1005 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 044b LT WinModem", |
" 044c LT WinModem", |
" 044d LT WinModem", |
" 044e LT WinModem", |
" 044f V90 WildWire Modem", |
" 0450 LT WinModem", |
" 1033 80a8 Versa Note Vxi", |
" 144f 4005 Magnia SG20", |
" 1468 0450 Evo N600c", |
" 4005 144f LifeBook C Series", |
" 0451 LT WinModem", |
" 0452 LT WinModem", |
" 0453 LT WinModem", |
" 0454 LT WinModem", |
" 0455 LT WinModem", |
" 0456 LT WinModem", |
" 0457 LT WinModem", |
" 0458 LT WinModem", |
" 0459 LT WinModem", |
" 045a LT WinModem", |
" 045c LT WinModem", |
" 0461 V90 WildWire Modem", |
" 0462 V90 WildWire Modem", |
" 0480 Venus Modem (V90, 56KFlex)", |
" 048c V.92 56K WinModem", |
" 048f V.92 56k WinModem", |
" 5801 USB", |
" 5802 USS-312 USB Controller", |
" 5803 USS-344S USB Controller", |
" 5811 FW323", |
" 8086 524c D865PERL mainboard", |
" dead 0800 FireWire Host Bus Adapter", |
" 8110 T8110 H.100/H.110 TDM switch", |
" 12d9 000c E1/T1 PMXc cPCI carrier card", |
" ab10 WL60010 Wireless LAN MAC", |
" ab11 WL60040 Multimode Wireles LAN MAC", |
" 11c1 ab12 WaveLAN 11abg Cardbus card (Model 1102)", |
" 11c1 ab13 WaveLAN 11abg MiniPCI card (Model 0512)", |
" 11c1 ab15 WaveLAN 11abg Cardbus card (Model 1106)", |
" 11c1 ab16 WaveLAN 11abg MiniPCI card (Model 0516)", |
" ab20 ORiNOCO PCI Adapter", |
" ab21 Agere Wireless PCI Adapter", |
" ab30 Hermes2 Mini-PCI WaveLAN a/b/g", |
" 14cd 2012 Hermes2 Mini-PCI WaveLAN a/b/g", |
" ed00 ET-131x PCI-E Ethernet Controller", |
"11c2 Sand Microelectronics", |
"11c3 NEC Corporation", |
"11c4 Document Technologies, Inc", |
"11c5 Shiva Corporation", |
"11c6 Dainippon Screen Mfg. Co. Ltd", |
"11c7 D.C.M. Data Systems", |
"11c8 Dolphin Interconnect Solutions AS", |
" 0658 PSB32 SCI-Adapter D31x", |
" d665 PSB64 SCI-Adapter D32x", |
" d667 PSB66 SCI-Adapter D33x", |
"11c9 Magma", |
" 0010 16-line serial port w/- DMA", |
" 0011 4-line serial port w/- DMA", |
"11ca LSI Systems, Inc", |
"11cb Specialix Research Ltd.", |
" 2000 PCI_9050", |
" 11cb 0200 SX", |
" 11cb b008 I/O8+", |
" 4000 SUPI_1", |
" 8000 T225", |
"11cc Michels & Kleberhoff Computer GmbH", |
"11cd HAL Computer Systems, Inc.", |
"11ce Netaccess", |
"11cf Pioneer Electronic Corporation", |
"11d0 Lockheed Martin Federal Systems-Manassas", |
"11d1 Auravision", |
" 01f7 VxP524", |
"11d2 Intercom Inc.", |
"11d3 Trancell Systems Inc", |
"11d4 Analog Devices", |
" 1535 Blackfin BF535 processor", |
" 1805 SM56 PCI modem", |
" 1889 AD1889 sound chip", |
" 1986 AD1986A sound chip", |
" 5340 AD1881 sound chip", |
"11d5 Ikon Corporation", |
" 0115 10115", |
" 0117 10117", |
"11d6 Tekelec Telecom", |
"11d7 Trenton Technology, Inc.", |
"11d8 Image Technologies Development", |
"11d9 TEC Corporation", |
"11da Novell", |
"11db Sega Enterprises Ltd", |
"11dc Questra Corporation", |
"11dd Crosfield Electronics Limited", |
"11de Zoran Corporation", |
" 6057 ZR36057PQC Video cutting chipset", |
" 1031 7efe DC10 Plus", |
" 1031 fc00 MiroVIDEO DC50, Motion JPEG Capture/CODEC Board", |
" 12f8 8a02 Tekram Video Kit", |
" 13ca 4231 JPEG/TV Card", |
" 6120 ZR36120", |
" 1328 f001 Cinemaster C DVD Decoder", |
" 13c2 0000 MediaFocus Satellite TV Card", |
" 1de1 9fff Video Kit C210", |
"11df New Wave PDG", |
"11e0 Cray Communications A/S", |
"11e1 GEC Plessey Semi Inc.", |
"11e2 Samsung Information Systems America", |
"11e3 Quicklogic Corporation", |
" 0001 COM-ON-AIR Dosch&Amand DECT", |
" 5030 PC Watchdog", |
"11e4 Second Wave Inc", |
"11e5 IIX Consulting", |
"11e6 Mitsui-Zosen System Research", |
"11e7 Toshiba America, Elec. Company", |
"11e8 Digital Processing Systems Inc.", |
"11e9 Highwater Designs Ltd.", |
"11ea Elsag Bailey", |
"11eb Formation Inc.", |
"11ec Coreco Inc", |
"11ed Mediamatics", |
"11ee Dome Imaging Systems Inc", |
"11ef Nicolet Technologies B.V.", |
"11f0 Compu-Shack", |
" 4231 FDDI", |
" 4232 FASTline UTP Quattro", |
" 4233 FASTline FO", |
" 4234 FASTline UTP", |
" 4235 FASTline-II UTP", |
" 4236 FASTline-II FO", |
" 4731 GIGAline", |
"11f1 Symbios Logic Inc", |
"11f2 Picture Tel Japan K.K.", |
"11f3 Keithley Metrabyte", |
"11f4 Kinetic Systems Corporation", |
" 2915 CAMAC controller", |
"11f5 Computing Devices International", |
"11f6 Compex", |
" 0112 ENet100VG4", |
" 0113 FreedomLine 100", |
" 1401 ReadyLink 2000", |
" 2011 RL100-ATX 10/100", |
" 11f6 2011 RL100-ATX", |
" 2201 ReadyLink 100TX (Winbond W89C840)", |
" 11f6 2011 ReadyLink 100TX", |
" 9881 RL100TX Fast Ethernet", |
"11f7 Scientific Atlanta", |
"11f8 PMC-Sierra Inc.", |
" 7375 PM7375 [LASAR-155 ATM SAR]", |
"11f9 I-Cube Inc", |
"11fa Kasan Electronics Company, Ltd.", |
"11fb Datel Inc", |
"11fc Silicon Magic", |
"11fd High Street Consultants", |
"11fe Comtrol Corporation", |
" 0001 RocketPort 32 port w/external I/F", |
" 0002 RocketPort 8 port w/external I/F", |
" 0003 RocketPort 16 port w/external I/F", |
" 0004 RocketPort 4 port w/quad cable", |
" 0005 RocketPort 8 port w/octa cable", |
" 0006 RocketPort 8 port w/RJ11 connectors", |
" 0007 RocketPort 4 port w/RJ11 connectors", |
" 0008 RocketPort 8 port w/ DB78 SNI (Siemens) connector", |
" 0009 RocketPort 16 port w/ DB78 SNI (Siemens) connector", |
" 000a RocketPort Plus 4 port", |
" 000b RocketPort Plus 8 port", |
" 000c RocketModem 6 port", |
" 000d RocketModem 4-port", |
" 000e RocketPort Plus 2 port RS232", |
" 000f RocketPort Plus 2 port RS422", |
" 0801 RocketPort UPCI 32 port w/external I/F", |
" 0802 RocketPort UPCI 8 port w/external I/F", |
" 0803 RocketPort UPCI 16 port w/external I/F", |
" 0805 RocketPort UPCI 8 port w/octa cable", |
" 080c RocketModem III 8 port", |
" 080d RocketModem III 4 port", |
" 0812 RocketPort UPCI Plus 8 port RS422", |
" 0903 RocketPort Compact PCI 16 port w/external I/F", |
" 8015 RocketPort 4-port UART 16954", |
"11ff Scion Corporation", |
" 0003 AG-5", |
"1200 CSS Corporation", |
"1201 Vista Controls Corp", |
"1202 Network General Corp.", |
" 4300 Gigabit Ethernet Adapter", |
" 1202 9841 SK-9841 LX", |
" 1202 9842 SK-9841 LX dual link", |
" 1202 9843 SK-9843 SX", |
" 1202 9844 SK-9843 SX dual link", |
"1203 Bayer Corporation, Agfa Division", |
"1204 Lattice Semiconductor Corporation", |
"1205 Array Corporation", |
"1206 Amdahl Corporation", |
"1208 Parsytec GmbH", |
" 4853 HS-Link Device", |
"1209 SCI Systems Inc", |
"120a Synaptel", |
"120b Adaptive Solutions", |
"120c Technical Corp.", |
"120d Compression Labs, Inc.", |
"120e Cyclades Corporation", |
" 0100 Cyclom-Y below first megabyte", |
" 0101 Cyclom-Y above first megabyte", |
" 0102 Cyclom-4Y below first megabyte", |
" 0103 Cyclom-4Y above first megabyte", |
" 0104 Cyclom-8Y below first megabyte", |
" 0105 Cyclom-8Y above first megabyte", |
" 0200 Cyclades-Z below first megabyte", |
" 0201 Cyclades-Z above first megabyte", |
" 0300 PC300/RSV or /X21 (2 ports)", |
" 0301 PC300/RSV or /X21 (1 port)", |
" 0310 PC300/TE (2 ports)", |
" 0311 PC300/TE (1 port)", |
" 0320 PC300/TE-M (2 ports)", |
" 0321 PC300/TE-M (1 port)", |
" 0400 PC400", |
"120f Essential Communications", |
" 0001 Roadrunner serial HIPPI", |
"1210 Hyperparallel Technologies", |
"1211 Braintech Inc", |
"1212 Kingston Technology Corp.", |
"1213 Applied Intelligent Systems, Inc.", |
"1214 Performance Technologies, Inc.", |
"1215 Interware Co., Ltd", |
"1216 Purup Prepress A/S", |
"1217 O2 Micro, Inc.", |
" 6729 OZ6729", |
" 673a OZ6730", |
" 6832 OZ6832/6833 CardBus Controller", |
" 6836 OZ6836/6860 CardBus Controller", |
" 6872 OZ6812 CardBus Controller", |
" 6925 OZ6922 CardBus Controller", |
" 6933 OZ6933/711E1 CardBus/SmartCardBus Controller", |
" 1025 1016 Travelmate 612 TX", |
" 6972 OZ601/6912/711E0 CardBus/SmartCardBus Controller", |
" 1014 020c ThinkPad R30", |
" 1179 0001 Magnia Z310", |
" 7110 OZ711Mx 4-in-1 MemoryCardBus Accelerator", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1734 106c Amilo A1645", |
" 7112 OZ711EC1/M1 SmartCardBus/MemoryCardBus Controller", |
" 7113 OZ711EC1 SmartCardBus Controller", |
" 7114 OZ711M1/MC1 4-in-1 MemoryCardBus Controller", |
" 7134 OZ711MP1/MS1 MemoryCardBus Controller", |
" 71e2 OZ711E2 SmartCardBus Controller", |
" 7212 OZ711M2 4-in-1 MemoryCardBus Controller", |
" 7213 OZ6933E CardBus Controller", |
" 7223 OZ711M3/MC3 4-in-1 MemoryCardBus Controller", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 7233 OZ711MP3/MS3 4-in-1 MemoryCardBus Controller", |
"1218 Hybricon Corp.", |
"1219 First Virtual Corporation", |
"121a 3Dfx Interactive, Inc.", |
" 0001 Voodoo", |
" 0002 Voodoo 2", |
" 0003 Voodoo Banshee", |
" 1092 0003 Monster Fusion", |
" 1092 4000 Monster Fusion", |
" 1092 4002 Monster Fusion", |
" 1092 4801 Monster Fusion AGP", |
" 1092 4803 Monster Fusion AGP", |
" 1092 8030 Monster Fusion", |
" 1092 8035 Monster Fusion AGP", |
" 10b0 0001 Dragon 4000", |
" 1102 1018 3D Blaster Banshee VE", |
" 121a 0001 Voodoo Banshee AGP", |
" 121a 0003 Voodoo Banshee AGP SGRAM", |
" 121a 0004 Voodoo Banshee", |
" 139c 0016 Raven", |
" 139c 0017 Raven", |
" 14af 0002 Maxi Gamer Phoenix", |
" 0004 Voodoo Banshee [Velocity 100]", |
" 0005 Voodoo 3", |
" 121a 0004 Voodoo3 AGP", |
" 121a 0030 Voodoo3 AGP", |
" 121a 0031 Voodoo3 AGP", |
" 121a 0034 Voodoo3 AGP", |
" 121a 0036 Voodoo3 2000 PCI", |
" 121a 0037 Voodoo3 AGP", |
" 121a 0038 Voodoo3 AGP", |
" 121a 003a Voodoo3 AGP", |
" 121a 0044 Voodoo3", |
" 121a 004b Velocity 100", |
" 121a 004c Velocity 200", |
" 121a 004d Voodoo3 AGP", |
" 121a 004e Voodoo3 AGP", |
" 121a 0051 Voodoo3 AGP", |
" 121a 0052 Voodoo3 AGP", |
" 121a 0057 Voodoo3 3000 PCI", |
" 121a 0060 Voodoo3 3500 TV (NTSC)", |
" 121a 0061 Voodoo3 3500 TV (PAL)", |
" 121a 0062 Voodoo3 3500 TV (SECAM)", |
" 0009 Voodoo 4 / Voodoo 5", |
" 121a 0003 Voodoo5 PCI 5500", |
" 121a 0009 Voodoo5 AGP 5500/6000", |
" 0057 Voodoo 3/3000 [Avenger]", |
"121b Advanced Telecommunications Modules", |
"121c Nippon Texaco., Ltd", |
"121d Lippert Automationstechnik GmbH", |
"121e CSPI", |
" 0201 Myrinet 2000 Scalable Cluster Interconnect", |
"121f Arcus Technology, Inc.", |
"1220 Ariel Corporation", |
" 1220 AMCC 5933 TMS320C80 DSP/Imaging board", |
"1221 Contec Co., Ltd", |
"1222 Ancor Communications, Inc.", |
"1223 Artesyn Communication Products", |
" 0003 PM/Link", |
" 0004 PM/T1", |
" 0005 PM/E1", |
" 0008 PM/SLS", |
" 0009 BajaSpan Resource Target", |
" 000a BajaSpan Section 0", |
" 000b BajaSpan Section 1", |
" 000c BajaSpan Section 2", |
" 000d BajaSpan Section 3", |
" 000e PM/PPC", |
"1224 Interactive Images", |
"1225 Power I/O, Inc.", |
"1227 Tech-Source", |
" 0006 Raptor GFX 8P", |
" 0023 Raptor GFX [1100T]", |
"1228 Norsk Elektro Optikk A/S", |
"1229 Data Kinesis Inc.", |
"122a Integrated Telecom", |
"122b LG Industrial Systems Co., Ltd", |
"122c Sican GmbH", |
"122d Aztech System Ltd", |
" 1206 368DSP", |
" 1400 Trident PCI288-Q3DII (NX)", |
" 50dc 3328 Audio", |
" 122d 0001 3328 Audio", |
" 80da 3328 Audio", |
" 122d 0001 3328 Audio", |
"122e Xyratex", |
"122f Andrew Corporation", |
"1230 Fishcamp Engineering", |
"1231 Woodward McCoach, Inc.", |
"1232 GPT Limited", |
"1233 Bus-Tech, Inc.", |
"1234 Technical Corp.", |
"1235 Risq Modular Systems, Inc.", |
"1236 Sigma Designs Corporation", |
" 0000 RealMagic64/GX", |
" 6401 REALmagic 64/GX (SD 6425)", |
"1237 Alta Technology Corporation", |
"1238 Adtran", |
"1239 3DO Company", |
"123a Visicom Laboratories, Inc.", |
"123b Seeq Technology, Inc.", |
"123c Century Systems, Inc.", |
"123d Engineering Design Team, Inc.", |
" 0000 EasyConnect 8/32", |
" 0002 EasyConnect 8/64", |
" 0003 EasyIO", |
"123e Simutech, Inc.", |
"123f C-Cube Microsystems", |
" 00e4 MPEG", |
" 8120 E4?", |
" 11bd 0006 DV500 E4", |
" 11bd 000a DV500 E4", |
" 11bd 000f DV500 E4", |
" 1809 0016 Emuzed MAUI-III PCI PVR FM TV", |
" 8888 Cinemaster C 3.0 DVD Decoder", |
" 1002 0001 Cinemaster C 3.0 DVD Decoder", |
" 1002 0002 Cinemaster C 3.0 DVD Decoder", |
" 1328 0001 Cinemaster C 3.0 DVD Decoder", |
"1240 Marathon Technologies Corp.", |
"1241 DSC Communications", |
"1242 JNI Corporation", |
" 1560 JNIC-1560 PCI-X Fibre Channel Controller", |
" 1242 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter", |
" 1242 656a FCX-6562 PCI-X Fibre Channel Adapter", |
" 4643 FCI-1063 Fibre Channel Adapter", |
" 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter", |
" 656a FCX-6562 PCI-X Fibre Channel Adapter", |
"1243 Delphax", |
"1244 AVM Audiovisuelles MKTG & Computer System GmbH", |
" 0700 B1 ISDN", |
" 0800 C4 ISDN", |
" 0a00 A1 ISDN [Fritz]", |
" 1244 0a00 FRITZ!Card ISDN Controller", |
" 0e00 Fritz!PCI v2.0 ISDN", |
" 1100 C2 ISDN", |
" 1200 T1 ISDN", |
" 2700 Fritz!Card DSL SL", |
" 2900 Fritz!Card DSL v2.0", |
"1245 A.P.D., S.A.", |
"1246 Dipix Technologies, Inc.", |
"1247 Xylon Research, Inc.", |
"1248 Central Data Corporation", |
"1249 Samsung Electronics Co., Ltd.", |
"124a AEG Electrocom GmbH", |
"124b SBS/Greenspring Modular I/O", |
" 0040 PCI-40A or cPCI-200 Quad IndustryPack carrier", |
" 124b 9080 PCI9080 Bridge", |
"124c Solitron Technologies, Inc.", |
"124d Stallion Technologies, Inc.", |
" 0000 EasyConnection 8/32", |
" 0002 EasyConnection 8/64", |
" 0003 EasyIO", |
" 0004 EasyConnection/RA", |
"124e Cylink", |
"124f Infortrend Technology, Inc.", |
" 0041 IFT-2000 Series RAID Controller", |
"1250 Hitachi Microcomputer System Ltd", |
"1251 VLSI Solutions Oy", |
"1253 Guzik Technical Enterprises", |
"1254 Linear Systems Ltd.", |
"1255 Optibase Ltd", |
" 1110 MPEG Forge", |
" 1210 MPEG Fusion", |
" 2110 VideoPlex", |
" 2120 VideoPlex CC", |
" 2130 VideoQuest", |
"1256 Perceptive Solutions, Inc.", |
" 4201 PCI-2220I", |
" 4401 PCI-2240I", |
" 5201 PCI-2000", |
"1257 Vertex Networks, Inc.", |
"1258 Gilbarco, Inc.", |
"1259 Allied Telesyn International", |
" 2560 AT-2560 Fast Ethernet Adapter (i82557B)", |
" a117 RTL81xx Fast Ethernet", |
" a120 21x4x DEC-Tulip compatible 10/100 Ethernet", |
"125a ABB Power Systems", |
"125b Asix Electronics Corporation", |
" 1400 ALFA GFC2204 Fast Ethernet", |
" 1186 1100 AX8814X Based PCI Fast Ethernet Adapter", |
"125c Aurora Technologies, Inc.", |
" 0101 Saturn 4520P", |
" 0640 Aries 16000P", |
"125d ESS Technology", |
" 0000 ES336H Fax Modem (Early Model)", |
" 1948 Solo?", |
" 1968 ES1968 Maestro 2", |
" 1028 0085 ES1968 Maestro-2 PCI", |
" 1033 8051 ES1968 Maestro-2 Audiodrive", |
" 1969 ES1969 Solo-1 Audiodrive", |
" 1014 0166 ES1969 SOLO-1 AudioDrive on IBM Aptiva Mainboard", |
" 125d 8888 Solo-1 Audio Adapter", |
" 153b 111b Terratec 128i PCI", |
" 1978 ES1978 Maestro 2E", |
" 0e11 b112 Armada M700/E500", |
" 1033 803c ES1978 Maestro-2E Audiodrive", |
" 1033 8058 ES1978 Maestro-2E Audiodrive", |
" 1092 4000 Monster Sound MX400", |
" 1179 0001 ES1978 Maestro-2E Audiodrive", |
" 1988 ES1988 Allegro-1", |
" 0e11 0098 Evo N600c", |
" 1092 4100 Sonic Impact S100", |
" 125d 1988 ESS Allegro-1 Audiodrive", |
" 1989 ESS Modem", |
" 125d 1989 ESS Modem", |
" 1998 ES1983S Maestro-3i PCI Audio Accelerator", |
" 1028 00b1 Latitude C600", |
" 1028 00e6 ES1983S Maestro-3i (Dell Inspiron 8100)", |
" 1999 ES1983S Maestro-3i PCI Modem Accelerator", |
" 199a ES1983S Maestro-3i PCI Audio Accelerator", |
" 199b ES1983S Maestro-3i PCI Modem Accelerator", |
" 2808 ES336H Fax Modem (Later Model)", |
" 2838 ES2838/2839 SuperLink Modem", |
" 2898 ES2898 Modem", |
" 125d 0424 ES56-PI Data Fax Modem", |
" 125d 0425 ES56T-PI Data Fax Modem", |
" 125d 0426 ES56V-PI Data Fax Modem", |
" 125d 0427 VW-PI Data Fax Modem", |
" 125d 0428 ES56ST-PI Data Fax Modem", |
" 125d 0429 ES56SV-PI Data Fax Modem", |
" 147a c001 ES56-PI Data Fax Modem", |
" 14fe 0428 ES56-PI Data Fax Modem", |
" 14fe 0429 ES56-PI Data Fax Modem", |
"125e Specialvideo Engineering SRL", |
"125f Concurrent Technologies, Inc.", |
"1260 Intersil Corporation", |
" 3872 Prism 2.5 Wavelan chipset", |
" 1468 0202 LAN-Express IEEE 802.11b Wireless LAN", |
" 3873 Prism 2.5 Wavelan chipset", |
" 1186 3501 DWL-520 Wireless PCI Adapter", |
" 1186 3700 DWL-520 Wireless PCI Adapter, Rev E1", |
" 1385 4105 MA311 802.11b wireless adapter", |
" 1668 0414 HWP01170-01 802.11b PCI Wireless Adapter", |
" 16a5 1601 AIR.mate PC-400 PCI Wireless LAN Adapter", |
" 1737 3874 WMP11 Wireless 802.11b PCI Adapter", |
" 8086 2513 Wireless 802.11b MiniPCI Adapter", |
" 3886 ISL3886 [Prism Javelin/Prism Xbow]", |
" 17cf 0037 XG-901 and clones Wireless Adapter", |
" 3890 ISL3890 [Prism GT/Prism Duette]/ISL3886 [Prism Javelin/Prism Xbow]", |
" 10b8 2802 SMC2802W Wireless PCI Adapter", |
" 10b8 2835 SMC2835W Wireless Cardbus Adapter", |
" 10b8 a835 SMC2835W V2 Wireless Cardbus Adapter", |
" 1113 4203 WN4201B", |
" 1113 ee03 SMC2802W V2 Wireless PCI Adapter [ISL3886]", |
" 1113 ee08 SMC2835W V3 EU Wireless Cardbus Adapter", |
" 1186 3202 DWL-G650 A1 Wireless Adapter", |
" 1259 c104 CG-WLCB54GT Wireless Adapter", |
" 1385 4800 WG511 Wireless Adapter", |
" 16a5 1605 ALLNET ALL0271 Wireless PCI Adapter", |
" 17cf 0014 XG-600 and clones Wireless Adapter", |
" 17cf 0020 XG-900 and clones Wireless Adapter", |
" 8130 HMP8130 NTSC/PAL Video Decoder", |
" 8131 HMP8131 NTSC/PAL Video Decoder", |
" ffff ISL3886IK", |
" 1260 0000 Senao 3054MP+ (J) mini-PCI WLAN 802.11g adapter", |
"1261 Matsushita-Kotobuki Electronics Industries, Ltd.", |
"1262 ES Computer Company, Ltd.", |
"1263 Sonic Solutions", |
"1264 Aval Nagasaki Corporation", |
"1265 Casio Computer Co., Ltd.", |
"1266 Microdyne Corporation", |
" 0001 NE10/100 Adapter (i82557B)", |
" 1910 NE2000Plus (RT8029) Ethernet Adapter", |
" 1266 1910 NE2000Plus Ethernet Adapter", |
"1267 S. A. Telecommunications", |
" 5352 PCR2101", |
" 5a4b Telsat Turbo", |
"1268 Tektronix", |
"1269 Thomson-CSF/TTM", |
"126a Lexmark International, Inc.", |
"126b Adax, Inc.", |
"126c Northern Telecom", |
" 1211 10/100BaseTX [RTL81xx]", |
" 126c 802.11b Wireless Ethernet Adapter", |
"126d Splash Technology, Inc.", |
"126e Sumitomo Metal Industries, Ltd.", |
"126f Silicon Motion, Inc.", |
" 0501 SM501 VoyagerGX Rev. AA", |
" 0510 SM501 VoyagerGX Rev. B", |
" 0710 SM710 LynxEM", |
" 0712 SM712 LynxEM+", |
" 0720 SM720 Lynx3DM", |
" 0730 SM731 Cougar3DR", |
" 0810 SM810 LynxE", |
" 0811 SM811 LynxE", |
" 0820 SM820 Lynx3D", |
" 0910 SM910", |
"1270 Olympus Optical Co., Ltd.", |
"1271 GW Instruments", |
"1272 Telematics International", |
"1273 Hughes Network Systems", |
" 0002 DirecPC", |
"1274 Ensoniq", |
" 1171 ES1373 [AudioPCI] (also Creative Labs CT5803)", |
" 1371 ES1371 [AudioPCI-97]", |
" 0e11 0024 AudioPCI on Motherboard Compaq Deskpro", |
" 0e11 b1a7 ES1371, ES1373 AudioPCI", |
" 1033 80ac ES1371, ES1373 AudioPCI", |
" 1042 1854 Tazer", |
" 107b 8054 Tabor2", |
" 1274 1371 Creative Sound Blaster AudioPCI64V, AudioPCI128", |
" 1274 8001 CT4751 board", |
" 1462 6470 ES1371, ES1373 AudioPCI On Motherboard MS-6147 1.1A", |
" 1462 6560 ES1371, ES1373 AudioPCI On Motherboard MS-6156 1.10", |
" 1462 6630 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 1.0A", |
" 1462 6631 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 1.0A", |
" 1462 6632 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 2.0A", |
" 1462 6633 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 2.0A", |
" 1462 6820 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00", |
" 1462 6822 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00A", |
" 1462 6830 ES1371, ES1373 AudioPCI On Motherboard MS-6183 1.00", |
" 1462 6880 ES1371, ES1373 AudioPCI On Motherboard MS-6188 1.00", |
" 1462 6900 ES1371, ES1373 AudioPCI On Motherboard MS-6190 1.00", |
" 1462 6910 ES1371, ES1373 AudioPCI On Motherboard MS-6191", |
" 1462 6930 ES1371, ES1373 AudioPCI On Motherboard MS-6193", |
" 1462 6990 ES1371, ES1373 AudioPCI On Motherboard MS-6199BX 2.0A", |
" 1462 6991 ES1371, ES1373 AudioPCI On Motherboard MS-6199VIA 2.0A", |
" 14a4 2077 ES1371, ES1373 AudioPCI On Motherboard KR639", |
" 14a4 2105 ES1371, ES1373 AudioPCI On Motherboard MR800", |
" 14a4 2107 ES1371, ES1373 AudioPCI On Motherboard MR801", |
" 14a4 2172 ES1371, ES1373 AudioPCI On Motherboard DR739", |
" 1509 9902 ES1371, ES1373 AudioPCI On Motherboard KW11", |
" 1509 9903 ES1371, ES1373 AudioPCI On Motherboard KW31", |
" 1509 9904 ES1371, ES1373 AudioPCI On Motherboard KA11", |
" 1509 9905 ES1371, ES1373 AudioPCI On Motherboard KC13", |
" 152d 8801 ES1371, ES1373 AudioPCI On Motherboard CP810E", |
" 152d 8802 ES1371, ES1373 AudioPCI On Motherboard CP810", |
" 152d 8803 ES1371, ES1373 AudioPCI On Motherboard P3810E", |
" 152d 8804 ES1371, ES1373 AudioPCI On Motherboard P3810-S", |
" 152d 8805 ES1371, ES1373 AudioPCI On Motherboard P3820-S", |
" 270f 2001 ES1371, ES1373 AudioPCI On Motherboard 6CTR", |
" 270f 2200 ES1371, ES1373 AudioPCI On Motherboard 6WTX", |
" 270f 3000 ES1371, ES1373 AudioPCI On Motherboard 6WSV", |
" 270f 3100 ES1371, ES1373 AudioPCI On Motherboard 6WIV2", |
" 270f 3102 ES1371, ES1373 AudioPCI On Motherboard 6WIV", |
" 270f 7060 ES1371, ES1373 AudioPCI On Motherboard 6ASA2", |
" 8086 4249 ES1371, ES1373 AudioPCI On Motherboard BI440ZX", |
" 8086 424c ES1371, ES1373 AudioPCI On Motherboard BL440ZX", |
" 8086 425a ES1371, ES1373 AudioPCI On Motherboard BZ440ZX", |
" 8086 4341 ES1371, ES1373 AudioPCI On Motherboard Cayman", |
" 8086 4343 ES1371, ES1373 AudioPCI On Motherboard Cape Cod", |
" 8086 4541 D815EEA Motherboard", |
" 8086 4649 ES1371, ES1373 AudioPCI On Motherboard Fire Island", |
" 8086 464a ES1371, ES1373 AudioPCI On Motherboard FJ440ZX", |
" 8086 4d4f ES1371, ES1373 AudioPCI On Motherboard Montreal", |
" 8086 4f43 ES1371, ES1373 AudioPCI On Motherboard OC440LX", |
" 8086 5243 ES1371, ES1373 AudioPCI On Motherboard RC440BX", |
" 8086 5352 ES1371, ES1373 AudioPCI On Motherboard SunRiver", |
" 8086 5643 ES1371, ES1373 AudioPCI On Motherboard Vancouver", |
" 8086 5753 ES1371, ES1373 AudioPCI On Motherboard WS440BX", |
" 5000 ES1370 [AudioPCI]", |
" 5880 5880 AudioPCI", |
" 1274 2000 Creative Sound Blaster AudioPCI128", |
" 1274 2003 Creative SoundBlaster AudioPCI 128", |
" 1274 5880 Creative Sound Blaster AudioPCI128", |
" 1274 8001 Sound Blaster 16PCI 4.1ch", |
" 1458 a000 5880 AudioPCI On Motherboard 6OXET", |
" 1462 6880 5880 AudioPCI On Motherboard MS-6188 1.00", |
" 270f 2001 5880 AudioPCI On Motherboard 6CTR", |
" 270f 2200 5880 AudioPCI On Motherboard 6WTX", |
" 270f 7040 5880 AudioPCI On Motherboard 6ATA4", |
"1275 Network Appliance Corporation", |
"1276 Switched Network Technologies, Inc.", |
"1277 Comstream", |
"1278 Transtech Parallel Systems Ltd.", |
" 0701 TPE3/TM3 PowerPC Node", |
" 0710 TPE5 PowerPC PCI board", |
"1279 Transmeta Corporation", |
" 0060 TM8000 Northbridge", |
" 0061 TM8000 AGP bridge", |
" 0295 Northbridge", |
" 0395 LongRun Northbridge", |
" 0396 SDRAM controller", |
" 0397 BIOS scratchpad", |
"127a Rockwell International", |
" 1002 HCF 56k Data/Fax Modem", |
" 1092 094c SupraExpress 56i PRO [Diamond SUP2380]", |
" 122d 4002 HPG / MDP3858-U", |
" 122d 4005 MDP3858-E", |
" 122d 4007 MDP3858-A/-NZ", |
" 122d 4012 MDP3858-SA", |
" 122d 4017 MDP3858-W", |
" 122d 4018 MDP3858-W", |
" 127a 1002 Rockwell 56K D/F HCF Modem", |
" 1003 HCF 56k Data/Fax Modem", |
" 0e11 b0bc 229-DF Zephyr", |
" 0e11 b114 229-DF Cheetah", |
" 1033 802b 229-DF", |
" 13df 1003 PCI56RX Modem", |
" 13e0 0117 IBM", |
" 13e0 0147 IBM F-1156IV+/R3 Spain V.90 Modem", |
" 13e0 0197 IBM", |
" 13e0 01c7 IBM F-1156IV+/R3 WW V.90 Modem", |
" 13e0 01f7 IBM", |
" 1436 1003 IBM", |
" 1436 1103 IBM 5614PM3G V.90 Modem", |
" 1436 1602 Compaq 229-DF Ducati", |
" 1004 HCF 56k Data/Fax/Voice Modem", |
" 1048 1500 MicroLink 56k Modem", |
" 10cf 1059 Fujitsu 229-DFRT", |
" 1005 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 1005 127a AOpen FM56-P", |
" 1033 8029 229-DFSV", |
" 1033 8054 Modem", |
" 10cf 103c Fujitsu", |
" 10cf 1055 Fujitsu 229-DFSV", |
" 10cf 1056 Fujitsu 229-DFSV", |
" 122d 4003 MDP3858SP-U", |
" 122d 4006 Packard Bell MDP3858V-E", |
" 122d 4008 MDP3858SP-A/SP-NZ", |
" 122d 4009 MDP3858SP-E", |
" 122d 4010 MDP3858V-U", |
" 122d 4011 MDP3858SP-SA", |
" 122d 4013 MDP3858V-A/V-NZ", |
" 122d 4015 MDP3858SP-W", |
" 122d 4016 MDP3858V-W", |
" 122d 4019 MDP3858V-SA", |
" 13df 1005 PCI56RVP Modem", |
" 13e0 0187 IBM", |
" 13e0 01a7 IBM", |
" 13e0 01b7 IBM DF-1156IV+/R3 Spain V.90 Modem", |
" 13e0 01d7 IBM DF-1156IV+/R3 WW V.90 Modem", |
" 1436 1005 IBM", |
" 1436 1105 IBM", |
" 1437 1105 IBM 5614PS3G V.90 Modem", |
" 1022 HCF 56k Modem", |
" 1436 1303 M3-5614PM3G V.90 Modem", |
" 1023 HCF 56k Data/Fax Modem", |
" 122d 4020 Packard Bell MDP3858-WE", |
" 122d 4023 MDP3858-UE", |
" 13e0 0247 IBM F-1156IV+/R6 Spain V.90 Modem", |
" 13e0 0297 IBM", |
" 13e0 02c7 IBM F-1156IV+/R6 WW V.90 Modem", |
" 1436 1203 IBM", |
" 1436 1303 IBM", |
" 1024 HCF 56k Data/Fax/Voice Modem", |
" 1025 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 10cf 106a Fujitsu 235-DFSV", |
" 122d 4021 Packard Bell MDP3858V-WE", |
" 122d 4022 MDP3858SP-WE", |
" 122d 4024 MDP3858V-UE", |
" 122d 4025 MDP3858SP-UE", |
" 1026 HCF 56k PCI Speakerphone Modem", |
" 1032 HCF 56k Modem", |
" 1033 HCF 56k Modem", |
" 1034 HCF 56k Modem", |
" 1035 HCF 56k PCI Speakerphone Modem", |
" 1036 HCF 56k Modem", |
" 1085 HCF 56k Volcano PCI Modem", |
" 2005 HCF 56k Data/Fax Modem", |
" 104d 8044 229-DFSV", |
" 104d 8045 229-DFSV", |
" 104d 8055 PBE/Aztech 235W-DFSV", |
" 104d 8056 235-DFSV", |
" 104d 805a Modem", |
" 104d 805f Modem", |
" 104d 8074 Modem", |
" 2013 HSF 56k Data/Fax Modem", |
" 1179 0001 Modem", |
" 1179 ff00 Modem", |
" 2014 HSF 56k Data/Fax/Voice Modem", |
" 10cf 1057 Fujitsu Citicorp III", |
" 122d 4050 MSP3880-U", |
" 122d 4055 MSP3880-W", |
" 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 10cf 1063 Fujitsu", |
" 10cf 1064 Fujitsu", |
" 1468 2015 Fujitsu", |
" 2016 HSF 56k Data/Fax/Voice/Spkp Modem", |
" 122d 4051 MSP3880V-W", |
" 122d 4052 MSP3880SP-W", |
" 122d 4054 MSP3880V-U", |
" 122d 4056 MSP3880SP-U", |
" 122d 4057 MSP3880SP-A", |
" 4311 Riptide HSF 56k PCI Modem", |
" 127a 4311 Ring Modular? Riptide HSF RT HP Dom", |
" 13e0 0210 HP-GVC", |
" 4320 Riptide PCI Audio Controller", |
" 1235 4320 Riptide PCI Audio Controller", |
" 4321 Riptide HCF 56k PCI Modem", |
" 1235 4321 Hewlett Packard DF", |
" 1235 4324 Hewlett Packard DF", |
" 13e0 0210 Hewlett Packard DF", |
" 144d 2321 Riptide", |
" 4322 Riptide PCI Game Controller", |
" 1235 4322 Riptide PCI Game Controller", |
" 8234 RapidFire 616X ATM155 Adapter", |
" 108d 0022 RapidFire 616X ATM155 Adapter", |
" 108d 0027 RapidFire 616X ATM155 Adapter", |
"127b Pixera Corporation", |
"127c Crosspoint Solutions, Inc.", |
"127d Vela Research", |
"127e Winnov, L.P.", |
"127f Fujifilm", |
"1280 Photoscript Group Ltd.", |
"1281 Yokogawa Electric Corporation", |
"1282 Davicom Semiconductor, Inc.", |
" 9009 Ethernet 100/10 MBit", |
" 9100 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" 9102 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" 9132 Ethernet 100/10 MBit", |
"1283 Integrated Technology Express, Inc.", |
" 673a IT8330G", |
" 8211 ITE 8211F Single Channel UDMA 133 (ASUS 8211 (ITE IT8212 ATA RAID Controller))", |
" 1043 8138 P5GD1-VW Mainboard", |
" 8212 IT/ITE8212 Dual channel ATA RAID controller (PCI version seems to be IT8212, embedded seems to be ITE8212)", |
" 1283 0001 IT/ITE8212 Dual channel ATA RAID controller", |
" 8330 IT8330G", |
" 8872 IT8874F PCI Dual Serial Port Controller", |
" 8888 IT8888F PCI to ISA Bridge with SMB", |
" 8889 IT8889F PCI to ISA Bridge", |
" e886 IT8330G", |
"1284 Sahara Networks, Inc.", |
"1285 Platform Technologies, Inc.", |
" 0100 AGOGO sound chip (aka ESS Maestro 1)", |
"1286 Mazet GmbH", |
"1287 M-Pact, Inc.", |
" 001e LS220D DVD Decoder", |
" 001f LS220C DVD Decoder", |
"1288 Timestep Corporation", |
"1289 AVC Technology, Inc.", |
"128a Asante Technologies, Inc.", |
"128b Transwitch Corporation", |
"128c Retix Corporation", |
"128d G2 Networks, Inc.", |
" 0021 ATM155 Adapter", |
"128e Hoontech Corporation/Samho Multi Tech Ltd.", |
" 0008 ST128 WSS/SB", |
" 0009 ST128 SAM9407", |
" 000a ST128 Game Port", |
" 000b ST128 MPU Port", |
" 000c ST128 Ctrl Port", |
"128f Tateno Dennou, Inc.", |
"1290 Sord Computer Corporation", |
"1291 NCS Computer Italia", |
"1292 Tritech Microelectronics Inc", |
"1293 Media Reality Technology", |
"1294 Rhetorex, Inc.", |
"1295 Imagenation Corporation", |
"1296 Kofax Image Products", |
"1297 Holco Enterprise Co, Ltd/Shuttle Computer", |
"1298 Spellcaster Telecommunications Inc.", |
"1299 Knowledge Technology Lab.", |
"129a VMetro, inc.", |
" 0615 PBT-615 PCI-X Bus Analyzer", |
"129b Image Access", |
"129c Jaycor", |
"129d Compcore Multimedia, Inc.", |
"129e Victor Company of Japan, Ltd.", |
"129f OEC Medical Systems, Inc.", |
"12a0 Allen-Bradley Company", |
"12a1 Simpact Associates, Inc.", |
"12a2 Newgen Systems Corporation", |
"12a3 Lucent Technologies", |
" 8105 T8105 H100 Digital Switch", |
"12a4 NTT Electronics Technology Company", |
"12a5 Vision Dynamics Ltd.", |
"12a6 Scalable Networks, Inc.", |
"12a7 AMO GmbH", |
"12a8 News Datacom", |
"12a9 Xiotech Corporation", |
"12aa SDL Communications, Inc.", |
"12ab Yuan Yuan Enterprise Co., Ltd.", |
" 0002 AU8830 [Vortex2] Based Sound Card With A3D Support", |
" 3000 MPG-200C PCI DVD Decoder Card", |
"12ac Measurex Corporation", |
"12ad Multidata GmbH", |
"12ae Alteon Networks Inc.", |
" 0001 AceNIC Gigabit Ethernet", |
" 1014 0104 Gigabit Ethernet-SX PCI Adapter", |
" 12ae 0001 Gigabit Ethernet-SX (Universal)", |
" 1410 0104 Gigabit Ethernet-SX PCI Adapter", |
" 0002 AceNIC Gigabit Ethernet (Copper)", |
" 10a9 8002 Acenic Gigabit Ethernet", |
" 12ae 0002 Gigabit Ethernet-T (3C986-T)", |
" 00fa Farallon PN9100-T Gigabit Ethernet", |
"12af TDK USA Corp", |
"12b0 Jorge Scientific Corp", |
"12b1 GammaLink", |
"12b2 General Signal Networks", |
"12b3 Inter-Face Co Ltd", |
"12b4 FutureTel Inc", |
"12b5 Granite Systems Inc.", |
"12b6 Natural Microsystems", |
"12b7 Cognex Modular Vision Systems Div. - Acumen Inc.", |
"12b8 Korg", |
"12b9 3Com Corp, Modem Division", |
" 1006 WinModem", |
" 12b9 005c USR 56k Internal Voice WinModem (Model 3472)", |
" 12b9 005e USR 56k Internal WinModem (Models 662975)", |
" 12b9 0062 USR 56k Internal Voice WinModem (Model 662978)", |
" 12b9 0068 USR 56k Internal Voice WinModem (Model 5690)", |
" 12b9 007a USR 56k Internal Voice WinModem (Model 662974)", |
" 12b9 007f USR 56k Internal WinModem (Models 5698, 5699)", |
" 12b9 0080 USR 56k Internal WinModem (Models 2975, 3528)", |
" 12b9 0081 USR 56k Internal Voice WinModem (Models 2974, 3529)", |
" 12b9 0091 USR 56k Internal Voice WinModem (Model 2978)", |
" 1007 USR 56k Internal WinModem", |
" 12b9 00a3 USR 56k Internal WinModem (Model 3595)", |
" 1008 56K FaxModem Model 5610", |
" 12b9 00a2 USR 56k Internal FAX Modem (Model 2977)", |
" 12b9 00aa USR 56k Internal Voice Modem (Model 2976)", |
" 12b9 00ab USR 56k Internal Voice Modem (Model 5609)", |
" 12b9 00ac USR 56k Internal Voice Modem (Model 3298)", |
" 12b9 00ad USR 56k Internal FAX Modem (Model 5610)", |
"12ba BittWare, Inc.", |
"12bb Nippon Unisoft Corporation", |
"12bc Array Microsystems", |
"12bd Computerm Corp.", |
"12be Anchor Chips Inc.", |
" 3041 AN3041Q CO-MEM", |
" 3042 AN3042Q CO-MEM Lite", |
" 12be 3042 Anchor Chips Lite Evaluation Board", |
"12bf Fujifilm Microdevices", |
"12c0 Infimed", |
"12c1 GMM Research Corp", |
"12c2 Mentec Limited", |
"12c3 Holtek Microelectronics Inc", |
" 0058 PCI NE2K Ethernet", |
" 5598 PCI NE2K Ethernet", |
"12c4 Connect Tech Inc", |
" 0001 Blue HEAT/PCI 8 (RS232/CL/RJ11)", |
" 0002 Blue HEAT/PCI 4 (RS232)", |
" 0003 Blue HEAT/PCI 2 (RS232)", |
" 0004 Blue HEAT/PCI 8 (UNIV, RS485)", |
" 0005 Blue HEAT/PCI 4+4/6+2 (UNIV, RS232/485)", |
" 0006 Blue HEAT/PCI 4 (OPTO, RS485)", |
" 0007 Blue HEAT/PCI 2+2 (RS232/485)", |
" 0008 Blue HEAT/PCI 2 (OPTO, Tx, RS485)", |
" 0009 Blue HEAT/PCI 2+6 (RS232/485)", |
" 000a Blue HEAT/PCI 8 (Tx, RS485)", |
" 000b Blue HEAT/PCI 4 (Tx, RS485)", |
" 000c Blue HEAT/PCI 2 (20 MHz, RS485)", |
" 000d Blue HEAT/PCI 2 PTM", |
" 0100 NT960/PCI", |
" 0201 cPCI Titan - 2 Port", |
" 0202 cPCI Titan - 4 Port", |
" 0300 CTI PCI UART 2 (RS232)", |
" 0301 CTI PCI UART 4 (RS232)", |
" 0302 CTI PCI UART 8 (RS232)", |
" 0310 CTI PCI UART 1+1 (RS232/485)", |
" 0311 CTI PCI UART 2+2 (RS232/485)", |
" 0312 CTI PCI UART 4+4 (RS232/485)", |
" 0320 CTI PCI UART 2", |
" 0321 CTI PCI UART 4", |
" 0322 CTI PCI UART 8", |
" 0330 CTI PCI UART 2 (RS485)", |
" 0331 CTI PCI UART 4 (RS485)", |
" 0332 CTI PCI UART 8 (RS485)", |
"12c5 Picture Elements Incorporated", |
" 007e Imaging/Scanning Subsystem Engine", |
" 007f Imaging/Scanning Subsystem Engine", |
" 0081 PCIVST [Grayscale Thresholding Engine]", |
" 0085 Video Simulator/Sender", |
" 0086 THR2 Multi-scale Thresholder", |
"12c6 Mitani Corporation", |
"12c7 Dialogic Corp", |
"12c8 G Force Co, Ltd", |
"12c9 Gigi Operations", |
"12ca Integrated Computing Engines", |
"12cb Antex Electronics Corporation", |
"12cc Pluto Technologies International", |
"12cd Aims Lab", |
"12ce Netspeed Inc.", |
"12cf Prophet Systems, Inc.", |
"12d0 GDE Systems, Inc.", |
"12d1 PSITech", |
"12d2 NVidia / SGS Thomson (Joint Venture)", |
" 0008 NV1", |
" 0009 DAC64", |
" 0018 Riva128", |
" 1048 0c10 VICTORY Erazor", |
" 107b 8030 STB Velocity 128", |
" 1092 0350 Viper V330", |
" 1092 1092 Viper V330", |
" 10b4 1b1b STB Velocity 128", |
" 10b4 1b1d STB Velocity 128", |
" 10b4 1b1e STB Velocity 128, PAL TV-Out", |
" 10b4 1b20 STB Velocity 128 Sapphire", |
" 10b4 1b21 STB Velocity 128", |
" 10b4 1b22 STB Velocity 128 AGP, NTSC TV-Out", |
" 10b4 1b23 STB Velocity 128 AGP, PAL TV-Out", |
" 10b4 1b27 STB Velocity 128 DVD", |
" 10b4 1b88 MVP Pro 128", |
" 10b4 222a STB Velocity 128 AGP", |
" 10b4 2230 STB Velocity 128", |
" 10b4 2232 STB Velocity 128", |
" 10b4 2235 STB Velocity 128 AGP", |
" 2a15 54a3 3DVision-SAGP / 3DexPlorer 3000", |
" 0019 Riva128ZX", |
" 0020 TNT", |
" 0028 TNT2", |
" 0029 UTNT2", |
" 002c VTNT2", |
" 00a0 ITNT2", |
"12d3 Vingmed Sound A/S", |
"12d4 Ulticom (Formerly DGM&S)", |
" 0200 T1 Card", |
"12d5 Equator Technologies Inc", |
" 0003 BSP16", |
" 1000 BSP15", |
"12d6 Analogic Corp", |
"12d7 Biotronic SRL", |
"12d8 Pericom Semiconductor", |
" 8150 PCI to PCI Bridge", |
"12d9 Aculab PLC", |
" 0002 PCI Prosody", |
" 0004 cPCI Prosody", |
" 0005 Aculab E1/T1 PCI card", |
" 1078 Prosody X class e1000 device", |
" 12d9 000d Prosody X PCI", |
"12da True Time Inc.", |
"12db Annapolis Micro Systems, Inc", |
"12dc Symicron Computer Communication Ltd.", |
"12dd Management Graphics", |
"12de Rainbow Technologies", |
" 0200 CryptoSwift CS200", |
"12df SBS Technologies Inc", |
"12e0 Chase Research", |
" 0010 ST16C654 Quad UART", |
" 0020 ST16C654 Quad UART", |
" 0030 ST16C654 Quad UART", |
"12e1 Nintendo Co, Ltd", |
"12e2 Datum Inc. Bancomm-Timing Division", |
"12e3 Imation Corp - Medical Imaging Systems", |
"12e4 Brooktrout Technology Inc", |
"12e5 Apex Semiconductor Inc", |
"12e6 Cirel Systems", |
"12e7 Sunsgroup Corporation", |
"12e8 Crisc Corp", |
"12e9 GE Spacenet", |
"12ea Zuken", |
"12eb Aureal Semiconductor", |
" 0001 Vortex 1", |
" 104d 8036 AU8820 Vortex Digital Audio Processor", |
" 1092 2000 Sonic Impact A3D", |
" 1092 2100 Sonic Impact A3D", |
" 1092 2110 Sonic Impact A3D", |
" 1092 2200 Sonic Impact A3D", |
" 122d 1002 AU8820 Vortex Digital Audio Processor", |
" 12eb 0001 AU8820 Vortex Digital Audio Processor", |
" 5053 3355 Montego", |
" 0002 Vortex 2", |
" 104d 8049 AU8830 Vortex 3D Digital Audio Processor", |
" 104d 807b AU8830 Vortex 3D Digital Audio Processor", |
" 1092 3000 Monster Sound II", |
" 1092 3001 Monster Sound II", |
" 1092 3002 Monster Sound II", |
" 1092 3003 Monster Sound II", |
" 1092 3004 Monster Sound II", |
" 12eb 0002 AU8830 Vortex 3D Digital Audio Processor", |
" 12eb 0088 AU8830 Vortex 3D Digital Audio Processor", |
" 144d 3510 AU8830 Vortex 3D Digital Audio Processor", |
" 5053 3356 Montego II", |
" 0003 AU8810 Vortex Digital Audio Processor", |
" 104d 8049 AU8810 Vortex Digital Audio Processor", |
" 104d 8077 AU8810 Vortex Digital Audio Processor", |
" 109f 1000 AU8810 Vortex Digital Audio Processor", |
" 12eb 0003 AU8810 Vortex Digital Audio Processor", |
" 1462 6780 AU8810 Vortex Digital Audio Processor", |
" 14a4 2073 AU8810 Vortex Digital Audio Processor", |
" 14a4 2091 AU8810 Vortex Digital Audio Processor", |
" 14a4 2104 AU8810 Vortex Digital Audio Processor", |
" 14a4 2106 AU8810 Vortex Digital Audio Processor", |
" 8803 Vortex 56k Software Modem", |
" 12eb 8803 Vortex 56k Software Modem", |
"12ec 3A International, Inc.", |
"12ed Optivision Inc.", |
"12ee Orange Micro", |
"12ef Vienna Systems", |
"12f0 Pentek", |
"12f1 Sorenson Vision Inc", |
"12f2 Gammagraphx, Inc.", |
"12f3 Radstone Technology", |
"12f4 Megatel", |
"12f5 Forks", |
"12f6 Dawson France", |
"12f7 Cognex", |
"12f8 Electronic Design GmbH", |
" 0002 VideoMaker", |
"12f9 Four Fold Ltd", |
"12fb Spectrum Signal Processing", |
" 0001 PMC-MAI", |
" 00f5 F5 Dakar", |
" 02ad PMC-2MAI", |
" 2adc ePMC-2ADC", |
" 3100 PRO-3100", |
" 3500 PRO-3500", |
" 4d4f Modena", |
" 8120 ePMC-8120", |
" da62 Daytona C6201 PCI (Hurricane)", |
" db62 Ingliston XBIF", |
" dc62 Ingliston PLX9054", |
" dd62 Ingliston JTAG/ISP", |
" eddc ePMC-MSDDC", |
" fa01 ePMC-FPGA", |
"12fc Capital Equipment Corp", |
"12fd I2S", |
"12fe ESD Electronic System Design GmbH", |
"12ff Lexicon", |
"1300 Harman International Industries Inc", |
"1302 Computer Sciences Corp", |
"1303 Innovative Integration", |
"1304 Juniper Networks", |
"1305 Netphone, Inc", |
"1306 Duet Technologies", |
"1307 Measurement Computing", |
" 0001 PCI-DAS1602/16", |
" 000b PCI-DIO48H", |
" 000c PCI-PDISO8", |
" 000d PCI-PDISO16", |
" 000f PCI-DAS1200", |
" 0010 PCI-DAS1602/12", |
" 0014 PCI-DIO24H", |
" 0015 PCI-DIO24H/CTR3", |
" 0016 PCI-DIO48H/CTR15", |
" 0017 PCI-DIO96H", |
" 0018 PCI-CTR05", |
" 0019 PCI-DAS1200/JR", |
" 001a PCI-DAS1001", |
" 001b PCI-DAS1002", |
" 001c PCI-DAS1602JR/16", |
" 001d PCI-DAS6402/16", |
" 001e PCI-DAS6402/12", |
" 001f PCI-DAS16/M1", |
" 0020 PCI-DDA02/12", |
" 0021 PCI-DDA04/12", |
" 0022 PCI-DDA08/12", |
" 0023 PCI-DDA02/16", |
" 0024 PCI-DDA04/16", |
" 0025 PCI-DDA08/16", |
" 0026 PCI-DAC04/12-HS", |
" 0027 PCI-DAC04/16-HS", |
" 0028 PCI-DIO24", |
" 0029 PCI-DAS08", |
" 002c PCI-INT32", |
" 0033 PCI-DUAL-AC5", |
" 0034 PCI-DAS-TC", |
" 0035 PCI-DAS64/M1/16", |
" 0036 PCI-DAS64/M2/16", |
" 0037 PCI-DAS64/M3/16", |
" 004c PCI-DAS1000", |
" 004d PCI-QUAD04", |
" 0052 PCI-DAS4020/12", |
" 0054 PCI-DIO96", |
" 005e PCI-DAS6025", |
"1308 Jato Technologies Inc.", |
" 0001 NetCelerator Adapter", |
" 1308 0001 NetCelerator Adapter", |
"1309 AB Semiconductor Ltd", |
"130a Mitsubishi Electric Microcomputer", |
"130b Colorgraphic Communications Corp", |
"130c Ambex Technologies, Inc", |
"130d Accelerix Inc", |
"130e Yamatake-Honeywell Co. Ltd", |
"130f Advanet Inc", |
"1310 Gespac", |
"1311 Videoserver, Inc", |
"1312 Acuity Imaging, Inc", |
"1313 Yaskawa Electric Co.", |
"1316 Teradyne Inc", |
"1317 Linksys", |
" 0981 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" 0985 NC100 Network Everywhere Fast Ethernet 10/100", |
" 1734 100c Scenic N300 ADMtek AN983 10/100 Mbps PCI Adapter", |
" 1985 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" 2850 HSP MicroModem 56", |
" 5120 ADMtek ADM5120 OpenGate System-on-Chip", |
" 8201 ADMtek ADM8211 802.11b Wireless Interface", |
" 10b8 2635 SMC2635W 802.11b (11Mbps) wireless lan pcmcia (cardbus) card", |
" 1317 8201 SMC2635W 802.11b (11mbps) wireless lan pcmcia (cardbus) card", |
" 8211 ADMtek ADM8211 802.11b Wireless Interface", |
" 9511 21x4x DEC-Tulip compatible 10/100 Ethernet", |
"1318 Packet Engines Inc.", |
" 0911 GNIC-II PCI Gigabit Ethernet [Hamachi]", |
"1319 Fortemedia, Inc", |
" 0801 Xwave QS3000A [FM801]", |
" 1319 1319 FM801 PCI Audio", |
" 0802 Xwave QS3000A [FM801 game port]", |
" 1319 1319 FM801 PCI Joystick", |
" 1000 FM801 PCI Audio", |
" 1001 FM801 PCI Joystick", |
"131a Finisar Corp.", |
"131c Nippon Electro-Sensory Devices Corp", |
"131d Sysmic, Inc.", |
"131e Xinex Networks Inc", |
"131f Siig Inc", |
" 1000 CyberSerial (1-port) 16550", |
" 1001 CyberSerial (1-port) 16650", |
" 1002 CyberSerial (1-port) 16850", |
" 1010 Duet 1S(16550)+1P", |
" 1011 Duet 1S(16650)+1P", |
" 1012 Duet 1S(16850)+1P", |
" 1020 CyberParallel (1-port)", |
" 1021 CyberParallel (2-port)", |
" 1030 CyberSerial (2-port) 16550", |
" 1031 CyberSerial (2-port) 16650", |
" 1032 CyberSerial (2-port) 16850", |
" 1034 Trio 2S(16550)+1P", |
" 1035 Trio 2S(16650)+1P", |
" 1036 Trio 2S(16850)+1P", |
" 1050 CyberSerial (4-port) 16550", |
" 1051 CyberSerial (4-port) 16650", |
" 1052 CyberSerial (4-port) 16850", |
" 2000 CyberSerial (1-port) 16550", |
" 2001 CyberSerial (1-port) 16650", |
" 2002 CyberSerial (1-port) 16850", |
" 2010 Duet 1S(16550)+1P", |
" 2011 Duet 1S(16650)+1P", |
" 2012 Duet 1S(16850)+1P", |
" 2020 CyberParallel (1-port)", |
" 2021 CyberParallel (2-port)", |
" 2030 CyberSerial (2-port) 16550", |
" 131f 2030 PCI Serial Card", |
" 2031 CyberSerial (2-port) 16650", |
" 2032 CyberSerial (2-port) 16850", |
" 2040 Trio 1S(16550)+2P", |
" 2041 Trio 1S(16650)+2P", |
" 2042 Trio 1S(16850)+2P", |
" 2050 CyberSerial (4-port) 16550", |
" 2051 CyberSerial (4-port) 16650", |
" 2052 CyberSerial (4-port) 16850", |
" 2060 Trio 2S(16550)+1P", |
" 2061 Trio 2S(16650)+1P", |
" 2062 Trio 2S(16850)+1P", |
" 2081 CyberSerial (8-port) ST16654", |
"1320 Crypto AG", |
"1321 Arcobel Graphics BV", |
"1322 MTT Co., Ltd", |
"1323 Dome Inc", |
"1324 Sphere Communications", |
"1325 Salix Technologies, Inc", |
"1326 Seachange international", |
"1327 Voss scientific", |
"1328 quadrant international", |
"1329 Productivity Enhancement", |
"132a Microcom Inc.", |
"132b Broadband Technologies", |
"132c Micrel Inc", |
"132d Integrated Silicon Solution, Inc.", |
"1330 MMC Networks", |
"1331 Radisys Corp.", |
" 0030 ENP-2611", |
" 8200 82600 Host Bridge", |
" 8201 82600 IDE", |
" 8202 82600 USB", |
" 8210 82600 PCI Bridge", |
"1332 Micro Memory", |
" 5415 MM-5415CN PCI Memory Module with Battery Backup", |
" 5425 MM-5425CN PCI 64/66 Memory Module with Battery Backup", |
" 6140 MM-6140D", |
"1334 Redcreek Communications, Inc", |
"1335 Videomail, Inc", |
"1337 Third Planet Publishing", |
"1338 BT Electronics", |
"133a Vtel Corp", |
"133b Softcom Microsystems", |
"133c Holontech Corp", |
"133d SS Technologies", |
"133e Virtual Computer Corp", |
"133f SCM Microsystems", |
"1340 Atalla Corp", |
"1341 Kyoto Microcomputer Co", |
"1342 Promax Systems Inc", |
"1343 Phylon Communications Inc", |
"1344 Crucial Technology", |
"1345 Arescom Inc", |
"1347 Odetics", |
"1349 Sumitomo Electric Industries, Ltd.", |
"134a DTC Technology Corp.", |
" 0001 Domex 536", |
" 0002 Domex DMX3194UP SCSI Adapter", |
"134b ARK Research Corp.", |
"134c Chori Joho System Co. Ltd", |
"134d PCTel Inc", |
" 2189 HSP56 MicroModem", |
" 2486 2304WT V.92 MDC Modem", |
" 7890 HSP MicroModem 56", |
" 134d 0001 PCT789 adapter", |
" 7891 HSP MicroModem 56", |
" 134d 0001 HSP MicroModem 56", |
" 7892 HSP MicroModem 56", |
" 7893 HSP MicroModem 56", |
" 7894 HSP MicroModem 56", |
" 7895 HSP MicroModem 56", |
" 7896 HSP MicroModem 56", |
" 7897 HSP MicroModem 56", |
"134e CSTI", |
"134f Algo System Co Ltd", |
"1350 Systec Co. Ltd", |
"1351 Sonix Inc", |
"1353 Thales Idatys", |
" 0002 Proserver", |
" 0003 PCI-FUT", |
" 0004 PCI-S0", |
" 0005 PCI-FUT-S0", |
"1354 Dwave System Inc", |
"1355 Kratos Analytical Ltd", |
"1356 The Logical Co", |
"1359 Prisa Networks", |
"135a Brain Boxes", |
"135b Giganet Inc", |
"135c Quatech Inc", |
" 0010 QSC-100", |
" 0020 DSC-100", |
" 0030 DSC-200/300", |
" 0040 QSC-200/300", |
" 0050 ESC-100D", |
" 0060 ESC-100M", |
" 00f0 MPAC-100 Syncronous Serial Card (Zilog 85230)", |
" 0170 QSCLP-100", |
" 0180 DSCLP-100", |
" 0190 SSCLP-100", |
" 01a0 QSCLP-200/300", |
" 01b0 DSCLP-200/300", |
" 01c0 SSCLP-200/300", |
"135d ABB Network Partner AB", |
"135e Sealevel Systems Inc", |
" 5101 Route 56.PCI - Multi-Protocol Serial Interface (Zilog Z16C32)", |
" 7101 Single Port RS-232/422/485/530", |
" 7201 Dual Port RS-232/422/485 Interface", |
" 7202 Dual Port RS-232 Interface", |
" 7401 Four Port RS-232 Interface", |
" 7402 Four Port RS-422/485 Interface", |
" 7801 Eight Port RS-232 Interface", |
" 7804 Eight Port RS-232/422/485 Interface", |
" 8001 8001 Digital I/O Adapter", |
"135f I-Data International A-S", |
"1360 Meinberg Funkuhren", |
" 0101 PCI32 DCF77 Radio Clock", |
" 0102 PCI509 DCF77 Radio Clock", |
" 0103 PCI510 DCF77 Radio Clock", |
" 0104 PCI511 DCF77 Radio Clock", |
" 0201 GPS167PCI GPS Receiver", |
" 0202 GPS168PCI GPS Receiver", |
" 0203 GPS169PCI GPS Receiver", |
" 0204 GPS170PCI GPS Receiver", |
" 0301 TCR510PCI IRIG Timecode Reader", |
" 0302 TCR167PCI IRIG Timecode Reader", |
"1361 Soliton Systems K.K.", |
"1362 Fujifacom Corporation", |
"1363 Phoenix Technology Ltd", |
"1364 ATM Communications Inc", |
"1365 Hypercope GmbH", |
"1366 Teijin Seiki Co. Ltd", |
"1367 Hitachi Zosen Corporation", |
"1368 Skyware Corporation", |
"1369 Digigram", |
"136a High Soft Tech", |
"136b Kawasaki Steel Corporation", |
" ff01 KL5A72002 Motion JPEG", |
"136c Adtek System Science Co Ltd", |
"136d Gigalabs Inc", |
"136f Applied Magic Inc", |
"1370 ATL Products", |
"1371 CNet Technology Inc", |
" 434e GigaCard Network Adapter", |
" 1371 434e N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L)", |
"1373 Silicon Vision Inc", |
"1374 Silicom Ltd.", |
" 0024 Silicom Dual port Giga Ethernet BGE Bypass Server Adapter", |
" 0025 Silicom Quad port Giga Ethernet BGE Bypass Server Adapter", |
" 0026 Silicom Dual port Fiber Giga Ethernet 546 Bypass Server Adapter", |
" 0027 Silicom Dual port Fiber LX Giga Ethernet 546 Bypass Server Adapter", |
" 0029 Silicom Dual port Copper Giga Ethernet 546GB Bypass Server Adapter", |
" 002a Silicom Dual port Fiber Giga Ethernet 546 TAP/Bypass Server Adapter", |
" 002b Silicom Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter (PXE2TBI)", |
" 002c Silicom Quad port Copper Giga Ethernet 546GB Bypass Server Adapter (PXG4BPI)", |
" 002d Silicom Quad port Fiber-SX Giga Ethernet 546GB Bypass Server Adapter (PXG4BPFI)", |
" 002e Silicom Quad port Fiber-LX Giga Ethernet 546GB Bypass Server Adapter (PXG4BPFI-LX)", |
" 002f Silicom Dual port Fiber-SX Giga Ethernet 546GB Low profile Bypass Server Adapter (PXG2BPFIL)", |
" 0030 Silicom Dual port Fiber-LX Giga Ethernet 546GB Low profile Bypass Server Adapter", |
" 0031 Silicom Quad port Copper Giga Ethernet PCI-E Bypass Server Adapter", |
" 0032 Silicom Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter", |
" 0034 Silicom Dual port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter", |
" 0035 Silicom Quad port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter", |
" 0036 Silicom Dual port Fiber Giga Ethernet PCI-E BGE Bypass Server Adapter", |
" 0037 Silicom Quad port Copper Ethernet PCI-E Intel based Bypass Server Adapter", |
" 0038 Silicom Quad port Copper Ethernet PCI-E Intel based Bypass Server Adapter", |
" 0039 Silicom Dual port Fiber-SX Ethernet PCI-E Intel based Bypass Server Adapter", |
" 003a Silicom Dual port Fiber-LX Ethernet PCI-E Intel based Bypass Server Adapter", |
"1375 Argosystems Inc", |
"1376 LMC", |
"1377 Electronic Equipment Production & Distribution GmbH", |
"1378 Telemann Co. Ltd", |
"1379 Asahi Kasei Microsystems Co Ltd", |
"137a Mark of the Unicorn Inc", |
" 0001 PCI-324 Audiowire Interface", |
"137b PPT Vision", |
"137c Iwatsu Electric Co Ltd", |
"137d Dynachip Corporation", |
"137e Patriot Scientific Corporation", |
"137f Japan Satellite Systems Inc", |
"1380 Sanritz Automation Co Ltd", |
"1381 Brains Co. Ltd", |
"1382 Marian - Electronic & Software", |
" 0001 ARC88 audio recording card", |
" 2008 Prodif 96 Pro sound system", |
" 2048 Prodif Plus sound system", |
" 2088 Marc 8 Midi sound system", |
" 20c8 Marc A sound system", |
" 4008 Marc 2 sound system", |
" 4010 Marc 2 Pro sound system", |
" 4048 Marc 4 MIDI sound system", |
" 4088 Marc 4 Digi sound system", |
" 4248 Marc X sound system", |
" 4424 TRACE D4 Sound System", |
"1383 Controlnet Inc", |
"1384 Reality Simulation Systems Inc", |
"1385 Netgear", |
" 0013 WG311T 108 Mbps Wireless PCI Adapter", |
" 311a GA511 Gigabit Ethernet", |
" 4100 802.11b Wireless Adapter (MA301)", |
" 4105 MA311 802.11b wireless adapter", |
" 4251 WG111T 108 Mbps Wireless USB 2.0 Adapter", |
" 4400 WAG511 802.11a/b/g Dual Band Wireless PC Card", |
" 4600 WAG511 802.11a/b/g Dual Band Wireless PC Card", |
" 4601 WAG511 802.11a/b/g Dual Band Wireless PC Card", |
" 4610 WAG511 802.11a/b/g Dual Band Wireless PC Card", |
" 4800 WG511(v1) 54 Mbps Wireless PC Card", |
" 4900 WG311v1 54 Mbps Wireless PCI Adapter", |
" 4a00 WAG311 802.11a/g Wireless PCI Adapter", |
" 4b00 WG511T 108 Mbps Wireless PC Card", |
" 4c00 WG311v2 54 Mbps Wireless PCI Adapter", |
" 4d00 WG311T 108 Mbps Wireless PCI Adapter", |
" 4e00 WG511v2 54 Mbps Wireless PC Card", |
" 4f00 WG511U Double 108 Mbps Wireless PC Card", |
" 5200 GA511 Gigabit PC Card", |
" 620a GA620 Gigabit Ethernet", |
" 622a GA622", |
" 630a GA630 Gigabit Ethernet", |
" 6b00 WG311v3 54 Mbps Wireless PCI Adapter", |
" 6d00 WPNT511 RangeMax 240 Mbps Wireless PC Card", |
" f004 FA310TX", |
"1386 Video Domain Technologies", |
"1387 Systran Corp", |
"1388 Hitachi Information Technology Co Ltd", |
"1389 Applicom International", |
" 0001 PCI1500PFB [Intelligent fieldbus adaptor]", |
"138a Fusion Micromedia Corp", |
"138b Tokimec Inc", |
"138c Silicon Reality", |
"138d Future Techno Designs pte Ltd", |
"138e Basler GmbH", |
"138f Patapsco Designs Inc", |
"1390 Concept Development Inc", |
"1391 Development Concepts Inc", |
"1392 Medialight Inc", |
"1393 Moxa Technologies Co Ltd", |
" 1040 Smartio C104H/PCI", |
" 1141 Industrio CP-114", |
" 1680 Smartio C168H/PCI", |
" 2040 Intellio CP-204J", |
" 2180 Intellio C218 Turbo PCI", |
" 3200 Intellio C320 Turbo PCI", |
"1394 Level One Communications", |
" 0001 LXT1001 Gigabit Ethernet", |
" 1394 0001 NetCelerator Adapter", |
"1395 Ambicom Inc", |
"1396 Cipher Systems Inc", |
"1397 Cologne Chip Designs GmbH", |
" 08b4 ISDN network Controller [HFC-4S]", |
" 1397 b520 HFC-4S [IOB4ST]", |
" 1397 b540 HFC-4S [Swyx 4xS0 SX2 QuadBri]", |
" 16b8 ISDN network Controller [HFC-8S]", |
" 2bd0 ISDN network controller [HFC-PCI]", |
" 0675 1704 ISDN Adapter (PCI Bus, D, C)", |
" 0675 1708 ISDN Adapter (PCI Bus, D, C, ACPI)", |
" 1397 2bd0 ISDN Board", |
" e4bf 1000 CI1-1-Harp", |
"1398 Clarion co. Ltd", |
"1399 Rios systems Co Ltd", |
"139a Alacritech Inc", |
" 0001 Quad Port 10/100 Server Accelerator", |
" 0003 Single Port 10/100 Server Accelerator", |
" 0005 Single Port Gigabit Server Accelerator", |
"139b Mediasonic Multimedia Systems Ltd", |
"139c Quantum 3d Inc", |
"139d EPL limited", |
"139e Media4", |
"139f Aethra s.r.l.", |
"13a0 Crystal Group Inc", |
"13a1 Kawasaki Heavy Industries Ltd", |
"13a2 Ositech Communications Inc", |
"13a3 Hifn Inc.", |
" 0005 7751 Security Processor", |
" 0006 6500 Public Key Processor", |
" 0007 7811 Security Processor", |
" 0012 7951 Security Processor", |
" 0014 78XX Security Processor", |
" 0016 8065 Security Processor", |
" 0017 8165 Security Processor", |
" 0018 8154 Security Processor", |
" 001d 7956 Security Processor", |
" 0020 7955 Security Processor", |
" 0026 8155 Security Processor", |
"13a4 Rascom Inc", |
"13a5 Audio Digital Imaging Inc", |
"13a6 Videonics Inc", |
"13a7 Teles AG", |
"13a8 Exar Corp.", |
" 0152 XR17C/D152 Dual PCI UART", |
" 0154 XR17C154 Quad UART", |
" 0158 XR17C158 Octal UART", |
"13a9 Siemens Medical Systems, Ultrasound Group", |
"13aa Broadband Networks Inc", |
"13ab Arcom Control Systems Ltd", |
"13ac Motion Media Technology Ltd", |
"13ad Nexus Inc", |
"13ae ALD Technology Ltd", |
"13af T.Sqware", |
"13b0 Maxspeed Corp", |
"13b1 Tamura corporation", |
"13b2 Techno Chips Co. Ltd", |
"13b3 Lanart Corporation", |
"13b4 Wellbean Co Inc", |
"13b5 ARM", |
"13b6 Dlog GmbH", |
"13b7 Logic Devices Inc", |
"13b8 Nokia Telecommunications oy", |
"13b9 Elecom Co Ltd", |
"13ba Oxford Instruments", |
"13bb Sanyo Technosound Co Ltd", |
"13bc Bitran Corporation", |
"13bd Sharp corporation", |
"13be Miroku Jyoho Service Co. Ltd", |
"13bf Sharewave Inc", |
"13c0 Microgate Corporation", |
" 0010 SyncLink Adapter v1", |
" 0020 SyncLink SCC Adapter", |
" 0030 SyncLink Multiport Adapter", |
" 0210 SyncLink Adapter v2", |
"13c1 3ware Inc", |
" 1000 5xxx/6xxx-series PATA-RAID", |
" 1001 7xxx/8xxx-series PATA/SATA-RAID", |
" 13c1 1001 7xxx/8xxx-series PATA/SATA-RAID", |
" 1002 9xxx-series SATA-RAID", |
" 1003 9550SX SATA-RAID", |
"13c2 Technotrend Systemtechnik GmbH", |
" 000e Technotrend/Hauppauge DVB card rev2.3", |
"13c3 Janz Computer AG", |
"13c4 Phase Metrics", |
"13c5 Alphi Technology Corp", |
"13c6 Condor Engineering Inc", |
" 0520 CEI-520 A429 Card", |
" 0620 CEI-620 A429 Card", |
" 0820 CEI-820 A429 Card", |
"13c7 Blue Chip Technology Ltd", |
"13c8 Apptech Inc", |
"13c9 Eaton Corporation", |
"13ca Iomega Corporation", |
"13cb Yano Electric Co Ltd", |
"13cc Metheus Corporation", |
"13cd Compatible Systems Corporation", |
"13ce Cocom A/S", |
"13cf Studio Audio & Video Ltd", |
"13d0 Techsan Electronics Co Ltd", |
" 2103 B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card", |
" 2200 B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card", |
"13d1 Abocom Systems Inc", |
" ab02 ADMtek Centaur-C rev 17 [D-Link DFE-680TX] CardBus Fast Ethernet Adapter", |
" ab03 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" ab06 RTL8139 [FE2000VX] CardBus Fast Ethernet Attached Port Adapter", |
" ab08 21x4x DEC-Tulip compatible 10/100 Ethernet", |
"13d2 Shark Multimedia Inc", |
"13d3 IMC Networks", |
"13d4 Graphics Microsystems Inc", |
"13d5 Media 100 Inc", |
"13d6 K.I. Technology Co Ltd", |
"13d7 Toshiba Engineering Corporation", |
"13d8 Phobos corporation", |
"13d9 Apex PC Solutions Inc", |
"13da Intresource Systems pte Ltd", |
"13db Janich & Klass Computertechnik GmbH", |
"13dc Netboost Corporation", |
"13dd Multimedia Bundle Inc", |
"13de ABB Robotics Products AB", |
"13df E-Tech Inc", |
" 0001 PCI56RVP Modem", |
" 13df 0001 PCI56RVP Modem", |
"13e0 GVC Corporation", |
"13e1 Silicom Multimedia Systems Inc", |
"13e2 Dynamics Research Corporation", |
"13e3 Nest Inc", |
"13e4 Calculex Inc", |
"13e5 Telesoft Design Ltd", |
"13e6 Argosy research Inc", |
"13e7 NAC Incorporated", |
"13e8 Chip Express Corporation", |
"13e9 Intraserver Technology Inc", |
"13ea Dallas Semiconductor", |
"13eb Hauppauge Computer Works Inc", |
"13ec Zydacron Inc", |
" 000a NPC-RC01 Remote control receiver", |
"13ed Raytheion E-Systems", |
"13ee Hayes Microcomputer Products Inc", |
"13ef Coppercom Inc", |
"13f0 Sundance Technology Inc / IC Plus Corp", |
" 0200 IC Plus IP100A Integrated 10/100 Ethernet MAC + PHY", |
" 0201 ST201 Sundance Ethernet", |
" 1023 IC Plus IP1000 Family Gigabit Ethernet", |
"13f1 Oce' - Technologies B.V.", |
"13f2 Ford Microelectronics Inc", |
"13f3 Mcdata Corporation", |
"13f4 Troika Networks, Inc.", |
" 1401 Zentai Fibre Channel Adapter", |
"13f5 Kansai Electric Co. Ltd", |
"13f6 C-Media Electronics Inc", |
" 0011 CMI8738", |
" 0100 CM8338A", |
" 13f6 ffff CMI8338/C3DX PCI Audio Device", |
" 0101 CM8338B", |
" 13f6 0101 CMI8338-031 PCI Audio Device", |
" 0111 CM8738", |
" 1019 0970 P6STP-FL motherboard", |
" 1043 8035 CUSI-FX motherboard", |
" 1043 8077 CMI8738 6-channel audio controller", |
" 1043 80e2 CMI8738 6ch-MX", |
" 13f6 0111 CMI8738/C3DX PCI Audio Device", |
" 1681 a000 Gamesurround MUSE XL", |
" 0211 CM8738", |
"13f7 Wildfire Communications", |
"13f8 Ad Lib Multimedia Inc", |
"13f9 NTT Advanced Technology Corp.", |
"13fa Pentland Systems Ltd", |
"13fb Aydin Corp", |
"13fc Computer Peripherals International", |
"13fd Micro Science Inc", |
"13fe Advantech Co. Ltd", |
" 1240 PCI-1240 4-channel stepper motor controller card", |
" 1600 PCI-1612 4-port RS-232/422/485 PCI communication card", |
" 1733 PCI-1733 32-channel isolated digital input card", |
" 1752 PCI-1752", |
" 1754 PCI-1754", |
" 1756 PCI-1756", |
"13ff Silicon Spice Inc", |
"1400 Artx Inc", |
" 1401 9432 TX", |
"1401 CR-Systems A/S", |
"1402 Meilhaus Electronic GmbH", |
"1403 Ascor Inc", |
"1404 Fundamental Software Inc", |
"1405 Excalibur Systems Inc", |
"1406 Oce' Printing Systems GmbH", |
"1407 Lava Computer mfg Inc", |
" 0100 Lava Dual Serial", |
" 0101 Lava Quatro A", |
" 0102 Lava Quatro B", |
" 0110 Lava DSerial-PCI Port A", |
" 0111 Lava DSerial-PCI Port B", |
" 0120 Quattro-PCI A", |
" 0121 Quattro-PCI B", |
" 0180 Lava Octo A", |
" 0181 Lava Octo B", |
" 0200 Lava Port Plus", |
" 0201 Lava Quad A", |
" 0202 Lava Quad B", |
" 0220 Lava Quattro PCI Ports A/B", |
" 0221 Lava Quattro PCI Ports C/D", |
" 0500 Lava Single Serial", |
" 0600 Lava Port 650", |
" 8000 Lava Parallel", |
" 8001 Dual parallel port controller A", |
" 8002 Lava Dual Parallel port A", |
" 8003 Lava Dual Parallel port B", |
" 8800 BOCA Research IOPPAR", |
"1408 Aloka Co. Ltd", |
"1409 Timedia Technology Co Ltd", |
" 7168 PCI2S550 (Dual 16550 UART)", |
"140a DSP Research Inc", |
"140b Ramix Inc", |
"140c Elmic Systems Inc", |
"140d Matsushita Electric Works Ltd", |
"140e Goepel Electronic GmbH", |
"140f Salient Systems Corp", |
"1410 Midas lab Inc", |
"1411 Ikos Systems Inc", |
"1412 VIA Technologies Inc.", |
" 1712 ICE1712 [Envy24] PCI Multi-Channel I/O Controller", |
" 1412 1712 Hoontech ST Audio DSP 24", |
" 1412 d630 M-Audio Delta 1010", |
" 1412 d631 M-Audio Delta DiO", |
" 1412 d632 M-Audio Delta 66", |
" 1412 d633 M-Audio Delta 44", |
" 1412 d634 M-Audio Delta Audiophile", |
" 1412 d635 M-Audio Delta TDIF", |
" 1412 d637 M-Audio Delta RBUS", |
" 1412 d638 M-Audio Delta 410", |
" 1412 d63b M-Audio Delta 1010LT", |
" 1412 d63c Digigram VX442", |
" 1416 1712 Hoontech ST Audio DSP 24 Media 7.1", |
" 153b 1115 EWS88 MT", |
" 153b 1125 EWS88 MT (Master)", |
" 153b 112b EWS88 D", |
" 153b 112c EWS88 D (Master)", |
" 153b 1130 EWX 24/96", |
" 153b 1138 DMX 6fire 24/96", |
" 153b 1151 PHASE88", |
" 16ce 1040 Edirol DA-2496", |
" 1724 VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller", |
" 1412 1724 Albatron PX865PE 7.1", |
" 1412 3630 M-Audio Revolution 7.1", |
" 1412 3631 M-Audio Revolution 5.1", |
" 153b 1145 Aureon 7.1 Space", |
" 153b 1147 Aureon 5.1 Sky", |
" 153b 1153 Aureon 7.1 Universe", |
" 270f f641 ZNF3-150", |
" 270f f645 ZNF3-250", |
"1413 Addonics", |
"1414 Microsoft Corporation", |
"1415 Oxford Semiconductor Ltd", |
" 8403 VScom 011H-EP1 1 port parallel adaptor", |
" 9501 OX16PCI954 (Quad 16950 UART) function 0", |
" 131f 2050 CyberPro (4-port)", |
" 131f 2051 CyberSerial 4S Plus", |
" 15ed 2000 MCCR Serial p0-3 of 8", |
" 15ed 2001 MCCR Serial p0-3 of 16", |
" 950a EXSYS EX-41092 Dual 16950 Serial adapter", |
" 950b OXCB950 Cardbus 16950 UART", |
" 9510 OX16PCI954 (Quad 16950 UART) function 1 (Disabled)", |
" 9511 OX16PCI954 (Quad 16950 UART) function 1", |
" 15ed 2000 MCCR Serial p4-7 of 8", |
" 15ed 2001 MCCR Serial p4-15 of 16", |
" 9521 OX16PCI952 (Dual 16950 UART)", |
" 9523 OX16PCI952 Integrated Parallel Port", |
"1416 Multiwave Innovation pte Ltd", |
"1417 Convergenet Technologies Inc", |
"1418 Kyushu electronics systems Inc", |
"1419 Excel Switching Corp", |
"141a Apache Micro Peripherals Inc", |
"141b Zoom Telephonics Inc", |
"141d Digitan Systems Inc", |
"141e Fanuc Ltd", |
"141f Visiontech Ltd", |
"1420 Psion Dacom plc", |
" 8002 Gold Card NetGlobal 56k+10/100Mb CardBus (Ethernet part)", |
" 8003 Gold Card NetGlobal 56k+10/100Mb CardBus (Modem part)", |
"1421 Ads Technologies Inc", |
"1422 Ygrec Systems Co Ltd", |
"1423 Custom Technology Corp.", |
"1424 Videoserver Connections", |
"1425 Chelsio Communications Inc", |
" 000b T210 Protocol Engine", |
"1426 Storage Technology Corp.", |
"1427 Better On-Line Solutions", |
"1428 Edec Co Ltd", |
"1429 Unex Technology Corp.", |
"142a Kingmax Technology Inc", |
"142b Radiolan", |
"142c Minton Optic Industry Co Ltd", |
"142d Pix stream Inc", |
"142e Vitec Multimedia", |
" 4020 VM2-2 [Video Maker 2] MPEG1/2 Encoder", |
" 4337 VM2-2-C7 [Video Maker 2 rev. C7] MPEG1/2 Encoder", |
"142f Radicom Research Inc", |
"1430 ITT Aerospace/Communications Division", |
"1431 Gilat Satellite Networks", |
"1432 Edimax Computer Co.", |
" 9130 RTL81xx Fast Ethernet", |
"1433 Eltec Elektronik GmbH", |
"1435 RTD Embedded Technologies, Inc.", |
"1436 CIS Technology Inc", |
"1437 Nissin Inc Co", |
"1438 Atmel-dream", |
"1439 Outsource Engineering & Mfg. Inc", |
"143a Stargate Solutions Inc", |
"143b Canon Research Center, America", |
"143c Amlogic Inc", |
"143d Tamarack Microelectronics Inc", |
"143e Jones Futurex Inc", |
"143f Lightwell Co Ltd - Zax Division", |
"1440 ALGOL Corp.", |
"1441 AGIE Ltd", |
"1442 Phoenix Contact GmbH & Co.", |
"1443 Unibrain S.A.", |
"1444 TRW", |
"1445 Logical DO Ltd", |
"1446 Graphin Co Ltd", |
"1447 AIM GmBH", |
"1448 Alesis Studio Electronics", |
"1449 TUT Systems Inc", |
"144a Adlink Technology", |
" 7296 PCI-7296", |
" 7432 PCI-7432", |
" 7433 PCI-7433", |
" 7434 PCI-7434", |
" 7841 PCI-7841", |
" 8133 PCI-8133", |
" 8164 PCI-8164", |
" 8554 PCI-8554", |
" 9111 PCI-9111", |
" 9113 PCI-9113", |
" 9114 PCI-9114", |
"144b Loronix Information Systems Inc", |
"144c Catalina Research Inc", |
"144d Samsung Electronics Co Ltd", |
" c00c P35 laptop", |
"144e OLITEC", |
"144f Askey Computer Corp.", |
"1450 Octave Communications Ind.", |
"1451 SP3D Chip Design GmBH", |
"1453 MYCOM Inc", |
"1454 Altiga Networks", |
"1455 Logic Plus Plus Inc", |
"1456 Advanced Hardware Architectures", |
"1457 Nuera Communications Inc", |
"1458 Giga-byte Technology", |
" 0c11 K8NS Pro Mainboard", |
" e911 GN-WIAG02", |
"1459 DOOIN Electronics", |
"145a Escalate Networks Inc", |
"145b PRAIM SRL", |
"145c Cryptek", |
"145d Gallant Computer Inc", |
"145e Aashima Technology B.V.", |
"145f Baldor Electric Company", |
" 0001 NextMove PCI", |
"1460 DYNARC INC", |
"1461 Avermedia Technologies Inc", |
" f436 AVerTV Hybrid+FM", |
"1462 Micro-Star International Co., Ltd.", |
" 5501 nVidia NV15DDR [GeForce2 Ti]", |
" 6819 Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller [MSI CB54G]", |
" 6825 PCI Card wireless 11g [PC54G]", |
" 6834 RaLink RT2500 802.11g [PC54G2]", |
" 7125 K8N motherboard", |
" 8725 NVIDIA NV25 [GeForce4 Ti 4600] VGA Adapter", |
" 9000 NVIDIA NV28 [GeForce4 Ti 4800] VGA Adapter", |
" 9110 GeFORCE FX5200", |
" 9119 NVIDIA NV31 [GeForce FX 5600XT] VGA Adapter", |
" 9123 NVIDIA NV31 [GeForce FX 5600] FX5600-VTDR128 [MS-8912]", |
" 9591 nVidia Corporation NV36 [GeForce FX 5700LE]", |
"1463 Fast Corporation", |
"1464 Interactive Circuits & Systems Ltd", |
"1465 GN NETTEST Telecom DIV.", |
"1466 Designpro Inc.", |
"1467 DIGICOM SPA", |
"1468 AMBIT Microsystem Corp.", |
"1469 Cleveland Motion Controls", |
"146a IFR", |
"146b Parascan Technologies Ltd", |
"146c Ruby Tech Corp.", |
" 1430 FE-1430TX Fast Ethernet PCI Adapter", |
"146d Tachyon, INC.", |
"146e Williams Electronics Games, Inc.", |
"146f Multi Dimensional Consulting Inc", |
"1470 Bay Networks", |
"1471 Integrated Telecom Express Inc", |
"1472 DAIKIN Industries, Ltd", |
"1473 ZAPEX Technologies Inc", |
"1474 Doug Carson & Associates", |
"1475 PICAZO Communications", |
"1476 MORTARA Instrument Inc", |
"1477 Net Insight", |
"1478 DIATREND Corporation", |
"1479 TORAY Industries Inc", |
"147a FORMOSA Industrial Computing", |
"147b ABIT Computer Corp.", |
"147c AWARE, Inc.", |
"147d Interworks Computer Products", |
"147e Matsushita Graphic Communication Systems, Inc.", |
"147f NIHON UNISYS, Ltd.", |
"1480 SCII Telecom", |
"1481 BIOPAC Systems Inc", |
"1482 ISYTEC - Integrierte Systemtechnik GmBH", |
"1483 LABWAY Corporation", |
"1484 Logic Corporation", |
"1485 ERMA - Electronic GmBH", |
"1486 L3 Communications Telemetry & Instrumentation", |
"1487 MARQUETTE Medical Systems", |
"1488 KONTRON Electronik GmBH", |
"1489 KYE Systems Corporation", |
"148a OPTO", |
"148b INNOMEDIALOGIC Inc.", |
"148c C.P. Technology Co. Ltd", |
"148d DIGICOM Systems, Inc.", |
" 1003 HCF 56k Data/Fax Modem", |
"148e OSI Plus Corporation", |
"148f Plant Equipment, Inc.", |
"1490 Stone Microsystems PTY Ltd.", |
"1491 ZEAL Corporation", |
"1492 Time Logic Corporation", |
"1493 MAKER Communications", |
"1494 WINTOP Technology, Inc.", |
"1495 TOKAI Communications Industry Co. Ltd", |
"1496 JOYTECH Computer Co., Ltd.", |
"1497 SMA Regelsysteme GmBH", |
" 1497 SMA Technologie AG", |
"1498 TEWS Datentechnik GmBH", |
" 0330 TPMC816 2 Channel CAN bus controller.", |
" 0385 TPMC901 Extended CAN bus with 2/4/6 CAN controller", |
" 21cd TCP461 CompactPCI 8 Channel Serial Interface RS232/RS422", |
" 30c8 TPCI200", |
"1499 EMTEC CO., Ltd", |
"149a ANDOR Technology Ltd", |
"149b SEIKO Instruments Inc", |
"149c OVISLINK Corp.", |
"149d NEWTEK Inc", |
" 0001 Video Toaster for PC", |
"149e Mapletree Networks Inc.", |
"149f LECTRON Co Ltd", |
"14a0 SOFTING GmBH", |
"14a1 Systembase Co Ltd", |
"14a2 Millennium Engineering Inc", |
"14a3 Maverick Networks", |
"14a4 GVC/BCM Advanced Research", |
"14a5 XIONICS Document Technologies Inc", |
"14a6 INOVA Computers GmBH & Co KG", |
"14a7 MYTHOS Systems Inc", |
"14a8 FEATRON Technologies Corporation", |
"14a9 HIVERTEC Inc", |
"14aa Advanced MOS Technology Inc", |
"14ab Mentor Graphics Corp.", |
"14ac Novaweb Technologies Inc", |
"14ad Time Space Radio AB", |
"14ae CTI, Inc", |
"14af Guillemot Corporation", |
" 7102 3D Prophet II MX", |
"14b0 BST Communication Technology Ltd", |
"14b1 Nextcom K.K.", |
"14b2 ENNOVATE Networks Inc", |
"14b3 XPEED Inc", |
" 0000 DSL NIC", |
"14b4 PHILIPS Business Electronics B.V.", |
"14b5 Creamware GmBH", |
" 0200 Scope", |
" 0300 Pulsar", |
" 0400 PulsarSRB", |
" 0600 Pulsar2", |
" 0800 DSP-Board", |
" 0900 DSP-Board", |
" 0a00 DSP-Board", |
" 0b00 DSP-Board", |
"14b6 Quantum Data Corp.", |
"14b7 PROXIM Inc", |
" 0001 Symphony 4110", |
"14b8 Techsoft Technology Co Ltd", |
"14b9 AIRONET Wireless Communications", |
" 0001 PC4800", |
" 0340 PC4800", |
" 0350 PC4800", |
" 4500 PC4500", |
" 4800 Cisco Aironet 340 802.11b Wireless LAN Adapter/Aironet PC4800", |
" a504 Cisco Aironet Wireless 802.11b", |
" a505 Cisco Aironet CB20a 802.11a Wireless LAN Adapter", |
" a506 Cisco Aironet Mini PCI b/g", |
"14ba INTERNIX Inc.", |
"14bb SEMTECH Corporation", |
"14bc Globespan Semiconductor Inc.", |
"14bd CARDIO Control N.V.", |
"14be L3 Communications", |
"14bf SPIDER Communications Inc.", |
"14c0 COMPAL Electronics Inc", |
"14c1 MYRICOM Inc.", |
" 0008 Myri-10G Dual-Protocol Interconnect", |
" 8043 Myrinet 2000 Scalable Cluster Interconnect", |
"14c2 DTK Computer", |
"14c3 MEDIATEK Corp.", |
"14c4 IWASAKI Information Systems Co Ltd", |
"14c5 Automation Products AB", |
"14c6 Data Race Inc", |
"14c7 Modular Technology Holdings Ltd", |
"14c8 Turbocomm Tech. Inc.", |
"14c9 ODIN Telesystems Inc", |
"14ca PE Logic Corp.", |
"14cb Billionton Systems Inc", |
"14cc NAKAYO Telecommunications Inc", |
"14cd Universal Scientific Ind.", |
"14ce Whistle Communications", |
"14cf TEK Microsystems Inc.", |
"14d0 Ericsson Axe R & D", |
"14d1 Computer Hi-Tech Co Ltd", |
"14d2 Titan Electronics Inc", |
" 8001 VScom 010L 1 port parallel adaptor", |
" 8002 VScom 020L 2 port parallel adaptor", |
" 8010 VScom 100L 1 port serial adaptor", |
" 8011 VScom 110L 1 port serial and 1 port parallel adaptor", |
" 8020 VScom 200L 1 port serial adaptor", |
" 8021 VScom 210L 2 port serial and 1 port parallel adaptor", |
" 8040 VScom 400L 4 port serial adaptor", |
" 8080 VScom 800L 8 port serial adaptor", |
" a000 VScom 010H 1 port parallel adaptor", |
" a001 VScom 100H 1 port serial adaptor", |
" a003 VScom 400H 4 port serial adaptor", |
" a004 VScom 400HF1 4 port serial adaptor", |
" a005 VScom 200H 2 port serial adaptor", |
" e001 VScom 010HV2 1 port parallel adaptor", |
" e010 VScom 100HV2 1 port serial adaptor", |
" e020 VScom 200HV2 2 port serial adaptor", |
"14d3 CIRTECH (UK) Ltd", |
"14d4 Panacom Technology Corp", |
"14d5 Nitsuko Corporation", |
"14d6 Accusys Inc", |
"14d7 Hirakawa Hewtech Corp", |
"14d8 HOPF Elektronik GmBH", |
"14d9 Alliance Semiconductor Corporation", |
" 0010 AP1011/SP1011 HyperTransport-PCI Bridge [Sturgeon]", |
" 9000 AS90L10204/10208 HyperTransport to PCI-X Bridge", |
"14da National Aerospace Laboratories", |
"14db AFAVLAB Technology Inc", |
" 2120 TK9902", |
" 2182 AFAVLAB Technology Inc. 8-port serial card", |
"14dc Amplicon Liveline Ltd", |
" 0000 PCI230", |
" 0001 PCI242", |
" 0002 PCI244", |
" 0003 PCI247", |
" 0004 PCI248", |
" 0005 PCI249", |
" 0006 PCI260", |
" 0007 PCI224", |
" 0008 PCI234", |
" 0009 PCI236", |
" 000a PCI272", |
" 000b PCI215", |
"14dd Boulder Design Labs Inc", |
"14de Applied Integration Corporation", |
"14df ASIC Communications Corp", |
"14e1 INVERTEX", |
"14e2 INFOLIBRIA", |
"14e3 AMTELCO", |
"14e4 Broadcom Corporation", |
" 0800 Sentry5 Chipcommon I/O Controller", |
" 0804 Sentry5 PCI Bridge", |
" 0805 Sentry5 MIPS32 CPU", |
" 0806 Sentry5 Ethernet Controller", |
" 080b Sentry5 Crypto Accelerator", |
" 080f Sentry5 DDR/SDR RAM Controller", |
" 0811 Sentry5 External Interface Core", |
" 0816 BCM3302 Sentry5 MIPS32 CPU", |
" 1600 NetXtreme BCM5752 Gigabit Ethernet PCI Express", |
" 1601 NetXtreme BCM5752M Gigabit Ethernet PCI Express", |
" 1644 NetXtreme BCM5700 Gigabit Ethernet", |
" 1014 0277 Broadcom Vigil B5700 1000Base-T", |
" 1028 00d1 Broadcom BCM5700", |
" 1028 0106 Broadcom BCM5700", |
" 1028 0109 Broadcom BCM5700 1000Base-T", |
" 1028 010a Broadcom BCM5700 1000BaseTX", |
" 10b7 1000 3C996-T 1000Base-T", |
" 10b7 1001 3C996B-T 1000Base-T", |
" 10b7 1002 3C996C-T 1000Base-T", |
" 10b7 1003 3C997-T 1000Base-T Dual Port", |
" 10b7 1004 3C996-SX 1000Base-SX", |
" 10b7 1005 3C997-SX 1000Base-SX Dual Port", |
" 10b7 1008 3C942 Gigabit LOM (31X31)", |
" 14e4 0002 NetXtreme 1000Base-SX", |
" 14e4 0003 NetXtreme 1000Base-SX", |
" 14e4 0004 NetXtreme 1000Base-T", |
" 14e4 1028 NetXtreme 1000BaseTX", |
" 14e4 1644 BCM5700 1000Base-T", |
" 1645 NetXtreme BCM5701 Gigabit Ethernet", |
" 0e11 007c NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T)", |
" 0e11 007d NC6770 Gigabit Server Adapter (PCI-X, 1000-SX)", |
" 0e11 0085 NC7780 Gigabit Server Adapter (embedded, WOL)", |
" 0e11 0099 NC7780 Gigabit Server Adapter (embedded, WOL)", |
" 0e11 009a NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T)", |
" 0e11 00c1 NC6770 Gigabit Server Adapter (PCI-X, 1000-SX)", |
" 1028 0121 Broadcom BCM5701 1000Base-T", |
" 103c 128a 1000Base-T (PCI) [A7061A]", |
" 103c 128b 1000Base-SX (PCI) [A7073A]", |
" 103c 12a4 Core Lan 1000Base-T", |
" 103c 12c1 IOX Core Lan 1000Base-T [A7109AX]", |
" 103c 1300 Core LAN/SCSI Combo [A6794A]", |
" 10a9 8010 IO9/IO10 Gigabit Ethernet (Copper)", |
" 10a9 8011 Gigabit Ethernet (Copper)", |
" 10a9 8012 Gigabit Ethernet (Fiber)", |
" 10b7 1004 3C996-SX 1000Base-SX", |
" 10b7 1006 3C996B-T 1000Base-T", |
" 10b7 1007 3C1000-T 1000Base-T", |
" 10b7 1008 3C940-BR01 1000Base-T", |
" 14e4 0001 BCM5701 1000Base-T", |
" 14e4 0005 BCM5701 1000Base-T", |
" 14e4 0006 BCM5701 1000Base-T", |
" 14e4 0007 BCM5701 1000Base-SX", |
" 14e4 0008 BCM5701 1000Base-T", |
" 14e4 8008 BCM5701 1000Base-T", |
" 1646 NetXtreme BCM5702 Gigabit Ethernet", |
" 0e11 00bb NC7760 1000BaseTX", |
" 1028 0126 Broadcom BCM5702 1000BaseTX", |
" 14e4 8009 BCM5702 1000BaseTX", |
" 1647 NetXtreme BCM5703 Gigabit Ethernet", |
" 0e11 0099 NC7780 1000BaseTX", |
" 0e11 009a NC7770 1000BaseTX", |
" 10a9 8010 SGI IO9 Gigabit Ethernet (Copper)", |
" 14e4 0009 BCM5703 1000BaseTX", |
" 14e4 000a BCM5703 1000BaseSX", |
" 14e4 000b BCM5703 1000BaseTX", |
" 14e4 8009 BCM5703 1000BaseTX", |
" 14e4 800a BCM5703 1000BaseTX", |
" 1648 NetXtreme BCM5704 Gigabit Ethernet", |
" 0e11 00cf NC7772 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 0e11 00d0 NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 0e11 00d1 NC7783 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 10b7 2000 3C998-T Dual Port 10/100/1000 PCI-X", |
" 10b7 3000 3C999-T Quad Port 10/100/1000 PCI-X", |
" 1166 1648 NetXtreme CIOB-E 1000Base-T", |
" 1734 100b Primergy RX300", |
" 164a NetXtreme II BCM5706 Gigabit Ethernet", |
" 103c 3101 NC370T MultifuNCtion Gigabit Server Adapter", |
" 164c NetXtreme II BCM5708 Gigabit Ethernet", |
" 164d NetXtreme BCM5702FE Gigabit Ethernet", |
" 1653 NetXtreme BCM5705 Gigabit Ethernet", |
" 0e11 00e3 NC7761 Gigabit Server Adapter", |
" 1654 NetXtreme BCM5705_2 Gigabit Ethernet", |
" 0e11 00e3 NC7761 Gigabit Server Adapter", |
" 103c 3100 NC1020 HP ProLiant Gigabit Server Adapter 32 PCI", |
" 103c 3226 NC150T 4-port Gigabit Combo Switch & Adapter", |
" 1659 NetXtreme BCM5721 Gigabit Ethernet PCI Express", |
" 1014 02c6 eServer xSeries server mainboard", |
" 103c 7031 NC320T PCIe Gigabit Server Adapter", |
" 103c 7032 NC320i PCIe Gigabit Server Adapter", |
" 1734 1061 Primergy RX300 S2", |
" 165d NetXtreme BCM5705M Gigabit Ethernet", |
" 1028 865d Latitude D400", |
" 165e NetXtreme BCM5705M_2 Gigabit Ethernet", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 103c 099c NX6110/NC6120", |
" 1668 NetXtreme BCM5714 Gigabit Ethernet", |
" 103c 7039 NC324i PCIe Dual Port Gigabit Server Adapter", |
" 1669 NetXtreme 5714S Gigabit Ethernet", |
" 166a NetXtreme BCM5780 Gigabit Ethernet", |
" 166b NetXtreme BCM5780S Gigabit Ethernet", |
" 166e 570x 10/100 Integrated Controller", |
" 1672 NetXtreme BCM5754M Gigabit Ethernet PCI Express", |
" 1673 NetXtreme BCM5755M Gigabit Ethernet PCI Express", |
" 1677 NetXtreme BCM5751 Gigabit Ethernet PCI Express", |
" 1028 0179 Optiplex GX280", |
" 1028 0182 Latitude D610", |
" 1028 0187 Precision M70", |
" 1028 01ad Optiplex GX620", |
" 103c 3006 DC7100 SFF(DX878AV)", |
" 1734 105d Scenic W620", |
" 1678 NetXtreme BCM5715 Gigabit Ethernet", |
" 1679 NetXtreme 5715S Gigabit Ethernet", |
" 103c 703c NC326i PCIe Dual Port Gigabit Server Adapter", |
" 167a NetXtreme BCM5754 Gigabit Ethernet PCI Express", |
" 167b NetXtreme BCM5755 Gigabit Ethernet PCI Express", |
" 167d NetXtreme BCM5751M Gigabit Ethernet PCI Express", |
" 167e NetXtreme BCM5751F Fast Ethernet PCI Express", |
" 1693 NetLink BCM5787M Gigabit Ethernet PCI Express", |
" 1696 NetXtreme BCM5782 Gigabit Ethernet", |
" 103c 12bc HP d530 CMT (DG746A)", |
" 14e4 000d NetXtreme BCM5782 1000Base-T", |
" 169b NetLink BCM5787 Gigabit Ethernet PCI Express", |
" 169c NetXtreme BCM5788 Gigabit Ethernet", |
" 103c 308b MX6125", |
" 169d NetLink BCM5789 Gigabit Ethernet PCI Express", |
" 16a6 NetXtreme BCM5702X Gigabit Ethernet", |
" 0e11 00bb NC7760 Gigabit Server Adapter (PCI-X, 10/100/1000-T)", |
" 1028 0126 BCM5702 1000Base-T", |
" 14e4 000c BCM5702 1000Base-T", |
" 14e4 8009 BCM5702 1000Base-T", |
" 16a7 NetXtreme BCM5703X Gigabit Ethernet", |
" 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 14e4 0009 NetXtreme BCM5703 1000Base-T", |
" 14e4 000a NetXtreme BCM5703 1000Base-SX", |
" 14e4 000b NetXtreme BCM5703 1000Base-T", |
" 14e4 800a NetXtreme BCM5703 1000Base-T", |
" 16a8 NetXtreme BCM5704S Gigabit Ethernet", |
" 10b7 2001 3C998-SX Dual Port 1000-SX PCI-X", |
" 16aa NetXtreme II BCM5706S Gigabit Ethernet", |
" 103c 3102 NC370F MultifuNCtion Gigabit Server Adapter", |
" 16ac NetXtreme II BCM5708S Gigabit Ethernet", |
" 16c6 NetXtreme BCM5702A3 Gigabit Ethernet", |
" 10b7 1100 3C1000B-T 10/100/1000 PCI", |
" 14e4 000c BCM5702 1000Base-T", |
" 14e4 8009 BCM5702 1000Base-T", |
" 16c7 NetXtreme BCM5703 Gigabit Ethernet", |
" 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 103c 12c3 Combo FC/GigE-SX [A9782A]", |
" 103c 12ca Combo FC/GigE-T [A9784A]", |
" 14e4 0009 NetXtreme BCM5703 1000Base-T", |
" 14e4 000a NetXtreme BCM5703 1000Base-SX", |
" 16dd NetLink BCM5781 Gigabit Ethernet PCI Express", |
" 16f7 NetXtreme BCM5753 Gigabit Ethernet PCI Express", |
" 16fd NetXtreme BCM5753M Gigabit Ethernet PCI Express", |
" 16fe NetXtreme BCM5753F Fast Ethernet PCI Express", |
" 170c BCM4401-B0 100Base-TX", |
" 1028 0188 Inspiron 6000 laptop", |
" 1028 0196 Inspiron 5160", |
" 103c 099c NX6110/NC6120", |
" 170d NetXtreme BCM5901 100Base-TX", |
" 1014 0545 ThinkPad R40e (2684-HVG) builtin ethernet controller", |
" 170e NetXtreme BCM5901 100Base-TX", |
" 3352 BCM3352", |
" 3360 BCM3360", |
" 4210 BCM4210 iLine10 HomePNA 2.0", |
" 4211 BCM4211 iLine10 HomePNA 2.0 + V.90 56k modem", |
" 4212 BCM4212 v.90 56k modem", |
" 4301 BCM4303 802.11b Wireless LAN Controller", |
" 1028 0407 TrueMobile 1180 Onboard WLAN", |
" 1043 0120 WL-103b Wireless LAN PC Card", |
" 4305 BCM4307 V.90 56k Modem", |
" 4306 BCM4307 Ethernet Controller", |
" 4307 BCM4307 802.11b Wireless LAN Controller", |
" 4310 BCM4310 Chipcommon I/OController", |
" 4312 BCM4310 UART", |
" 4313 BCM4310 Ethernet Controller", |
" 4315 BCM4310 USB Controller", |
" 4318 BCM4318 [AirForce One 54g] 802.11g Wireless LAN Controller", |
" 103c 1356 MX6125", |
" 1043 120f A6U notebook embedded card", |
" 1468 0311 Aspire 3022WLMi, 5024WLMi", |
" 1468 0312 TravelMate 2410", |
" 14e4 0449 Gateway 7510GX", |
" 14e4 4318 WPC54G version 3 [Wireless-G Notebook Adapter] 802.11g Wireless Lan Controller", |
" 16ec 0119 U.S.Robotics Wireless MAXg PC Card", |
" 1737 0048 WPC54G-EU version 3 [Wireless-G Notebook Adapter]", |
" 4319 Dell Wireless 1470 DualBand WLAN", |
" 4320 BCM4306 802.11b/g Wireless LAN Controller", |
" 1028 0001 TrueMobile 1300 WLAN Mini-PCI Card", |
" 1028 0003 Wireless 1350 WLAN Mini-PCI Card", |
" 103c 12f4 NX9500 Built-in Wireless", |
" 103c 12fa Presario R3000 802.11b/g", |
" 1043 100f WL-100G", |
" 1057 7025 WN825G", |
" 106b 004e AirPort Extreme", |
" 1154 0330 Buffalo WLI2-PCI-G54S High Speed Mode Wireless Desktop Adapter", |
" 144f 7050 eMachines M6805 802.11g Built-in Wireless", |
" 14e4 4320 Linksys WMP54G PCI", |
" 1737 4320 WPC54G", |
" 1799 7001 Belkin F5D7001 High-Speed Mode Wireless G Network Card", |
" 1799 7010 Belkin F5D7010 54g Wireless Network card", |
" 185f 1220 TravelMate 290E WLAN Mini-PCI Card", |
" 4321 BCM4306 802.11a Wireless LAN Controller", |
" 4322 BCM4306 UART", |
" 4324 BCM4309 802.11a/b/g", |
" 1028 0001 Truemobile 1400", |
" 1028 0003 Truemobile 1450 MiniPCI", |
" 4325 BCM43xG 802.11b/g", |
" 1414 0003 Wireless Notebook Adapter MN-720", |
" 1414 0004 Wireless PCI Adapter MN-730", |
" 4326 BCM4307 Chipcommon I/O Controller?", |
" 4401 BCM4401 100Base-T", |
" 1043 80a8 A7V8X motherboard", |
" 4402 BCM4402 Integrated 10/100BaseT", |
" 4403 BCM4402 V.90 56k Modem", |
" 4410 BCM4413 iLine32 HomePNA 2.0", |
" 4411 BCM4413 V.90 56k modem", |
" 4412 BCM4412 10/100BaseT", |
" 4430 BCM44xx CardBus iLine32 HomePNA 2.0", |
" 4432 BCM4432 CardBus 10/100BaseT", |
" 4610 BCM4610 Sentry5 PCI to SB Bridge", |
" 4611 BCM4610 Sentry5 iLine32 HomePNA 1.0", |
" 4612 BCM4610 Sentry5 V.90 56k Modem", |
" 4613 BCM4610 Sentry5 Ethernet Controller", |
" 4614 BCM4610 Sentry5 External Interface", |
" 4615 BCM4610 Sentry5 USB Controller", |
" 4704 BCM4704 PCI to SB Bridge", |
" 4705 BCM4704 Sentry5 802.11b Wireless LAN Controller", |
" 4706 BCM4704 Sentry5 Ethernet Controller", |
" 4707 BCM4704 Sentry5 USB Controller", |
" 4708 BCM4704 Crypto Accelerator", |
" 4710 BCM4710 Sentry5 PCI to SB Bridge", |
" 4711 BCM47xx Sentry5 iLine32 HomePNA 2.0", |
" 4712 BCM47xx V.92 56k modem", |
" 4713 Sentry5 Ethernet Controller", |
" 4714 BCM47xx Sentry5 External Interface", |
" 4715 Sentry5 USB Controller", |
" 4716 BCM47xx Sentry5 USB Host Controller", |
" 4717 BCM47xx Sentry5 USB Device Controller", |
" 4718 Sentry5 Crypto Accelerator", |
" 4719 BCM47xx/53xx RoboSwitch Core", |
" 4720 BCM4712 MIPS CPU", |
" 5365 BCM5365P Sentry5 Host Bridge", |
" 5600 BCM5600 StrataSwitch 24+2 Ethernet Switch Controller", |
" 5605 BCM5605 StrataSwitch 24+2 Ethernet Switch Controller", |
" 5615 BCM5615 StrataSwitch 24+2 Ethernet Switch Controller", |
" 5625 BCM5625 StrataSwitch 24+2 Ethernet Switch Controller", |
" 5645 BCM5645 StrataSwitch 24+2 Ethernet Switch Controller", |
" 5670 BCM5670 8-Port 10GE Ethernet Switch Fabric", |
" 5680 BCM5680 G-Switch 8 Port Gigabit Ethernet Switch Controller", |
" 5690 BCM5690 12-port Multi-Layer Gigabit Ethernet Switch", |
" 5691 BCM5691 GE/10GE 8+2 Gigabit Ethernet Switch Controller", |
" 5692 BCM5692 12-port Multi-Layer Gigabit Ethernet Switch", |
" 5820 BCM5820 Crypto Accelerator", |
" 5821 BCM5821 Crypto Accelerator", |
" 5822 BCM5822 Crypto Accelerator", |
" 5823 BCM5823 Crypto Accelerator", |
" 5824 BCM5824 Crypto Accelerator", |
" 5840 BCM5840 Crypto Accelerator", |
" 5841 BCM5841 Crypto Accelerator", |
" 5850 BCM5850 Crypto Accelerator", |
"14e5 Pixelfusion Ltd", |
"14e6 SHINING Technology Inc", |
"14e7 3CX", |
"14e8 RAYCER Inc", |
"14e9 GARNETS System CO Ltd", |
"14ea Planex Communications, Inc", |
" ab06 FNW-3603-TX CardBus Fast Ethernet", |
" ab07 RTL81xx RealTek Ethernet", |
" ab08 FNW-3602-TX CardBus Fast Ethernet", |
"14eb SEIKO EPSON Corp", |
"14ec ACQIRIS", |
"14ed DATAKINETICS Ltd", |
"14ee MASPRO KENKOH Corp", |
"14ef CARRY Computer ENG. CO Ltd", |
"14f0 CANON RESEACH CENTRE FRANCE", |
"14f1 Conexant", |
" 1002 HCF 56k Modem", |
" 1003 HCF 56k Modem", |
" 1004 HCF 56k Modem", |
" 1005 HCF 56k Modem", |
" 1006 HCF 56k Modem", |
" 1022 HCF 56k Modem", |
" 1023 HCF 56k Modem", |
" 1024 HCF 56k Modem", |
" 1025 HCF 56k Modem", |
" 1026 HCF 56k Modem", |
" 1032 HCF 56k Modem", |
" 1033 HCF 56k Data/Fax Modem", |
" 1033 8077 NEC", |
" 122d 4027 Dell Zeus - MDP3880-W(B) Data Fax Modem", |
" 122d 4030 Dell Mercury - MDP3880-U(B) Data Fax Modem", |
" 122d 4034 Dell Thor - MDP3880-W(U) Data Fax Modem", |
" 13e0 020d Dell Copper", |
" 13e0 020e Dell Silver", |
" 13e0 0261 IBM", |
" 13e0 0290 Compaq Goldwing", |
" 13e0 02a0 IBM", |
" 13e0 02b0 IBM", |
" 13e0 02c0 Compaq Scooter", |
" 13e0 02d0 IBM", |
" 144f 1500 IBM P85-DF (1)", |
" 144f 1501 IBM P85-DF (2)", |
" 144f 150a IBM P85-DF (3)", |
" 144f 150b IBM P85-DF Low Profile (1)", |
" 144f 1510 IBM P85-DF Low Profile (2)", |
" 1034 HCF 56k Data/Fax/Voice Modem", |
" 1035 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 10cf 1098 Fujitsu P85-DFSV", |
" 1036 HCF 56k Data/Fax/Voice/Spkp Modem", |
" 104d 8067 HCF 56k Modem", |
" 122d 4029 MDP3880SP-W", |
" 122d 4031 MDP3880SP-U", |
" 13e0 0209 Dell Titanium", |
" 13e0 020a Dell Graphite", |
" 13e0 0260 Gateway Red Owl", |
" 13e0 0270 Gateway White Horse", |
" 1052 HCF 56k Data/Fax Modem (Worldwide)", |
" 1053 HCF 56k Data/Fax Modem (Worldwide)", |
" 1054 HCF 56k Data/Fax/Voice Modem (Worldwide)", |
" 1055 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (Worldwide)", |
" 1056 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)", |
" 1057 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)", |
" 1059 HCF 56k Data/Fax/Voice Modem (Worldwide)", |
" 1063 HCF 56k Data/Fax Modem", |
" 1064 HCF 56k Data/Fax/Voice Modem", |
" 1065 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 1066 HCF 56k Data/Fax/Voice/Spkp Modem", |
" 122d 4033 Dell Athena - MDP3900V-U", |
" 1085 HCF V90 56k Data/Fax/Voice/Spkp PCI Modem", |
" 1433 HCF 56k Data/Fax Modem", |
" 1434 HCF 56k Data/Fax/Voice Modem", |
" 1435 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 1436 HCF 56k Data/Fax Modem", |
" 1453 HCF 56k Data/Fax Modem", |
" 13e0 0240 IBM", |
" 13e0 0250 IBM", |
" 144f 1502 IBM P95-DF (1)", |
" 144f 1503 IBM P95-DF (2)", |
" 1454 HCF 56k Data/Fax/Voice Modem", |
" 1455 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 1456 HCF 56k Data/Fax/Voice/Spkp Modem", |
" 122d 4035 Dell Europa - MDP3900V-W", |
" 122d 4302 Dell MP3930V-W(C) MiniPCI", |
" 1610 ADSL AccessRunner PCI Arbitration Device", |
" 1611 AccessRunner PCI ADSL Interface Device", |
" 1620 AccessRunner V2 PCI ADSL Arbitration Device", |
" 1621 AccessRunner V2 PCI ADSL Interface Device", |
" 1622 AccessRunner V2 PCI ADSL Yukon WAN Adapter", |
" 1803 HCF 56k Modem", |
" 0e11 0023 623-LAN Grizzly", |
" 0e11 0043 623-LAN Yogi", |
" 1811 Conextant MiniPCI Network Adapter", |
" 1815 HCF 56k Modem", |
" 0e11 0022 Grizzly", |
" 0e11 0042 Yogi", |
" 2003 HSF 56k Data/Fax Modem", |
" 2004 HSF 56k Data/Fax/Voice Modem", |
" 2005 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 2006 HSF 56k Data/Fax/Voice/Spkp Modem", |
" 2013 HSF 56k Data/Fax Modem", |
" 0e11 b195 Bear", |
" 0e11 b196 Seminole 1", |
" 0e11 b1be Seminole 2", |
" 1025 8013 Acer", |
" 1033 809d NEC", |
" 1033 80bc NEC", |
" 155d 6793 HP", |
" 155d 8850 E Machines", |
" 2014 HSF 56k Data/Fax/Voice Modem", |
" 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 2016 HSF 56k Data/Fax/Voice/Spkp Modem", |
" 2043 HSF 56k Data/Fax Modem (WorldW SmartDAA)", |
" 2044 HSF 56k Data/Fax/Voice Modem (WorldW SmartDAA)", |
" 2045 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (WorldW SmartDAA)", |
" 14f1 2045 Generic SoftK56", |
" 2046 HSF 56k Data/Fax/Voice/Spkp Modem (WorldW SmartDAA)", |
" 2063 HSF 56k Data/Fax Modem (SmartDAA)", |
" 2064 HSF 56k Data/Fax/Voice Modem (SmartDAA)", |
" 2065 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (SmartDAA)", |
" 2066 HSF 56k Data/Fax/Voice/Spkp Modem (SmartDAA)", |
" 2093 HSF 56k Modem", |
" 155d 2f07 Legend", |
" 2143 HSF 56k Data/Fax/Cell Modem (Mob WorldW SmartDAA)", |
" 2144 HSF 56k Data/Fax/Voice/Cell Modem (Mob WorldW SmartDAA)", |
" 2145 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob WorldW SmartDAA)", |
" 2146 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob WorldW SmartDAA)", |
" 2163 HSF 56k Data/Fax/Cell Modem (Mob SmartDAA)", |
" 2164 HSF 56k Data/Fax/Voice/Cell Modem (Mob SmartDAA)", |
" 2165 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob SmartDAA)", |
" 2166 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob SmartDAA)", |
" 2343 HSF 56k Data/Fax CardBus Modem (Mob WorldW SmartDAA)", |
" 2344 HSF 56k Data/Fax/Voice CardBus Modem (Mob WorldW SmartDAA)", |
" 2345 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob WorldW SmartDAA)", |
" 2346 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob WorldW SmartDAA)", |
" 2363 HSF 56k Data/Fax CardBus Modem (Mob SmartDAA)", |
" 2364 HSF 56k Data/Fax/Voice CardBus Modem (Mob SmartDAA)", |
" 2365 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA)", |
" 2366 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA)", |
" 2443 HSF 56k Data/Fax Modem (Mob WorldW SmartDAA)", |
" 104d 8075 Modem", |
" 104d 8083 Modem", |
" 104d 8097 Modem", |
" 2444 HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA)", |
" 2445 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA)", |
" 2446 HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA)", |
" 2463 HSF 56k Data/Fax Modem (Mob SmartDAA)", |
" 2464 HSF 56k Data/Fax/Voice Modem (Mob SmartDAA)", |
" 2465 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob SmartDAA)", |
" 2466 HSF 56k Data/Fax/Voice/Spkp Modem (Mob SmartDAA)", |
" 2bfa HDAudio Soft Data Fax Modem with SmartCP", |
" 2f00 HSF 56k HSFi Modem", |
" 13e0 8d84 IBM HSFi V.90", |
" 13e0 8d85 Compaq Stinger", |
" 14f1 2004 Dynalink 56PMi", |
" 2f02 HSF 56k HSFi Data/Fax", |
" 2f11 HSF 56k HSFi Modem", |
" 2f20 HSF 56k Data/Fax Modem", |
" 8234 RS8234 ATM SAR Controller [ServiceSAR Plus]", |
" 8800 CX23880/1/2/3 PCI Video and Audio Decoder", |
" 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models", |
" 0070 3401 Hauppauge WinTV 34xxx models", |
" 0070 9001 Nova-T DVB-T", |
" 0070 9200 Nova-SE2 DVB-S", |
" 0070 9202 Nova-S-Plus DVB-S", |
" 0070 9402 WinTV-HVR1100 DVB-T/Hybrid", |
" 0070 9802 WinTV-HVR1100 DVB-T/Hybrid (Low Profile)", |
" 1002 00f8 ATI TV Wonder Pro", |
" 1002 a101 HDTV Wonder", |
" 1043 4823 ASUS PVR-416", |
" 107d 6613 Leadtek Winfast 2000XP Expert", |
" 107d 6620 Leadtek Winfast DV2000", |
" 107d 663c Leadtek PVR 2000", |
" 107d 665f WinFast DTV1000-T", |
" 10fc d003 IODATA GV-VCP3/PCI", |
" 10fc d035 IODATA GV/BCTV7E", |
" 1421 0334 Instant TV DVB-T PCI", |
" 1461 000a AVerTV 303 (M126)", |
" 1461 000b AverTV Studio 303 (M126)", |
" 1461 8011 UltraTV Media Center PCI 550", |
" 1462 8606 MSI TV-@nywhere Master", |
" 14c7 0107 GDI Black Gold", |
" 14f1 0187 Conexant DVB-T reference design", |
" 14f1 0342 Digital-Logic MICROSPACE Entertainment Center (MEC)", |
" 153b 1166 Cinergy 1400 DVB-T", |
" 1540 2580 Provideo PV259", |
" 1554 4811 PixelView", |
" 1554 4813 Club 3D ZAP1000 MCE Edition", |
" 17de 08a1 KWorld/VStream XPert DVB-T with cx22702", |
" 17de 08a6 KWorld/VStream XPert DVB-T", |
" 17de 08b2 KWorld DVB-S 100", |
" 17de a8a6 digitalnow DNTV Live! DVB-T", |
" 1822 0025 digitalnow DNTV Live! DVB-T Pro", |
" 18ac d500 FusionHDTV 5 Gold", |
" 18ac d810 FusionHDTV 3 Gold-Q", |
" 18ac d820 FusionHDTV 3 Gold-T", |
" 18ac db00 FusionHDTV DVB-T1", |
" 18ac db11 FusionHDTV DVB-T Plus", |
" 18ac db50 FusionHDTV DVB-T Dual Digital", |
" 7063 3000 pcHDTV HD3000 HDTV", |
" 8801 CX23880/1/2/3 PCI Video and Audio Decoder [Audio Port]", |
" 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models", |
" 8802 CX23880/1/2/3 PCI Video and Audio Decoder [MPEG Port]", |
" 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models", |
" 0070 9002 Nova-T DVB-T Model 909", |
" 1043 4823 ASUS PVR-416", |
" 107d 663c Leadtek PVR 2000", |
" 14f1 0187 Conexant DVB-T reference design", |
" 17de 08a1 XPert DVB-T PCI BDA DVBT 23880 Transport Stream Capture", |
" 17de 08a6 KWorld/VStream XPert DVB-T", |
" 18ac d500 DViCO FusionHDTV5 Gold", |
" 18ac d810 DViCO FusionHDTV3 Gold-Q", |
" 18ac d820 DViCO FusionHDTV3 Gold-T", |
" 18ac db00 DVICO FusionHDTV DVB-T1", |
" 18ac db10 DVICO FusionHDTV DVB-T Plus", |
" 7063 3000 pcHDTV HD3000 HDTV", |
" 8804 CX23880/1/2/3 PCI Video and Audio Decoder [IR Port]", |
" 0070 9002 Nova-T DVB-T Model 909", |
" 8811 CX23880/1/2/3 PCI Video and Audio Decoder [Audio Port]", |
" 0070 3401 Hauppauge WinTV 34xxx models", |
" 1462 8606 MSI TV-@nywhere Master", |
" 18ac d500 DViCO FusionHDTV5 Gold", |
" 18ac d810 DViCO FusionHDTV3 Gold-Q", |
" 18ac d820 DViCO FusionHDTV3 Gold-T", |
" 18ac db00 DVICO FusionHDTV DVB-T1", |
"14f2 MOBILITY Electronics", |
" 0120 EV1000 bridge", |
" 0121 EV1000 Parallel port", |
" 0122 EV1000 Serial port", |
" 0123 EV1000 Keyboard controller", |
" 0124 EV1000 Mouse controller", |
"14f3 BroadLogic", |
" 2030 2030 DVB-S Satellite Reciever", |
" 2050 2050 DVB-T Terrestrial (Cable) Reciever", |
" 2060 2060 ATSC Terrestrial (Cable) Reciever", |
"14f4 TOKYO Electronic Industry CO Ltd", |
"14f5 SOPAC Ltd", |
"14f6 COYOTE Technologies LLC", |
"14f7 WOLF Technology Inc", |
"14f8 AUDIOCODES Inc", |
" 2077 TP-240 dual span E1 VoIP PCI card", |
"14f9 AG COMMUNICATIONS", |
"14fa WANDEL & GOLTERMANN", |
"14fb TRANSAS MARINE (UK) Ltd", |
"14fc Quadrics Ltd", |
" 0000 QsNet Elan3 Network Adapter", |
" 0001 QsNetII Elan4 Network Adapter", |
" 0002 QsNetIII Elan5 Network Adapter", |
"14fd JAPAN Computer Industry Inc", |
"14fe ARCHTEK TELECOM Corp", |
"14ff TWINHEAD INTERNATIONAL Corp", |
"1500 DELTA Electronics, Inc", |
" 1360 RTL81xx RealTek Ethernet", |
"1501 BANKSOFT CANADA Ltd", |
"1502 MITSUBISHI ELECTRIC LOGISTICS SUPPORT Co Ltd", |
"1503 KAWASAKI LSI USA Inc", |
"1504 KAISER Electronics", |
"1505 ITA INGENIEURBURO FUR TESTAUFGABEN GmbH", |
"1506 CHAMELEON Systems Inc", |
"1507 Motorola ?? / HTEC", |
" 0001 MPC105 [Eagle]", |
" 0002 MPC106 [Grackle]", |
" 0003 MPC8240 [Kahlua]", |
" 0100 MC145575 [HFC-PCI]", |
" 0431 KTI829c 100VG", |
" 4801 Raven", |
" 4802 Falcon", |
" 4803 Hawk", |
" 4806 CPX8216", |
"1508 HONDA CONNECTORS/MHOTRONICS Inc", |
"1509 FIRST INTERNATIONAL Computer Inc", |
"150a FORVUS RESEARCH Inc", |
"150b YAMASHITA Systems Corp", |
"150c KYOPAL CO Ltd", |
"150d WARPSPPED Inc", |
"150e C-PORT Corp", |
"150f INTEC GmbH", |
"1510 BEHAVIOR TECH Computer Corp", |
"1511 CENTILLIUM Technology Corp", |
"1512 ROSUN Technologies Inc", |
"1513 Raychem", |
"1514 TFL LAN Inc", |
"1515 Advent design", |
"1516 MYSON Technology Inc", |
" 0800 MTD-8xx 100/10M Ethernet PCI Adapter", |
" 0803 SURECOM EP-320X-S 100/10M Ethernet PCI Adapter", |
" 1320 10bd SURECOM EP-320X-S 100/10M Ethernet PCI Adapter", |
" 0891 MTD-8xx 100/10M Ethernet PCI Adapter", |
"1517 ECHOTEK Corp", |
"1518 PEP MODULAR Computers GmbH", |
"1519 TELEFON AKTIEBOLAGET LM Ericsson", |
"151a Globetek", |
" 1002 PCI-1002", |
" 1004 PCI-1004", |
" 1008 PCI-1008", |
"151b COMBOX Ltd", |
"151c DIGITAL AUDIO LABS Inc", |
" 0003 Prodif T 2496", |
" 4000 Prodif 88", |
"151d Fujitsu Computer Products Of America", |
"151e MATRIX Corp", |
"151f TOPIC SEMICONDUCTOR Corp", |
" 0000 TP560 Data/Fax/Voice 56k modem", |
"1520 CHAPLET System Inc", |
"1521 BELL Corp", |
"1522 MainPine Ltd", |
" 0100 PCI <-> IOBus Bridge", |
" 1522 0200 RockForceDUO 2 Port V.92/V.44 Data/Fax/Voice Modem", |
" 1522 0300 RockForceQUATRO 4 Port V.92/V.44 Data/Fax/Voice Modem", |
" 1522 0400 RockForceDUO+ 2 Port V.92/V.44 Data/Fax/Voice Modem", |
" 1522 0500 RockForceQUATRO+ 4 Port V.92/V.44 Data/Fax/Voice Modem", |
" 1522 0600 RockForce+ 2 Port V.90 Data/Fax/Voice Modem", |
" 1522 0700 RockForce+ 4 Port V.90 Data/Fax/Voice Modem", |
" 1522 0800 RockForceOCTO+ 8 Port V.92/V.44 Data/Fax/Voice Modem", |
" 1522 0c00 RockForceDUO+ 2 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem", |
" 1522 0d00 RockForceQUATRO+ 4 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem", |
" 1522 1d00 RockForceOCTO+ 8 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem", |
" 1522 2000 RockForceD1 1 Port V.90 Data Modem", |
" 1522 2100 RockForceF1 1 Port V.34 Super-G3 Fax Modem", |
" 1522 2200 RockForceD2 2 Port V.90 Data Modem", |
" 1522 2300 RockForceF2 2 Port V.34 Super-G3 Fax Modem", |
" 1522 2400 RockForceD4 4 Port V.90 Data Modem", |
" 1522 2500 RockForceF4 4 Port V.34 Super-G3 Fax Modem", |
" 1522 2600 RockForceD8 8 Port V.90 Data Modem", |
" 1522 2700 RockForceF8 8 Port V.34 Super-G3 Fax Modem", |
"1523 MUSIC Semiconductors", |
"1524 ENE Technology Inc", |
" 0510 CB710 Memory Card Reader Controller", |
" 103c 006a NX9500", |
" 0520 FLASH memory: ENE Technology Inc:", |
" 0530 ENE PCI Memory Stick Card Reader Controller", |
" 0550 ENE PCI Secure Digital Card Reader Controller", |
" 0610 PCI Smart Card Reader Controller", |
" 1211 CB1211 Cardbus Controller", |
" 1225 CB1225 Cardbus Controller", |
" 1410 CB1410 Cardbus Controller", |
" 1025 003c CL50 motherboard", |
" 1025 005a TravelMate 290", |
" 1411 CB-710/2/4 Cardbus Controller", |
" 103c 006a NX9500", |
" 1412 CB-712/4 Cardbus Controller", |
" 1420 CB1420 Cardbus Controller", |
" 1421 CB-720/2/4 Cardbus Controller", |
" 1422 CB-722/4 Cardbus Controller", |
"1525 IMPACT Technologies", |
"1526 ISS, Inc", |
"1527 SOLECTRON", |
"1528 ACKSYS", |
"1529 AMERICAN MICROSystems Inc", |
"152a QUICKTURN DESIGN Systems", |
"152b FLYTECH Technology CO Ltd", |
"152c MACRAIGOR Systems LLC", |
"152d QUANTA Computer Inc", |
"152e MELEC Inc", |
"152f PHILIPS - CRYPTO", |
"1530 ACQIS Technology Inc", |
"1531 CHRYON Corp", |
"1532 ECHELON Corp", |
" 0020 LonWorks PCLTA-20 PCI LonTalk Adapter", |
"1533 BALTIMORE", |
"1534 ROAD Corp", |
"1535 EVERGREEN Technologies Inc", |
"1537 DATALEX COMMUNCATIONS", |
"1538 ARALION Inc", |
" 0303 ARS106S Ultra ATA 133/100/66 Host Controller", |
"1539 ATELIER INFORMATIQUES et ELECTRONIQUE ETUDES S.A.", |
"153a ONO SOKKI", |
"153b TERRATEC Electronic GmbH", |
" 1144 Aureon 5.1", |
" 1147 Aureon 5.1 Sky", |
" 1158 Philips Semiconductors SAA7134 (rev 01) [Terratec Cinergy 600 TV]", |
"153c ANTAL Electronic", |
"153d FILANET Corp", |
"153e TECHWELL Inc", |
"153f MIPS Technologies, Inc.", |
" 0001 SOC-it 101 System Controller", |
"1540 PROVIDEO MULTIMEDIA Co Ltd", |
"1541 MACHONE Communications", |
"1542 Concurrent Computer Corporation", |
"1543 SILICON Laboratories", |
" 3052 Intel 537 [Winmodem]", |
" 4c22 Si3036 MC'97 DAA", |
"1544 DCM DATA Systems", |
"1545 VISIONTEK", |
"1546 IOI Technology Corp", |
"1547 MITUTOYO Corp", |
"1548 JET PROPULSION Laboratory", |
"1549 INTERCONNECT Systems Solutions", |
"154a MAX Technologies Inc", |
"154b COMPUTEX Co Ltd", |
"154c VISUAL Technology Inc", |
"154d PAN INTERNATIONAL Industrial Corp", |
"154e SERVOTEST Ltd", |
"154f STRATABEAM Technology", |
"1550 OPEN NETWORK Co Ltd", |
"1551 SMART Electronic DEVELOPMENT GmBH", |
"1552 RACAL AIRTECH Ltd", |
"1553 CHICONY Electronics Co Ltd", |
"1554 PROLINK Microsystems Corp", |
"1555 GESYTEC GmBH", |
"1556 PLD APPLICATIONS", |
"1557 MEDIASTAR Co Ltd", |
"1558 CLEVO/KAPOK Computer", |
"1559 SI LOGIC Ltd", |
"155a INNOMEDIA Inc", |
"155b PROTAC INTERNATIONAL Corp", |
"155c Cemax-Icon Inc", |
"155d Mac System Co Ltd", |
"155e LP Elektronik GmbH", |
"155f Perle Systems Ltd", |
"1560 Terayon Communications Systems", |
"1561 Viewgraphics Inc", |
"1562 Symbol Technologies", |
"1563 A-Trend Technology Co Ltd", |
"1564 Yamakatsu Electronics Industry Co Ltd", |
"1565 Biostar Microtech Int'l Corp", |
"1566 Ardent Technologies Inc", |
"1567 Jungsoft", |
"1568 DDK Electronics Inc", |
"1569 Palit Microsystems Inc.", |
"156a Avtec Systems", |
"156b 2wire Inc", |
"156c Vidac Electronics GmbH", |
"156d Alpha-Top Corp", |
"156e Alfa Inc", |
"156f M-Systems Flash Disk Pioneers Ltd", |
"1570 Lecroy Corp", |
"1571 Contemporary Controls", |
" a001 CCSI PCI20-485 ARCnet", |
" a002 CCSI PCI20-485D ARCnet", |
" a003 CCSI PCI20-485X ARCnet", |
" a004 CCSI PCI20-CXB ARCnet", |
" a005 CCSI PCI20-CXS ARCnet", |
" a006 CCSI PCI20-FOG-SMA ARCnet", |
" a007 CCSI PCI20-FOG-ST ARCnet", |
" a008 CCSI PCI20-TB5 ARCnet", |
" a009 CCSI PCI20-5-485 5Mbit ARCnet", |
" a00a CCSI PCI20-5-485D 5Mbit ARCnet", |
" a00b CCSI PCI20-5-485X 5Mbit ARCnet", |
" a00c CCSI PCI20-5-FOG-ST 5Mbit ARCnet", |
" a00d CCSI PCI20-5-FOG-SMA 5Mbit ARCnet", |
" a201 CCSI PCI22-485 10Mbit ARCnet", |
" a202 CCSI PCI22-485D 10Mbit ARCnet", |
" a203 CCSI PCI22-485X 10Mbit ARCnet", |
" a204 CCSI PCI22-CHB 10Mbit ARCnet", |
" a205 CCSI PCI22-FOG_ST 10Mbit ARCnet", |
" a206 CCSI PCI22-THB 10Mbit ARCnet", |
"1572 Otis Elevator Company", |
"1573 Lattice - Vantis", |
"1574 Fairchild Semiconductor", |
"1575 Voltaire Advanced Data Security Ltd", |
"1576 Viewcast COM", |
"1578 HITT", |
" 5615 VPMK3 [Video Processor Mk III]", |
"1579 Dual Technology Corp", |
"157a Japan Elecronics Ind Inc", |
"157b Star Multimedia Corp", |
"157c Eurosoft (UK)", |
" 8001 Fix2000 PCI Y2K Compliance Card", |
"157d Gemflex Networks", |
"157e Transition Networks", |
"157f PX Instruments Technology Ltd", |
"1580 Primex Aerospace Co", |
"1581 SEH Computertechnik GmbH", |
"1582 Cytec Corp", |
"1583 Inet Technologies Inc", |
"1584 Uniwill Computer Corp", |
"1585 Logitron", |
"1586 Lancast Inc", |
"1587 Konica Corp", |
"1588 Solidum Systems Corp", |
"1589 Atlantek Microsystems Pty Ltd", |
"158a Digalog Systems Inc", |
"158b Allied Data Technologies", |
"158c Hitachi Semiconductor & Devices Sales Co Ltd", |
"158d Point Multimedia Systems", |
"158e Lara Technology Inc", |
"158f Ditect Coop", |
"1590 3pardata Inc", |
"1591 ARN", |
"1592 Syba Tech Ltd", |
" 0781 Multi-IO Card", |
" 0782 Parallel Port Card 2xEPP", |
" 0783 Multi-IO Card", |
" 0785 Multi-IO Card", |
" 0786 Multi-IO Card", |
" 0787 Multi-IO Card", |
" 0788 Multi-IO Card", |
" 078a Multi-IO Card", |
"1593 Bops Inc", |
"1594 Netgame Ltd", |
"1595 Diva Systems Corp", |
"1596 Folsom Research Inc", |
"1597 Memec Design Services", |
"1598 Granite Microsystems", |
"1599 Delta Electronics Inc", |
"159a General Instrument", |
"159b Faraday Technology Corp", |
"159c Stratus Computer Systems", |
"159d Ningbo Harrison Electronics Co Ltd", |
"159e A-Max Technology Co Ltd", |
"159f Galea Network Security", |
"15a0 Compumaster SRL", |
"15a1 Geocast Network Systems", |
"15a2 Catalyst Enterprises Inc", |
" 0001 TA700 PCI Bus Analyzer/Exerciser", |
"15a3 Italtel", |
"15a4 X-Net OY", |
"15a5 Toyota Macs Inc", |
"15a6 Sunlight Ultrasound Technologies Ltd", |
"15a7 SSE Telecom Inc", |
"15a8 Shanghai Communications Technologies Center", |
"15aa Moreton Bay", |
"15ab Bluesteel Networks Inc", |
"15ac North Atlantic Instruments", |
"15ad VMware Inc", |
" 0405 [VMware SVGA II] PCI Display Adapter", |
" 0710 Virtual SVGA", |
" 0720 VMware High-Speed Virtual NIC [vmxnet]", |
"15ae Amersham Pharmacia Biotech", |
"15b0 Zoltrix International Ltd", |
"15b1 Source Technology Inc", |
"15b2 Mosaid Technologies Inc", |
"15b3 Mellanox Technologies", |
" 5274 MT21108 InfiniBridge", |
" 5a44 MT23108 InfiniHost", |
" 5a45 MT23108 [Infinihost HCA Flash Recovery]", |
" 5a46 MT23108 PCI Bridge", |
" 5e8d MT25204 [InfiniHost III Lx HCA Flash Recovery]", |
" 6274 MT25204 [InfiniHost III Lx HCA]", |
" 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)", |
" 6279 MT25208 [InfiniHost III Ex HCA Flash Recovery]", |
" 6282 MT25208 InfiniHost III Ex", |
"15b4 CCI/TRIAD", |
"15b5 Cimetrics Inc", |
"15b6 Texas Memory Systems Inc", |
"15b7 Sandisk Corp", |
"15b8 ADDI-DATA GmbH", |
"15b9 Maestro Digital Communications", |
"15ba Impacct Technology Corp", |
"15bb Portwell Inc", |
"15bc Agilent Technologies", |
" 1100 E8001-66442 PCI Express CIC", |
" 2922 64 Bit, 133MHz PCI-X Exerciser & Protocol Checker", |
" 2928 64 Bit, 66MHz PCI Exerciser & Analyzer", |
" 2929 64 Bit, 133MHz PCI-X Analyzer & Exerciser", |
"15bd DFI Inc", |
"15be Sola Electronics", |
"15bf High Tech Computer Corp (HTC)", |
"15c0 BVM Ltd", |
"15c1 Quantel", |
"15c2 Newer Technology Inc", |
"15c3 Taiwan Mycomp Co Ltd", |
"15c4 EVSX Inc", |
"15c5 Procomp Informatics Ltd", |
" 8010 1394b - 1394 Firewire 3-Port Host Adapter Card", |
"15c6 Technical University of Budapest", |
"15c7 Tateyama System Laboratory Co Ltd", |
" 0349 Tateyama C-PCI PLC/NC card Rev.01A", |
"15c8 Penta Media Co Ltd", |
"15c9 Serome Technology Inc", |
"15ca Bitboys OY", |
"15cb AG Electronics Ltd", |
"15cc Hotrail Inc", |
"15cd Dreamtech Co Ltd", |
"15ce Genrad Inc", |
"15cf Hilscher GmbH", |
"15d1 Infineon Technologies AG", |
"15d2 FIC (First International Computer Inc)", |
"15d3 NDS Technologies Israel Ltd", |
"15d4 Iwill Corp", |
"15d5 Tatung Co", |
"15d6 Entridia Corp", |
"15d7 Rockwell-Collins Inc", |
"15d8 Cybernetics Technology Co Ltd", |
"15d9 Super Micro Computer Inc", |
"15da Cyberfirm Inc", |
"15db Applied Computing Systems Inc", |
"15dc Litronic Inc", |
" 0001 Argus 300 PCI Cryptography Module", |
"15dd Sigmatel Inc", |
"15de Malleable Technologies Inc", |
"15df Infinilink Corp", |
"15e0 Cacheflow Inc", |
"15e1 Voice Technologies Group Inc", |
"15e2 Quicknet Technologies Inc", |
"15e3 Networth Technologies Inc", |
"15e4 VSN Systemen BV", |
"15e5 Valley technologies Inc", |
"15e6 Agere Inc", |
"15e7 Get Engineering Corp", |
"15e8 National Datacomm Corp", |
" 0130 Wireless PCI Card", |
"15e9 Pacific Digital Corp", |
" 1841 ADMA-100 DiscStaQ ATA Controller", |
"15ea Tokyo Denshi Sekei K.K.", |
"15eb Drsearch GmbH", |
"15ec Beckhoff GmbH", |
" 3101 FC3101 Profibus DP 1 Channel PCI", |
" 5102 FC5102", |
"15ed Macrolink Inc", |
"15ee In Win Development Inc", |
"15ef Intelligent Paradigm Inc", |
"15f0 B-Tree Systems Inc", |
"15f1 Times N Systems Inc", |
"15f2 Diagnostic Instruments Inc", |
"15f3 Digitmedia Corp", |
"15f4 Valuesoft", |
"15f5 Power Micro Research", |
"15f6 Extreme Packet Device Inc", |
"15f7 Banctec", |
"15f8 Koga Electronics Co", |
"15f9 Zenith Electronics Corp", |
"15fa J.P. Axzam Corp", |
"15fb Zilog Inc", |
"15fc Techsan Electronics Co Ltd", |
"15fd N-CUBED.NET", |
"15fe Kinpo Electronics Inc", |
"15ff Fastpoint Technologies Inc", |
"1600 Northrop Grumman - Canada Ltd", |
"1601 Tenta Technology", |
"1602 Prosys-tec Inc", |
"1603 Nokia Wireless Communications", |
"1604 Central System Research Co Ltd", |
"1605 Pairgain Technologies", |
"1606 Europop AG", |
"1607 Lava Semiconductor Manufacturing Inc", |
"1608 Automated Wagering International", |
"1609 Scimetric Instruments Inc", |
"1612 Telesynergy Research Inc.", |
"1619 FarSite Communications Ltd", |
" 0400 FarSync T2P (2 port X.21/V.35/V.24)", |
" 0440 FarSync T4P (4 port X.21/V.35/V.24)", |
" 0610 FarSync T1U (1 port X.21/V.35/V.24)", |
" 0620 FarSync T2U (2 port X.21/V.35/V.24)", |
" 0640 FarSync T4U (4 port X.21/V.35/V.24)", |
" 1610 FarSync TE1 (T1,E1)", |
" 2610 FarSync DSL-S1 (SHDSL)", |
"161f Rioworks", |
"1626 TDK Semiconductor Corp.", |
" 8410 RTL81xx Fast Ethernet", |
"1629 Kongsberg Spacetec AS", |
" 1003 Format synchronizer v3.0", |
" 2002 Fast Universal Data Output", |
"1637 Linksys", |
" 3874 Linksys 802.11b WMP11 PCI Wireless card", |
"1638 Standard Microsystems Corp [SMC]", |
" 1100 SMC2602W EZConnect / Addtron AWA-100 / Eumitcom PCI WL11000", |
"163c Smart Link Ltd.", |
" 3052 SmartLink SmartPCI562 56K Modem", |
" 5449 SmartPCI561 Modem", |
"1657 Brocade Communications Systems, Inc.", |
"165a Epix Inc", |
" c100 PIXCI(R) CL1 Camera Link Video Capture Board [custom QL5232]", |
" d200 PIXCI(R) D2X Digital Video Capture Board [custom QL5232]", |
" d300 PIXCI(R) D3X Digital Video Capture Board [custom QL5232]", |
"165d Hsing Tech. Enterprise Co., Ltd.", |
"165f Linux Media Labs, LLC", |
" 1020 LMLM4 MPEG-4 encoder", |
"1661 Worldspace Corp.", |
"1668 Actiontec Electronics Inc", |
" 0100 Mini-PCI bridge", |
"166d Broadcom Corporation", |
" 0001 SiByte BCM1125/1125H/1250 System-on-a-Chip PCI", |
" 0002 SiByte BCM1125H/1250 System-on-a-Chip HyperTransport", |
"1677 Bernecker + Rainer", |
" 104e 5LS172.6 B&R Dual CAN Interface Card", |
" 12d7 5LS172.61 B&R Dual CAN Interface Card", |
"167b ZyDAS Technology Corp.", |
" 2102 ZyDAS ZD1202", |
" 187e 3406 ZyAIR B-122 CardBus 11Mbs Wireless LAN Card", |
"1681 Hercules", |
" 0010 Hercules 3d Prophet II Ultra 64MB (350 MHz NV15BR core)", |
"1682 XFX Pine Group Inc.", |
"1688 CastleNet Technology Inc.", |
" 1170 WLAN 802.11b card", |
"168c Atheros Communications, Inc.", |
" 0007 AR5000 802.11a Wireless Adapter", |
" 0011 AR5210 802.11a NIC", |
" 0012 AR5211 802.11ab NIC", |
" 0013 AR5212 802.11abg NIC", |
" 1113 d301 Philips CPWNA100 Wireless CardBus adapter", |
" 1186 3202 D-link DWL-G650 (Rev B3,B5) Wireless cardbus adapter", |
" 1186 3203 DWL-G520 Wireless PCI Adapter", |
" 1186 3a12 D-Link AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C)", |
" 1186 3a13 D-Link AirPlus DWL-G520 Wireless PCI Adapter(rev.B)", |
" 1186 3a14 D-Link AirPremier DWL-AG530 Wireless PCI Adapter", |
" 1186 3a17 D-Link AirPremier DWL-G680 Wireless Cardbus Adapter", |
" 1186 3a18 D-Link AirPremier DWL-G550 Wireless PCI Adapter", |
" 1186 3a63 D-Link AirPremier DWL-AG660 Wireless Cardbus Adapter", |
" 1186 3a94 C54C Wireless 801.11g cardbus", |
" 1186 3ab0 Allnet ALL0281 Wireless PCI Card", |
" 1385 4d00 Netgear WG311T Wireless PCI Adapter", |
" 1458 e911 Gigabyte GN-WIAG02", |
" 14b7 0a60 8482-WD ORiNOCO 11a/b/g Wireless PCI Adapter", |
" 168c 0013 AirPlus XtremeG DWL-G650 Wireless PCMCIA Adapter", |
" 168c 1025 DWL-G650B2 Wireless CardBus Adapter", |
" 168c 1027 Netgate NL-3054CB ARIES b/g CardBus Adapter", |
" 168c 2026 Netgate 5354MP ARIES a(108Mb turbo)/b/g MiniPCI Adapter", |
" 168c 2041 Netgate 5354MP Plus ARIES2 b/g MiniPCI Adapter", |
" 168c 2042 Netgate 5354MP Plus ARIES2 a/b/g MiniPCI Adapter", |
" 16ab 7302 Trust Speedshare Turbo Pro Wireless PCI Adapter", |
" 185f 2012 Wistron NeWeb WLAN a+b+g model CB9", |
" 001a AR5005G 802.11abg NIC", |
" 1113 ee20 SMC Wireless CardBus Adapter 802.11g (SMCWCB-G EU)", |
" 1113 ee24 SMC Wireless PCI Card WPCI-G", |
" 1186 3a15 D-Link AirPlus G DWL-G630 Wireless Cardbus Adapter(rev.D)", |
" 1186 3a16 D-Link AirPlus G DWL-G510 Wireless PCI Adapter(rev.B)", |
" 1186 3a23 D-Link AirPlus G DWL-G520+A Wireless PCI Adapter", |
" 1186 3a24 D-Link AirPlus G DWL-G650+A Wireless Cardbus Adapter", |
" 168c 1052 TP-Link TL-WN510G Wireless CardBus Adapter", |
" 001b AR5006X 802.11abg NIC", |
" 1186 3a19 D-Link AirPremier AG DWL-AG660 Wireless Cardbus Adapter", |
" 1186 3a22 D-Link AirPremier AG DWL-AG530 Wireless PCI Adapter", |
" 168c 2062 EnGenius EMP-8602 (400mw)", |
" 168c 2063 EnGenius EMP-8602 (400mw)", |
" 0020 AR5005VL 802.11bg Wireless NIC", |
" 1014 AR5212 802.11abg NIC", |
"1695 EPoX Computer Co., Ltd.", |
"169c Netcell Corporation", |
" 0044 Revolution Storage Processing Card", |
"16a5 Tekram Technology Co.,Ltd.", |
"16ab Global Sun Technology Inc", |
" 1100 GL24110P", |
" 1101 PLX9052 PCMCIA-to-PCI Wireless LAN", |
" 1102 PCMCIA-to-PCI Wireless Network Bridge", |
" 8501 WL-8305 Wireless LAN PCI Adapter", |
"16ae Safenet Inc", |
" 1141 SafeXcel-1141", |
"16af SparkLAN Communications, Inc.", |
"16b4 Aspex Semiconductor Ltd", |
"16b8 Sonnet Technologies, Inc.", |
"16be Creatix Polymedia GmbH", |
"16c6 Micrel-Kendin", |
" 8695 Centaur KS8695 ARM processor", |
"16c8 Octasic Inc.", |
"16c9 EONIC B.V. The Netherlands", |
"16ca CENATEK Inc", |
" 0001 Rocket Drive DL", |
"16cd Densitron Technologies", |
"16ce Roland Corp.", |
"16d5 Acromag, Inc.", |
" 4d4e PMC482, APC482, AcPC482 Counter Timer Board", |
"16df PIKA Technologies Inc.", |
"16e3 European Space Agency", |
" 1e0f LEON2FT Processor", |
"16ec U.S. Robotics", |
" 00ff USR997900 10/100 Mbps PCI Network Card", |
" 0116 USR997902 10/100/1000 Mbps PCI Network Card", |
" 3685 Wireless Access PCI Adapter Model 022415", |
"16ed Sycron N. V.", |
" 1001 UMIO communication card", |
"16f3 Jetway Information Co., Ltd.", |
"16f4 Vweb Corp", |
" 8000 VW2010", |
"16f6 VideoTele.com, Inc.", |
"1702 Internet Machines Corporation (IMC)", |
"1705 Digital First, Inc.", |
"170b NetOctave", |
" 0100 NSP2000-SSL crypto accelerator", |
"170c YottaYotta Inc.", |
"1725 Vitesse Semiconductor", |
" 7174 VSC7174 PCI/PCI-X Serial ATA Host Bus Controller", |
"172a Accelerated Encryption", |
" 13c8 AEP SureWare Runner 1000V3", |
"1734 Fujitsu Siemens Computer GmbH", |
" 1078 Amilo Pro v2010", |
"1737 Linksys", |
" 0013 WMP54G Wireless Pci Card", |
" 0015 WMP54GS Wireless Pci Card", |
" 1032 Gigabit Network Adapter", |
" 1737 0015 EG1032 v2 Instant Gigabit Network Adapter", |
" 1737 0024 EG1032 v3 Instant Gigabit Network Adapter", |
" 1064 Gigabit Network Adapter", |
" 1737 0016 EG1064 v2 Instant Gigabit Network Adapter", |
" ab08 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" ab09 21x4x DEC-Tulip compatible 10/100 Ethernet", |
"173b Altima (nee Broadcom)", |
" 03e8 AC1000 Gigabit Ethernet", |
" 03e9 AC1001 Gigabit Ethernet", |
" 03ea AC9100 Gigabit Ethernet", |
" 173b 0001 AC1002", |
" 03eb AC1003 Gigabit Ethernet", |
"1743 Peppercon AG", |
" 8139 ROL/F-100 Fast Ethernet Adapter with ROL", |
"1749 RLX Technologies", |
"174b PC Partner Limited", |
"174d WellX Telecom SA", |
"175c AudioScience Inc", |
"175e Sanera Systems, Inc.", |
"1775 SBS Technologies", |
"1787 Hightech Information System Ltd.", |
"1796 Research Centre Juelich", |
" 0001 SIS1100 [Gigabit link]", |
" 0002 HOTlink", |
" 0003 Counter Timer", |
" 0004 CAMAC Controller", |
" 0005 PROFIBUS", |
" 0006 AMCC HOTlink", |
"1797 JumpTec h, GMBH", |
"1799 Belkin", |
" 6001 Wireless PCI Card - F5D6001", |
" 6020 Wireless PCMCIA Card - F5D6020", |
" 6060 Wireless PDA Card - F5D6060", |
" 7000 Wireless PCI Card - F5D7000", |
" 7010 BCM4306 802.11b/g Wireless Lan Controller F5D7010", |
"179c Data Patterns", |
" 0557 DP-PCI-557 [PCI 1553B]", |
" 0566 DP-PCI-566 [Intelligent PCI 1553B]", |
" 5031 DP-CPCI-5031-Synchro Module", |
" 5121 DP-CPCI-5121-IP Carrier", |
" 5211 DP-CPCI-5211-IP Carrier", |
" 5679 AGE Display Module", |
"17a0 Genesys Logic, Inc", |
" 8033 GL880S USB 1.1 controller", |
" 8034 GL880S USB 2.0 controller", |
"17aa Lenovo", |
"17af Hightech Information System Ltd.", |
"17b3 Hawking Technologies", |
" ab08 PN672TX 10/100 Ethernet", |
"17b4 Indra Networks, Inc.", |
" 0011 WebEnhance 100 GZIP Compression Card", |
"17c0 Wistron Corp.", |
"17c2 Newisys, Inc.", |
"17cb Airgo Networks Inc", |
"17cc NetChip Technology, Inc", |
" 2280 USB 2.0", |
"17cf Z-Com, Inc.", |
"17d3 Areca Technology Corp.", |
" 1110 ARC-1110 4-Port PCI-X to SATA RAID Controller", |
" 1120 ARC-1120 8-Port PCI-X to SATA RAID Controller", |
" 1130 ARC-1130 12-Port PCI-X to SATA RAID Controller", |
" 1160 ARC-1160 16-Port PCI-X to SATA RAID Controller", |
" 1210 ARC-1210 4-Port PCI-Express to SATA RAID Controller", |
" 1220 ARC-1220 8-Port PCI-Express to SATA RAID Controller", |
" 1230 ARC-1230 12-Port PCI-Express to SATA RAID Controller", |
" 1260 ARC-1260 16-Port PCI-Express to SATA RAID Controller", |
"17d5 S2io Inc.", |
" 5831 Xframe 10 Gigabit Ethernet PCI-X", |
" 103c 12d5 HP PCI-X 133MHz 10GbE SR Fiber", |
" 5832 Xframe II 10Gbps Ethernet", |
"17de KWorld Computer Co. Ltd.", |
"17ee Connect Components Ltd", |
"17f2 Albatron Corp.", |
"17fe Linksys, A Division of Cisco Systems", |
" 2120 WMP11v4 802.11b PCI card", |
" 2220 [AirConn] INPROCOMM IPN 2220 Wireless LAN Adapter (rev 01)", |
" 17fe 2220 WPC54G ver. 4", |
"17ff Benq Corporation", |
"1809 Lumanate, Inc.", |
"1813 Ambient Technologies Inc", |
" 4000 HaM controllerless modem", |
" 16be 0001 V9x HAM Data Fax Modem", |
" 4100 HaM plus Data Fax Modem", |
" 16be 0002 V9x HAM 1394", |
"1814 RaLink", |
" 0101 Wireless PCI Adapter RT2400 / RT2460", |
" 1043 0127 WiFi-b add-on Card", |
" 1462 6828 PC11B2 (MS-6828) Wireless 11b PCI Card", |
" 0200 RT2500 802.11g PCI [PC54G2]", |
" 0201 RT2500 802.11g Cardbus/mini-PCI", |
" 1043 130f WL-130g", |
" 1371 001e CWC-854 Wireless-G CardBus Adapter", |
" 1371 001f CWM-854 Wireless-G Mini PCI Adapter", |
" 1371 0020 CWP-854 Wireless-G PCI Adapter", |
" 1458 e381 GN-WMKG 802.11b/g Wireless CardBus Adapter", |
" 1458 e931 GN-WIKG 802.11b/g mini-PCI Adapter", |
" 1462 6835 Wireless 11G CardBus CB54G2", |
" 1737 0032 WMP54G 2.0 PCI Adapter", |
" 1799 700a F5D7000 Wireless G Desktop Network Card", |
" 1799 701a F5D7010 Wireless G Notebook Network Card", |
" 185f 22a0 CN-WF513 Wireless Cardbus Adapter", |
" 0301 RT2561/RT61 802.11g PCI", |
" 1186 3c08 DWL-G630 Rev E", |
" 1186 3c09 DWL-G510 Rev C", |
" 0302 RT2561/RT61 rev B 802.11g", |
" 1186 3c08 DWL-G630 Rev E", |
" 1186 3c09 DWL-G510 Rev C", |
" 0401 Ralink RT2600 802.11 MIMO", |
"1820 InfiniCon Systems Inc.", |
"1822 Twinhan Technology Co. Ltd", |
" 4e35 Mantis DTV PCI Bridge Controller [Ver 1.0]", |
"182d SiteCom Europe BV", |
" 3069 ISDN PCI DC-105V2", |
" 9790 WL-121 Wireless Network Adapter 100g+ [Ver.3]", |
"1830 Credence Systems Corporation", |
"183b MikroM GmbH", |
" 08a7 MVC100 DVI", |
" 08a8 MVC101 SDI", |
" 08a9 MVC102 DVI+Audio", |
"1849 ASRock Incorporation", |
"1851 Microtune, Inc.", |
"1852 Anritsu Corp.", |
"1853 SMSC Automotive Infotainment System Group", |
"1854 LG Electronics, Inc.", |
"185b Compro Technology, Inc.", |
"185f Wistron NeWeb Corp.", |
"1864 SilverBack", |
" 2110 ISNAP 2110", |
"1867 Topspin Communications", |
" 5a44 MT23108 InfiniHost HCA", |
" 5a45 MT23108 InfiniHost HCA flash recovery", |
" 5a46 MT23108 InfiniHost HCA bridge", |
" 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)", |
" 6282 MT25208 InfiniHost III Ex", |
"187e ZyXEL Communication Corporation", |
" 3403 ZyAir G-110 802.11g", |
" 340e M-302 802.11g XtremeMIMO", |
"1888 Varisys Ltd", |
" 0301 VMFX1 FPGA PMC module", |
" 0601 VSM2 dual PMC carrier", |
" 0710 VS14x series PowerPC PCI board", |
" 0720 VS24x series PowerPC PCI board", |
"188a Ample Communications, Inc", |
"1890 Egenera, Inc.", |
"1894 KNC One", |
"1896 B&B Electronics Manufacturing Company, Inc.", |
"18a1 Astute Networks Inc.", |
"18ac DViCO Corporation", |
" d500 FusionHDTV 5", |
" d810 FusionHDTV 3 Gold", |
" d820 FusionHDTV 3 Gold-T", |
"18b8 Ammasso", |
" b001 AMSO 1100 iWARP/RDMA Gigabit Ethernet Coprocessor", |
"18bc Info-Tek Corp.", |
"18c3 Micronas Semiconductor Holding AG", |
"18c8 Cray Inc", |
"18c9 ARVOO Engineering BV", |
"18ca XGI - Xabre Graphics Inc", |
" 0020 Volari Z7", |
" 0040 Volari V3XT/V5/V8", |
"18d2 Sitecom", |
" 3069 DC-105v2 ISDN controller", |
"18dd Artimi Inc", |
" 4c6f Artimi RTMI-100 UWB adapter", |
"18e6 MPL AG", |
" 0001 OSCI [Octal Serial Communication Interface]", |
"18ec Cesnet, z.s.p.o.", |
" c006 COMBO6", |
" 18ec d001 COMBO-4MTX", |
" 18ec d002 COMBO-4SFP", |
" 18ec d003 COMBO-4SFPRO", |
" 18ec d004 COMBO-2XFP", |
" c045 COMBO6E", |
" c050 COMBO-PTM", |
" c058 COMBO6X", |
" 18ec d001 COMBO-4MTX", |
" 18ec d002 COMBO-4SFP", |
" 18ec d003 COMBO-4SFPRO", |
" 18ec d004 COMBO-2XFP", |
"18f7 Commtech, Inc.", |
" 0001 Fastcom ESCC-PCI-335", |
" 0002 Fastcom 422/4-PCI-335", |
" 0004 Fastcom 422/2-PCI-335", |
" 0005 Fastcom IGESCC-PCI-ISO/1", |
" 000a Fastcom 232/4-PCI-335", |
"18fb Resilience Corporation", |
"1904 Hangzhou Silan Microelectronics Co., Ltd.", |
"1923 Sangoma Technologies Corp.", |
" 0100 A104d QUAD T1/E1 AFT card", |
" 0400 A104u Quad T1/E1 AFT", |
"1924 Level 5 Networks Inc.", |
"192e TransDimension", |
"1931 Option N.V.", |
" 000c Qualcomm MSM6275 UMTS chip", |
"1942 ClearSpeed Technology plc", |
" e511 CSX600 Advance Accelerator Board", |
"1957 Freescale Semiconductor Inc", |
" 0080 MPC8349E", |
" 0081 MPC8349", |
" 0082 MPC8347E TBGA", |
" 0083 MPC8347 TBGA", |
" 0084 MPC8347E PBGA", |
" 0085 MPC8347 PBGA", |
" 0086 MPC8343E", |
" 0087 MPC8343", |
"1958 Faster Technology, LLC.", |
"1966 Orad Hi-Tec Systems", |
" 1975 DVG64 family", |
"196a Sensory Networks Inc.", |
" 0101 NodalCore C-1000 Content Classification Accelerator", |
" 0102 NodalCore C-2000 Content Classification Accelerator", |
"197b JMicron Technologies, Inc.", |
" 2360 JMicron 20360/20363 AHCI Controller", |
" 2361 JMB361 AHCI/IDE", |
" 2363 JMicron 20360/20363 AHCI Controller", |
" 2365 JMB365 AHCI/IDE", |
" 2366 JMB366 AHCI/IDE", |
"1989 Montilio Inc.", |
" 0001 RapidFile Bridge", |
" 8001 RapidFile", |
"1993 Innominate Security Technologies AG", |
"199a Pulse-LINK, Inc.", |
"19a8 DAQDATA GmbH", |
"19ac Kasten Chase Applied Research", |
" 0001 ACA2400 Crypto Accelerator", |
"19ae Progeny Systems Corporation", |
" 0520 4135 HFT Interface Controller", |
"19d4 Quixant Limited", |
"19e2 Vector Informatik GmbH", |
"1a03 ASPEED Technology, Inc.", |
" 2000 AST2000", |
"1a08 Sierra semiconductor", |
" 0000 SC15064", |
"1a1d GFaI e.V.", |
"1a29 Fortinet, Inc.", |
"1b13 Jaton Corp", |
"1c1c Symphony", |
" 0001 82C101", |
"1d44 DPT", |
" a400 PM2x24/PM3224", |
"1de1 Tekram Technology Co.,Ltd.", |
" 0391 TRM-S1040", |
" 2020 DC-390", |
" 690c 690c", |
" dc29 DC290", |
"1fc0 Tumsan Oy", |
" 0300 E2200 Dual E1/Rawpipe Card", |
"1fc1 PathScale, Inc", |
" 000d InfiniPath HT-400", |
" 0010 InfiniPath PE-800", |
"1fce Cognio Inc.", |
" 0001 Spectrum Analyzer PC Card (SAgE)", |
"2000 Smart Link Ltd.", |
"2001 Temporal Research Ltd", |
"2003 Smart Link Ltd.", |
"2004 Smart Link Ltd.", |
"21c3 21st Century Computer Corp.", |
"22b8 Motorola, Inc.", |
"2348 Racore", |
" 2010 8142 100VG/AnyLAN", |
"2646 Kingston Technologies", |
"270b Xantel Corporation", |
"270f Chaintech Computer Co. Ltd", |
"2711 AVID Technology Inc.", |
"2a15 3D Vision(???)", |
"3000 Hansol Electronics Inc.", |
"3142 Post Impression Systems.", |
"3388 Hint Corp", |
" 0013 HiNT HC4 PCI to ISDN bridge, Multimedia audio controller", |
" 0014 HiNT HC4 PCI to ISDN bridge, Network controller", |
" 0020 HB6 Universal PCI-PCI bridge (transparent mode)", |
" 0021 HB6 Universal PCI-PCI bridge (non-transparent mode)", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1080 CT8 mainboard", |
" 4c53 1090 Cx9 mainboard", |
" 4c53 10a0 CA3/CR3 mainboard", |
" 4c53 3010 PPCI mezzanine (32-bit PMC)", |
" 4c53 3011 PPCI mezzanine (64-bit PMC)", |
" 4c53 4000 PMCCARR1 carrier board", |
" 0022 HiNT HB4 PCI-PCI Bridge (PCI6150)", |
" 0026 HB2 PCI-PCI Bridge", |
" 101a E.Band [AudioTrak Inca88]", |
" 101b E.Band [AudioTrak Inca88]", |
" 8011 VXPro II Chipset", |
" 3388 8011 VXPro II Chipset CPU to PCI Bridge", |
" 8012 VXPro II Chipset", |
" 3388 8012 VXPro II Chipset PCI to ISA Bridge", |
" 8013 VXPro II IDE", |
" 3388 8013 VXPro II Chipset EIDE Controller", |
"3411 Quantum Designs (H.K.) Inc", |
"3513 ARCOM Control Systems Ltd", |
"3842 eVga.com. Corp.", |
" c370 e-GeFORCE 6600 256 DDR PCI-e", |
"38ef 4Links", |
"3d3d 3DLabs", |
" 0001 GLINT 300SX", |
" 0002 GLINT 500TX", |
" 0000 0000 GLoria L", |
" 0003 GLINT Delta", |
" 0000 0000 GLoria XL", |
" 0004 Permedia", |
" 0005 Permedia", |
" 0006 GLINT MX", |
" 0000 0000 GLoria XL", |
" 1048 0a42 GLoria XXL", |
" 0007 3D Extreme", |
" 0008 GLINT Gamma G1", |
" 1048 0a42 GLoria XXL", |
" 0009 Permedia II 2D+3D", |
" 1040 0011 AccelStar II", |
" 1048 0a42 GLoria XXL", |
" 13e9 1000 6221L-4U", |
" 3d3d 0100 AccelStar II 3D Accelerator", |
" 3d3d 0111 Permedia 3:16", |
" 3d3d 0114 Santa Ana", |
" 3d3d 0116 Oxygen GVX1", |
" 3d3d 0119 Scirocco", |
" 3d3d 0120 Santa Ana PCL", |
" 3d3d 0125 Oxygen VX1", |
" 3d3d 0127 Permedia3 Create!", |
" 000a GLINT R3", |
" 3d3d 0121 Oxygen VX1", |
" 000c GLINT R3 [Oxygen VX1]", |
" 3d3d 0144 Oxygen VX1-4X AGP [Permedia 4]", |
" 000d GLint R4 rev A", |
" 0011 GLint R4 rev B", |
" 0012 GLint R5 rev A", |
" 0013 GLint R5 rev B", |
" 0020 VP10 visual processor", |
" 0022 VP10 visual processor", |
" 0024 VP9 visual processor", |
" 0100 Permedia II 2D+3D", |
" 07a1 Wildcat III 6210", |
" 07a2 Sun XVR-500 Graphics Accelerator", |
" 07a3 Wildcat IV 7210", |
" 1004 Permedia", |
" 3d04 Permedia", |
" ffff Glint VGA", |
"4005 Avance Logic Inc.", |
" 0300 ALS300 PCI Audio Device", |
" 0308 ALS300+ PCI Audio Device", |
" 0309 PCI Input Controller", |
" 1064 ALG-2064", |
" 2064 ALG-2064i", |
" 2128 ALG-2364A GUI Accelerator", |
" 2301 ALG-2301", |
" 2302 ALG-2302", |
" 2303 AVG-2302 GUI Accelerator", |
" 2364 ALG-2364A", |
" 2464 ALG-2464", |
" 2501 ALG-2564A/25128A", |
" 4000 ALS4000 Audio Chipset", |
" 4005 4000 ALS4000 Audio Chipset", |
" 4710 ALC200/200P", |
"4033 Addtron Technology Co, Inc.", |
" 1360 RTL8139 Ethernet", |
"4143 Digital Equipment Corp", |
"4144 Alpha Data", |
" 0044 ADM-XRCIIPro", |
"416c Aladdin Knowledge Systems", |
" 0100 AladdinCARD", |
" 0200 CPC", |
"4321 Tata Power Strategic Electronics Division", |
"4444 Internext Compression Inc", |
" 0016 iTVC16 (CX23416) MPEG-2 Encoder", |
" 0070 0003 WinTV PVR 250", |
" 0070 0009 WinTV PVR 150", |
" 0070 0801 WinTV PVR 150", |
" 0070 0807 WinTV PVR 150", |
" 0070 4001 WinTV PVR 250", |
" 0070 4009 WinTV PVR 250", |
" 0070 4801 WinTV PVR 250", |
" 0070 4803 WinTV PVR 250", |
" 0070 8003 WinTV PVR 150", |
" 0070 8801 WinTV PVR 150", |
" 0070 c801 WinTV PVR 150", |
" 0070 e807 WinTV PVR 500 (1st unit)", |
" 0070 e817 WinTV PVR 500 (2nd unit)", |
" 0070 ff92 WiNTV PVR-550", |
" 0270 0801 WinTV PVR 150", |
" 12ab fff3 MPG600", |
" 12ab ffff MPG600", |
" 9005 0092 VideOh! AVC-2010", |
" 9005 0093 VideOh! AVC-2410", |
" 0803 iTVC15 MPEG-2 Encoder", |
" 0070 4000 WinTV PVR-350", |
" 0070 4001 WinTV PVR-250", |
" 0070 4800 WinTV PVR-350 (V1)", |
" 12ab 0000 MPG160", |
" 1461 a3ce M179", |
" 1461 a3cf M179", |
"4468 Bridgeport machines", |
"4594 Cogetec Informatique Inc", |
"45fb Baldor Electric Company", |
"4680 Umax Computer Corp", |
"4843 Hercules Computer Technology Inc", |
"4916 RedCreek Communications Inc", |
" 1960 RedCreek PCI adapter", |
"4943 Growth Networks", |
"494f ACCES I/O Products, Inc.", |
" 10e8 LPCI-COM-8SM", |
"4978 Axil Computer Inc", |
"4a14 NetVin", |
" 5000 NV5000SC", |
" 4a14 5000 RT8029-Based Ethernet Adapter", |
"4b10 Buslogic Inc.", |
"4c48 LUNG HWA Electronics", |
"4c53 SBS Technologies", |
" 0000 PLUSTEST device", |
" 4c53 3000 PLUSTEST card (PC104+)", |
" 4c53 3001 PLUSTEST card (PMC)", |
" 0001 PLUSTEST-MM device", |
" 4c53 3002 PLUSTEST-MM card (PMC)", |
"4ca1 Seanix Technology Inc", |
"4d51 MediaQ Inc.", |
" 0200 MQ-200", |
"4d54 Microtechnica Co Ltd", |
"4ddc ILC Data Device Corp", |
" 0100 DD-42924I5-300 (ARINC 429 Data Bus)", |
" 0801 BU-65570I1 MIL-STD-1553 Test and Simulation", |
" 0802 BU-65570I2 MIL-STD-1553 Test and Simulation", |
" 0811 BU-65572I1 MIL-STD-1553 Test and Simulation", |
" 0812 BU-65572I2 MIL-STD-1553 Test and Simulation", |
" 0881 BU-65570T1 MIL-STD-1553 Test and Simulation", |
" 0882 BU-65570T2 MIL-STD-1553 Test and Simulation", |
" 0891 BU-65572T1 MIL-STD-1553 Test and Simulation", |
" 0892 BU-65572T2 MIL-STD-1553 Test and Simulation", |
" 0901 BU-65565C1 MIL-STD-1553 Data Bus", |
" 0902 BU-65565C2 MIL-STD-1553 Data Bus", |
" 0903 BU-65565C3 MIL-STD-1553 Data Bus", |
" 0904 BU-65565C4 MIL-STD-1553 Data Bus", |
" 0b01 BU-65569I1 MIL-STD-1553 Data Bus", |
" 0b02 BU-65569I2 MIL-STD-1553 Data Bus", |
" 0b03 BU-65569I3 MIL-STD-1553 Data Bus", |
" 0b04 BU-65569I4 MIL-STD-1553 Data Bus", |
"5046 GemTek Technology Corporation", |
" 1001 PCI Radio", |
"5053 Voyetra Technologies", |
" 2010 Daytona Audio Adapter", |
"5136 S S Technologies", |
"5143 Qualcomm Inc", |
"5145 Ensoniq (Old)", |
" 3031 Concert AudioPCI", |
"5168 Animation Technologies Inc.", |
" 0300 FlyDVB-S", |
" 0301 FlyDVB-T", |
"5301 Alliance Semiconductor Corp.", |
" 0001 ProMotion aT3D", |
"5333 S3 Inc.", |
" 0551 Plato/PX (system)", |
" 5631 86c325 [ViRGE]", |
" 8800 86c866 [Vision 866]", |
" 8801 86c964 [Vision 964]", |
" 8810 86c764_0 [Trio 32 vers 0]", |
" 8811 86c764/765 [Trio32/64/64V+]", |
" 8812 86cM65 [Aurora64V+]", |
" 8813 86c764_3 [Trio 32/64 vers 3]", |
" 8814 86c767 [Trio 64UV+]", |
" 8815 86cM65 [Aurora 128]", |
" 883d 86c988 [ViRGE/VX]", |
" 8870 FireGL", |
" 8880 86c868 [Vision 868 VRAM] vers 0", |
" 8881 86c868 [Vision 868 VRAM] vers 1", |
" 8882 86c868 [Vision 868 VRAM] vers 2", |
" 8883 86c868 [Vision 868 VRAM] vers 3", |
" 88b0 86c928 [Vision 928 VRAM] vers 0", |
" 88b1 86c928 [Vision 928 VRAM] vers 1", |
" 88b2 86c928 [Vision 928 VRAM] vers 2", |
" 88b3 86c928 [Vision 928 VRAM] vers 3", |
" 88c0 86c864 [Vision 864 DRAM] vers 0", |
" 88c1 86c864 [Vision 864 DRAM] vers 1", |
" 88c2 86c864 [Vision 864-P DRAM] vers 2", |
" 88c3 86c864 [Vision 864-P DRAM] vers 3", |
" 88d0 86c964 [Vision 964 VRAM] vers 0", |
" 88d1 86c964 [Vision 964 VRAM] vers 1", |
" 88d2 86c964 [Vision 964-P VRAM] vers 2", |
" 88d3 86c964 [Vision 964-P VRAM] vers 3", |
" 88f0 86c968 [Vision 968 VRAM] rev 0", |
" 88f1 86c968 [Vision 968 VRAM] rev 1", |
" 88f2 86c968 [Vision 968 VRAM] rev 2", |
" 88f3 86c968 [Vision 968 VRAM] rev 3", |
" 8900 86c755 [Trio 64V2/DX]", |
" 5333 8900 86C775 Trio64V2/DX", |
" 8901 86c775/86c785 [Trio 64V2/DX or /GX]", |
" 5333 8901 86C775 Trio64V2/DX, 86C785 Trio64V2/GX", |
" 8902 Plato/PX", |
" 8903 Trio 3D business multimedia", |
" 8904 Trio 64 3D", |
" 1014 00db Integrated Trio3D", |
" 5333 8904 86C365 Trio3D AGP", |
" 8905 Trio 64V+ family", |
" 8906 Trio 64V+ family", |
" 8907 Trio 64V+ family", |
" 8908 Trio 64V+ family", |
" 8909 Trio 64V+ family", |
" 890a Trio 64V+ family", |
" 890b Trio 64V+ family", |
" 890c Trio 64V+ family", |
" 890d Trio 64V+ family", |
" 890e Trio 64V+ family", |
" 890f Trio 64V+ family", |
" 8a01 ViRGE/DX or /GX", |
" 0e11 b032 ViRGE/GX", |
" 10b4 1617 Nitro 3D", |
" 10b4 1717 Nitro 3D", |
" 5333 8a01 ViRGE/DX", |
" 8a10 ViRGE/GX2", |
" 1092 8a10 Stealth 3D 4000", |
" 8a13 86c368 [Trio 3D/2X]", |
" 5333 8a13 Trio3D/2X", |
" 8a20 86c794 [Savage 3D]", |
" 5333 8a20 86C391 Savage3D", |
" 8a21 86c390 [Savage 3D/MV]", |
" 5333 8a21 86C390 Savage3D/MV", |
" 8a22 Savage 4", |
" 1033 8068 Savage 4", |
" 1033 8069 Savage 4", |
" 1033 8110 Savage 4 LT", |
" 105d 0018 SR9 8Mb SDRAM", |
" 105d 002a SR9 Pro 16Mb SDRAM", |
" 105d 003a SR9 Pro 32Mb SDRAM", |
" 105d 092f SR9 Pro+ 16Mb SGRAM", |
" 1092 4207 Stealth III S540", |
" 1092 4800 Stealth III S540", |
" 1092 4807 SpeedStar A90", |
" 1092 4808 Stealth III S540", |
" 1092 4809 Stealth III S540", |
" 1092 480e Stealth III S540", |
" 1092 4904 Stealth III S520", |
" 1092 4905 SpeedStar A200", |
" 1092 4a09 Stealth III S540", |
" 1092 4a0b Stealth III S540 Xtreme", |
" 1092 4a0f Stealth III S540", |
" 1092 4e01 Stealth III S540", |
" 1102 101d 3d Blaster Savage 4", |
" 1102 101e 3d Blaster Savage 4", |
" 5333 8100 86C394-397 Savage4 SDRAM 100", |
" 5333 8110 86C394-397 Savage4 SDRAM 110", |
" 5333 8125 86C394-397 Savage4 SDRAM 125", |
" 5333 8143 86C394-397 Savage4 SDRAM 143", |
" 5333 8a22 86C394-397 Savage4", |
" 5333 8a2e 86C394-397 Savage4 32bit", |
" 5333 9125 86C394-397 Savage4 SGRAM 125", |
" 5333 9143 86C394-397 Savage4 SGRAM 143", |
" 8a23 Savage 4", |
" 8a25 ProSavage PM133", |
" 8a26 ProSavage KM133", |
" 8c00 ViRGE/M3", |
" 8c01 ViRGE/MX", |
" 1179 0001 ViRGE/MX", |
" 8c02 ViRGE/MX+", |
" 8c03 ViRGE/MX+MV", |
" 8c10 86C270-294 Savage/MX-MV", |
" 8c11 82C270-294 Savage/MX", |
" 8c12 86C270-294 Savage/IX-MV", |
" 1014 017f Thinkpad T20/T22", |
" 1179 0001 86C584 SuperSavage/IXC Toshiba", |
" 8c13 86C270-294 Savage/IX", |
" 1179 0001 Magnia Z310", |
" 8c22 SuperSavage MX/128", |
" 8c24 SuperSavage MX/64", |
" 8c26 SuperSavage MX/64C", |
" 8c2a SuperSavage IX/128 SDR", |
" 8c2b SuperSavage IX/128 DDR", |
" 8c2c SuperSavage IX/64 SDR", |
" 8c2d SuperSavage IX/64 DDR", |
" 8c2e SuperSavage IX/C SDR", |
" 1014 01fc ThinkPad T23 (2647-4MG)", |
" 8c2f SuperSavage IX/C DDR", |
" 8d01 86C380 [ProSavageDDR K4M266]", |
" 8d02 VT8636A [ProSavage KN133] AGP4X VGA Controller (TwisterK)", |
" 8d03 VT8751 [ProSavageDDR P4M266]", |
" 8d04 VT8375 [ProSavage8 KM266/KL266]", |
" 9102 86C410 Savage 2000", |
" 1092 5932 Viper II Z200", |
" 1092 5934 Viper II Z200", |
" 1092 5952 Viper II Z200", |
" 1092 5954 Viper II Z200", |
" 1092 5a35 Viper II Z200", |
" 1092 5a37 Viper II Z200", |
" 1092 5a55 Viper II Z200", |
" 1092 5a57 Viper II Z200", |
" ca00 SonicVibes", |
"544c Teralogic Inc", |
" 0350 TL880-based HDTV/ATSC tuner", |
"5455 Technische University Berlin", |
" 4458 S5933", |
"5519 Cnet Technologies, Inc.", |
"5544 Dunord Technologies", |
" 0001 I-30xx Scanner Interface", |
"5555 Genroco, Inc", |
" 0003 TURBOstor HFP-832 [HiPPI NIC]", |
"5654 VoiceTronix Pty Ltd", |
" 3132 OpenSwitch12", |
"5700 Netpower", |
"5851 Exacq Technologies", |
"6356 UltraStor", |
"6374 c't Magazin fuer Computertechnik", |
" 6773 GPPCI", |
"6409 Logitec Corp.", |
"6666 Decision Computer International Co.", |
" 0001 PCCOM4", |
" 0002 PCCOM8", |
" 0004 PCCOM2", |
" 0101 PCI 8255/8254 I/O Card", |
"7063 pcHDTV", |
" 2000 HD-2000", |
" 3000 HD-3000", |
"7604 O.N. Electronic Co Ltd.", |
"7bde MIDAC Corporation", |
"7fed PowerTV", |
"8008 Quancom Electronic GmbH", |
" 0010 WDOG1 [PCI-Watchdog 1]", |
" 0011 PWDOG2 [PCI-Watchdog 2]", |
"807d Asustek Computer, Inc.", |
"8086 Intel Corporation", |
" 0007 82379AB", |
" 0008 Extended Express System Support Controller", |
" 0039 21145 Fast Ethernet", |
" 0122 82437FX", |
" 0309 80303 I/O Processor PCI-to-PCI Bridge", |
" 030d 80312 I/O Companion Chip PCI-to-PCI Bridge", |
" 0326 6700/6702PXH I/OxAPIC Interrupt Controller A", |
" 0327 6700PXH I/OxAPIC Interrupt Controller B", |
" 0329 6700PXH PCI Express-to-PCI Bridge A", |
" 032a 6700PXH PCI Express-to-PCI Bridge B", |
" 032c 6702PXH PCI Express-to-PCI Bridge A", |
" 0330 80332 [Dobson] I/O processor (A-Segment Bridge)", |
" 0331 80332 [Dobson] I/O processor (A-Segment IOAPIC)", |
" 0332 80332 [Dobson] I/O processor (B-Segment Bridge)", |
" 0333 80332 [Dobson] I/O processor (B-Segment IOAPIC)", |
" 0334 80332 [Dobson] I/O processor (ATU)", |
" 0335 80331 [Lindsay] I/O processor (PCI-X Bridge)", |
" 0336 80331 [Lindsay] I/O processor (ATU)", |
" 0340 41210 [Lanai] Serial to Parallel PCI Bridge (A-Segment Bridge)", |
" 0341 41210 [Lanai] Serial to Parallel PCI Bridge (B-Segment Bridge)", |
" 0370 80333 Segment-A PCI Express-to-PCI Express Bridge", |
" 0371 80333 A-Bus IOAPIC", |
" 0372 80333 Segment-B PCI Express-to-PCI Express Bridge", |
" 0373 80333 B-Bus IOAPIC", |
" 0374 80333 Address Translation Unit", |
" 0482 82375EB/SB PCI to EISA Bridge", |
" 0483 82424TX/ZX [Saturn] CPU to PCI bridge", |
" 0484 82378ZB/IB, 82379AB (SIO, SIO.A) PCI to ISA Bridge", |
" 0486 82425EX/ZX [Aries] PCIset with ISA bridge", |
" 04a3 82434LX/NX [Mercury/Neptune] Processor to PCI bridge", |
" 04d0 82437FX [Triton FX]", |
" 0500 E8870 Processor bus control", |
" 0501 E8870 Memory controller", |
" 0502 E8870 Scalability Port 0", |
" 0503 E8870 Scalability Port 1", |
" 0510 E8870IO Hub Interface Port 0 registers (8-bit compatibility port)", |
" 0511 E8870IO Hub Interface Port 1 registers", |
" 0512 E8870IO Hub Interface Port 2 registers", |
" 0513 E8870IO Hub Interface Port 3 registers", |
" 0514 E8870IO Hub Interface Port 4 registers", |
" 0515 E8870IO General SIOH registers", |
" 0516 E8870IO RAS registers", |
" 0530 E8870SP Scalability Port 0 registers", |
" 0531 E8870SP Scalability Port 1 registers", |
" 0532 E8870SP Scalability Port 2 registers", |
" 0533 E8870SP Scalability Port 3 registers", |
" 0534 E8870SP Scalability Port 4 registers", |
" 0535 E8870SP Scalability Port 5 registers", |
" 0536 E8870SP Interleave registers 0 and 1", |
" 0537 E8870SP Interleave registers 2 and 3", |
" 0600 RAID Controller", |
" 8086 01af SRCZCR", |
" 8086 01c1 ICP Vortex GDT8546RZ", |
" 8086 01f7 SCRU32", |
" 061f 80303 I/O Processor", |
" 0960 80960RP [i960 RP Microprocessor/Bridge]", |
" 0962 80960RM [i960RM Bridge]", |
" 0964 80960RP [i960 RP Microprocessor/Bridge]", |
" 1000 82542 Gigabit Ethernet Controller", |
" 0e11 b0df NC1632 Gigabit Ethernet Adapter (1000-SX)", |
" 0e11 b0e0 NC1633 Gigabit Ethernet Adapter (1000-LX)", |
" 0e11 b123 NC1634 Gigabit Ethernet Adapter (1000-SX)", |
" 1014 0119 Netfinity Gigabit Ethernet SX Adapter", |
" 8086 1000 PRO/1000 Gigabit Server Adapter", |
" 1001 82543GC Gigabit Ethernet Controller (Fiber)", |
" 0e11 004a NC6136 Gigabit Server Adapter", |
" 1014 01ea Netfinity Gigabit Ethernet SX Adapter", |
" 8086 1002 PRO/1000 F Server Adapter", |
" 8086 1003 PRO/1000 F Server Adapter", |
" 1002 Pro 100 LAN+Modem 56 Cardbus II", |
" 8086 200e Pro 100 LAN+Modem 56 Cardbus II", |
" 8086 2013 Pro 100 SR Mobile Combo Adapter", |
" 8086 2017 Pro 100 S Combo Mobile Adapter", |
" 1004 82543GC Gigabit Ethernet Controller (Copper)", |
" 0e11 0049 NC7132 Gigabit Upgrade Module", |
" 0e11 b1a4 NC7131 Gigabit Server Adapter", |
" 1014 10f2 Gigabit Ethernet Server Adapter", |
" 8086 1004 PRO/1000 T Server Adapter", |
" 8086 2004 PRO/1000 T Server Adapter", |
" 1008 82544EI Gigabit Ethernet Controller (Copper)", |
" 1014 0269 iSeries 1000/100/10 Ethernet Adapter", |
" 1028 011c PRO/1000 XT Network Connection", |
" 8086 1107 PRO/1000 XT Server Adapter", |
" 8086 2107 PRO/1000 XT Server Adapter", |
" 8086 2110 PRO/1000 XT Server Adapter", |
" 8086 3108 PRO/1000 XT Network Connection", |
" 1009 82544EI Gigabit Ethernet Controller (Fiber)", |
" 1014 0268 iSeries Gigabit Ethernet Adapter", |
" 8086 1109 PRO/1000 XF Server Adapter", |
" 8086 2109 PRO/1000 XF Server Adapter", |
" 100a 82540EM Gigabit Ethernet Controller", |
" 100c 82544GC Gigabit Ethernet Controller (Copper)", |
" 8086 1112 PRO/1000 T Desktop Adapter", |
" 8086 2112 PRO/1000 T Desktop Adapter", |
" 100d 82544GC Gigabit Ethernet Controller (LOM)", |
" 1028 0123 PRO/1000 XT Network Connection", |
" 1079 891f 82544GC Based Network Connection", |
" 4c53 1080 CT8 mainboard", |
" 8086 110d 82544GC Based Network Connection", |
" 100e 82540EM Gigabit Ethernet Controller", |
" 1014 0265 PRO/1000 MT Network Connection", |
" 1014 0267 PRO/1000 MT Network Connection", |
" 1014 026a PRO/1000 MT Network Connection", |
" 1024 0134 Poweredge SC600", |
" 1028 002e Optiplex GX260", |
" 1028 0151 PRO/1000 MT Network Connection", |
" 107b 8920 PRO/1000 MT Desktop Adapter", |
" 8086 001e PRO/1000 MT Desktop Adapter", |
" 8086 002e PRO/1000 MT Desktop Adapter", |
" 8086 1376 PRO/1000 GT Desktop Adapter", |
" 8086 1476 PRO/1000 GT Desktop Adapter", |
" 100f 82545EM Gigabit Ethernet Controller (Copper)", |
" 1014 0269 iSeries 1000/100/10 Ethernet Adapter", |
" 1014 028e PRO/1000 MT Network Connection", |
" 8086 1000 PRO/1000 MT Network Connection", |
" 8086 1001 PRO/1000 MT Server Adapter", |
" 1010 82546EB Gigabit Ethernet Controller (Copper)", |
" 0e11 00db NC7170 Gigabit Server Adapter", |
" 1014 027c PRO/1000 MT Dual Port Network Adapter", |
" 18fb 7872 RESlink-X", |
" 1fc1 0026 Niagara 2260 Bypass Card", |
" 4c53 1080 CT8 mainboard", |
" 4c53 10a0 CA3/CR3 mainboard", |
" 8086 1011 PRO/1000 MT Dual Port Server Adapter", |
" 8086 1012 Primergy RX300", |
" 8086 101a PRO/1000 MT Dual Port Network Adapter", |
" 8086 3424 SE7501HG2 Mainboard", |
" 1011 82545EM Gigabit Ethernet Controller (Fiber)", |
" 1014 0268 iSeries Gigabit Ethernet Adapter", |
" 8086 1002 PRO/1000 MF Server Adapter", |
" 8086 1003 PRO/1000 MF Server Adapter (LX)", |
" 1012 82546EB Gigabit Ethernet Controller (Fiber)", |
" 0e11 00dc NC6170 Gigabit Server Adapter", |
" 8086 1012 PRO/1000 MF Dual Port Server Adapter", |
" 1013 82541EI Gigabit Ethernet Controller (Copper)", |
" 8086 0013 PRO/1000 MT Network Connection", |
" 8086 1013 IBM ThinkCentre Network Card", |
" 8086 1113 PRO/1000 MT Desktop Adapter", |
" 1014 82541ER Gigabit Ethernet Controller", |
" 1015 82540EM Gigabit Ethernet Controller (LOM)", |
" 1016 82540EP Gigabit Ethernet Controller (LOM)", |
" 1014 052c PRO/1000 MT Mobile Connection", |
" 1179 0001 PRO/1000 MT Mobile Connection", |
" 8086 1016 PRO/1000 MT Mobile Connection", |
" 1017 82540EP Gigabit Ethernet Controller (LOM)", |
" 8086 1017 PR0/1000 MT Desktop Connection", |
" 1018 82541EI Gigabit Ethernet Controller", |
" 8086 1018 PRO/1000 MT Desktop Adapter", |
" 1019 82547EI Gigabit Ethernet Controller (LOM)", |
" 1458 1019 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1458 e000 Intel Gigabit Ethernet (Kenai II)", |
" 8086 1019 PRO/1000 CT Desktop Connection", |
" 8086 301f D865PERL mainboard", |
" 8086 302c Intel 82865G Mainboard (D865GBF)", |
" 8086 3427 S875WP1-E mainboard", |
" 101a 82547EI Gigabit Ethernet Controller (Mobile)", |
" 101d 82546EB Gigabit Ethernet Controller", |
" 8086 1000 PRO/1000 MT Quad Port Server Adapter", |
" 101e 82540EP Gigabit Ethernet Controller (Mobile)", |
" 1014 0549 PRO/1000 MT Mobile Connection", |
" 1179 0001 PRO/1000 MT Mobile Connection", |
" 8086 101e PRO/1000 MT Mobile Connection", |
" 1026 82545GM Gigabit Ethernet Controller", |
" 1028 0169 Precision 470", |
" 8086 1000 PRO/1000 MT Server Connection", |
" 8086 1001 PRO/1000 MT Server Adapter", |
" 8086 1002 PRO/1000 MT Server Adapter", |
" 8086 1026 PRO/1000 MT Server Connection", |
" 1027 82545GM Gigabit Ethernet Controller", |
" 103c 3103 NC310F PCI-X Gigabit Server Adapter", |
" 8086 1001 PRO/1000 MF Server Adapter(LX)", |
" 8086 1002 PRO/1000 MF Server Adapter(LX)", |
" 8086 1003 PRO/1000 MF Server Adapter(LX)", |
" 8086 1027 PRO/1000 MF Server Adapter", |
" 1028 82545GM Gigabit Ethernet Controller", |
" 8086 1028 PRO/1000 MB Server Adapter", |
" 1029 82559 Ethernet Controller", |
" 1030 82559 InBusiness 10/100", |
" 1031 82801CAM (ICH3) PRO/100 VE (LOM) Ethernet Controller", |
" 1014 0209 ThinkPad A/T/X Series", |
" 104d 80e7 Vaio PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 104d 813c Vaio PCG-GRV616G", |
" 107b 5350 EtherExpress PRO/100 VE", |
" 1179 0001 EtherExpress PRO/100 VE", |
" 144d c000 EtherExpress PRO/100 VE", |
" 144d c001 EtherExpress PRO/100 VE", |
" 144d c003 EtherExpress PRO/100 VE", |
" 144d c006 vpr Matrix 170B4", |
" 1032 82801CAM (ICH3) PRO/100 VE Ethernet Controller", |
" 1033 82801CAM (ICH3) PRO/100 VM (LOM) Ethernet Controller", |
" 1034 82801CAM (ICH3) PRO/100 VM Ethernet Controller", |
" 1035 82801CAM (ICH3)/82562EH (LOM) Ethernet Controller", |
" 1036 82801CAM (ICH3) 82562EH Ethernet Controller", |
" 1037 82801CAM (ICH3) Chipset Ethernet Controller", |
" 1038 82801CAM (ICH3) PRO/100 VM (KM) Ethernet Controller", |
" 0e11 0098 Evo N600c", |
" 1039 82801DB PRO/100 VE (LOM) Ethernet Controller", |
" 1014 0267 NetVista A30p", |
" 103a 82801DB PRO/100 VE (CNR) Ethernet Controller", |
" 103b 82801DB PRO/100 VM (LOM) Ethernet Controller", |
" 103c 82801DB PRO/100 VM (CNR) Ethernet Controller", |
" 103d 82801DB PRO/100 VE (MOB) Ethernet Controller", |
" 103e 82801DB PRO/100 VM (MOB) Ethernet Controller", |
" 1040 536EP Data Fax Modem", |
" 16be 1040 V.9X DSP Data Fax Modem", |
" 1043 PRO/Wireless LAN 2100 3B Mini PCI Adapter", |
" 8086 2527 MIM2000/Centrino", |
" 1048 PRO/10GbE LR Server Adapter", |
" 8086 a01f PRO/10GbE LR Server Adapter", |
" 8086 a11f PRO/10GbE LR Server Adapter", |
" 104b Ethernet Controller", |
" 1050 82562EZ 10/100 Ethernet Controller", |
" 1462 728c 865PE Neo2 (MS-6728)", |
" 1462 758c MS-6758 (875P Neo)", |
" 8086 3020 D865PERL mainboard", |
" 8086 302f Desktop Board D865GBF", |
" 8086 3427 S875WP1-E mainboard", |
" 1051 82801EB/ER (ICH5/ICH5R) integrated LAN Controller", |
" 1052 PRO/100 VM Network Connection", |
" 1053 PRO/100 VM Network Connection", |
" 1059 82551QM Ethernet Controller", |
" 105e 82571EB Gigabit Ethernet Controller", |
" 1775 6003 Telum GE-QT", |
" 105f 82571EB Gigabit Ethernet Controller", |
" 1060 82571EB Gigabit Ethernet Controller", |
" 1064 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller", |
" 1043 80f8 P5GD1-VW Mainboard", |
" 1065 82562ET/EZ/GT/GZ - PRO/100 VE Ethernet Controller", |
" 1066 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller", |
" 1067 82562 EM/EX/GX - PRO/100 VM Ethernet Controller", |
" 1068 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller Mobile", |
" 1069 82562EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller Mobile", |
" 106a 82562G - PRO/100 VE (LOM) Ethernet Controller", |
" 106b 82562G - PRO/100 VE Ethernet Controller Mobile", |
" 1075 82547GI Gigabit Ethernet Controller", |
" 1028 0165 PowerEdge 750", |
" 8086 0075 PRO/1000 CT Network Connection", |
" 8086 1075 PRO/1000 CT Network Connection", |
" 1076 82541GI/PI Gigabit Ethernet Controller", |
" 1028 0165 PowerEdge 750", |
" 1028 019a PowerEdge SC1425", |
" 8086 0076 PRO/1000 MT Network Connection", |
" 8086 1076 PRO/1000 MT Network Connection", |
" 8086 1176 PRO/1000 MT Desktop Adapter", |
" 8086 1276 PRO/1000 MT Desktop Adapter", |
" 1077 82541GI Gigabit Ethernet Controller", |
" 1179 0001 PRO/1000 MT Mobile Connection", |
" 8086 0077 PRO/1000 MT Mobile Connection", |
" 8086 1077 PRO/1000 MT Mobile Connection", |
" 1078 82541EI Gigabit Ethernet Controller", |
" 8086 1078 PRO/1000 MT Network Connection", |
" 1079 82546GB Gigabit Ethernet Controller", |
" 103c 12a6 HP Dual Port 1000Base-T [A9900A]", |
" 103c 12cf HP Core Dual Port 1000Base-T [AB352A]", |
" 1fc1 0027 Niagara 2261 Failover NIC", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 4c53 10b0 CL9 mainboard", |
" 8086 0079 PRO/1000 MT Dual Port Network Connection", |
" 8086 1079 PRO/1000 MT Dual Port Network Connection", |
" 8086 1179 PRO/1000 MT Dual Port Network Connection", |
" 8086 117a PRO/1000 MT Dual Port Server Adapter", |
" 107a 82546GB Gigabit Ethernet Controller", |
" 103c 12a8 HP Dual Port 1000base-SX [A9899A]", |
" 8086 107a PRO/1000 MF Dual Port Server Adapter", |
" 8086 127a PRO/1000 MF Dual Port Server Adapter", |
" 107b 82546GB Gigabit Ethernet Controller", |
" 8086 007b PRO/1000 MB Dual Port Server Connection", |
" 8086 107b PRO/1000 MB Dual Port Server Connection", |
" 107c 82541PI Gigabit Ethernet Controller", |
" 107d 82572EI Gigabit Ethernet Controller", |
" 107e 82572EI Gigabit Ethernet Controller", |
" 107f 82572EI Gigabit Ethernet Controller", |
" 1080 FA82537EP 56K V.92 Data/Fax Modem PCI", |
" 1081 Enterprise Southbridge LAN Copper", |
" 1082 Enterprise Southbridge LAN fiber", |
" 1083 Enterprise Southbridge LAN SERDES", |
" 1084 Enterprise Southbridge IDE Redirection", |
" 1085 Enterprise Southbridge Serial Port Redirection", |
" 1086 Enterprise Southbridge IPMI/KCS0", |
" 1087 Enterprise Southbridge UHCI Redirection", |
" 1089 Enterprise Southbridge BT", |
" 108a 82546EB Gigabit Ethernet Controller", |
" 108b 82573V Gigabit Ethernet Controller (Copper)", |
" 108c 82573E Gigabit Ethernet Controller (Copper)", |
" 108e 82573E KCS (Active Management)", |
" 108f Intel(R) Active Management Technology - SOL", |
" 1092 Intel(R) PRO/100 VE Network Connection", |
" 1096 PRO/1000 EB Network Connection with I/O Acceleration", |
" 1097 Enterprise Southbridge DPT LAN fiber", |
" 1098 PRO/1000 EB Backplane Connection with I/O Acceleration", |
" 1099 82546GB Quad Port Server Adapter", |
" 109a 82573L Gigabit Ethernet Controller", |
" 17aa 207e Thinkpad X60s", |
" 109b 82546GB PRO/1000 GF Quad Port Server Adapter", |
" 10a0 82571EB PRO/1000 AT Quad Port Bypass Adapter", |
" 10a1 82571EB PRO/1000 AF Quad Port Bypass Adapter", |
" 10b0 82573L PRO/1000 PL Network Connection", |
" 10b2 82573V PRO/1000 PM Network Connection", |
" 10b3 82573E PRO/1000 PM Network Connection", |
" 10b4 82573L PRO/1000 PL Network Connection", |
" 10b5 82546GB PRO/1000 GT Quad Port Server Adapter", |
" 103c 3109 NC340T PCI-X Quad-port Gigabit Server Adapter", |
" 1107 PRO/1000 MF Server Adapter (LX)", |
" 1130 82815 815 Chipset Host Bridge and Memory Controller Hub", |
" 1025 1016 Travelmate 612 TX", |
" 1043 8027 TUSL2-C Mainboard", |
" 104d 80df Vaio PCG-FX403", |
" 8086 4532 D815EEA2 mainboard", |
" 8086 4557 D815EGEW Mainboard", |
" 1131 82815 815 Chipset AGP Bridge", |
" 1132 82815 CGC [Chipset Graphics Controller]", |
" 1025 1016 Travelmate 612 TX", |
" 104d 80df Vaio PCG-FX403", |
" 8086 4532 D815EEA2 Mainboard", |
" 8086 4541 D815EEA Motherboard", |
" 8086 4557 D815EGEW Mainboard", |
" 1161 82806AA PCI64 Hub Advanced Programmable Interrupt Controller", |
" 8086 1161 82806AA PCI64 Hub APIC", |
" 1162 Xscale 80200 Big Endian Companion Chip", |
" 1200 Intel IXP1200 Network Processor", |
" 172a 0000 AEP SSL Accelerator", |
" 1209 8255xER/82551IT Fast Ethernet Controller", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" 4c53 1070 PC6 mainboard", |
" 1221 82092AA PCI to PCMCIA Bridge", |
" 1222 82092AA IDE Controller", |
" 1223 SAA7116", |
" 1225 82452KX/GX [Orion]", |
" 1226 82596 PRO/10 PCI", |
" 1227 82865 EtherExpress PRO/100A", |
" 1228 82556 EtherExpress PRO/100 Smart", |
" 1229 82557/8/9 [Ethernet Pro 100]", |
" 0e11 3001 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 3002 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 3003 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 3004 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 3005 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 3006 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 3007 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 b01e NC3120 Fast Ethernet NIC", |
" 0e11 b01f NC3122 Fast Ethernet NIC (dual port)", |
" 0e11 b02f NC1120 Ethernet NIC", |
" 0e11 b04a Netelligent 10/100TX NIC with Wake on LAN", |
" 0e11 b0c6 NC3161 Fast Ethernet NIC (embedded, WOL)", |
" 0e11 b0c7 NC3160 Fast Ethernet NIC (embedded)", |
" 0e11 b0d7 NC3121 Fast Ethernet NIC (WOL)", |
" 0e11 b0dd NC3131 Fast Ethernet NIC (dual port)", |
" 0e11 b0de NC3132 Fast Ethernet Module (dual port)", |
" 0e11 b0e1 NC3133 Fast Ethernet Module (100-FX)", |
" 0e11 b134 NC3163 Fast Ethernet NIC (embedded, WOL)", |
" 0e11 b13c NC3162 Fast Ethernet NIC (embedded)", |
" 0e11 b144 NC3123 Fast Ethernet NIC (WOL)", |
" 0e11 b163 NC3134 Fast Ethernet NIC (dual port)", |
" 0e11 b164 NC3135 Fast Ethernet Upgrade Module (dual port)", |
" 0e11 b1a4 NC7131 Gigabit Server Adapter", |
" 1014 005c 82558B Ethernet Pro 10/100", |
" 1014 01bc 82559 Fast Ethernet LAN On Motherboard", |
" 1014 01f1 10/100 Ethernet Server Adapter", |
" 1014 01f2 10/100 Ethernet Server Adapter", |
" 1014 0207 Ethernet Pro/100 S", |
" 1014 0232 10/100 Dual Port Server Adapter", |
" 1014 023a ThinkPad R30", |
" 1014 105c Netfinity 10/100", |
" 1014 2205 ThinkPad A22p", |
" 1014 305c 10/100 EtherJet Management Adapter", |
" 1014 405c 10/100 EtherJet Adapter with Alert on LAN", |
" 1014 505c 10/100 EtherJet Secure Management Adapter", |
" 1014 605c 10/100 EtherJet Secure Management Adapter", |
" 1014 705c 10/100 Netfinity 10/100 Ethernet Security Adapter", |
" 1014 805c 10/100 Netfinity 10/100 Ethernet Security Adapter", |
" 1028 009b PowerEdge 2500/2550", |
" 1028 00ce PowerEdge 1400", |
" 1033 8000 PC-9821X-B06", |
" 1033 8016 PK-UG-X006", |
" 1033 801f PK-UG-X006", |
" 1033 8026 PK-UG-X006", |
" 1033 8063 82559-based Fast Ethernet Adapter", |
" 1033 8064 82559-based Fast Ethernet Adapter", |
" 103c 10c0 NetServer 10/100TX", |
" 103c 10c3 NetServer 10/100TX", |
" 103c 10ca NetServer 10/100TX", |
" 103c 10cb NetServer 10/100TX", |
" 103c 10e3 NetServer 10/100TX", |
" 103c 10e4 NetServer 10/100TX", |
" 103c 1200 NetServer 10/100TX", |
" 108e 10cf EtherExpress PRO/100(B)", |
" 10c3 1100 SmartEther100 SC1100", |
" 10cf 1115 8255x-based Ethernet Adapter (10/100)", |
" 10cf 1143 8255x-based Ethernet Adapter (10/100)", |
" 110a 008b 82551QM Fast Ethernet Multifuction PCI/CardBus Controller", |
" 1179 0001 8255x-based Ethernet Adapter (10/100)", |
" 1179 0002 PCI FastEther LAN on Docker", |
" 1179 0003 8255x-based Fast Ethernet", |
" 1259 2560 AT-2560 100", |
" 1259 2561 AT-2560 100 FX Ethernet Adapter", |
" 1266 0001 NE10/100 Adapter", |
" 13e9 1000 6221L-4U", |
" 144d 2501 SEM-2000 MiniPCI LAN Adapter", |
" 144d 2502 SEM-2100IL MiniPCI LAN Adapter", |
" 1668 1100 EtherExpress PRO/100B (TX) (MiniPCI Ethernet+Modem)", |
" 4c53 1080 CT8 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 8086 0001 EtherExpress PRO/100B (TX)", |
" 8086 0002 EtherExpress PRO/100B (T4)", |
" 8086 0003 EtherExpress PRO/10+", |
" 8086 0004 EtherExpress PRO/100 WfM", |
" 8086 0005 82557 10/100", |
" 8086 0006 82557 10/100 with Wake on LAN", |
" 8086 0007 82558 10/100 Adapter", |
" 8086 0008 82558 10/100 with Wake on LAN", |
" 8086 000a EtherExpress PRO/100+ Management Adapter", |
" 8086 000b EtherExpress PRO/100+", |
" 8086 000c EtherExpress PRO/100+ Management Adapter", |
" 8086 000d EtherExpress PRO/100+ Alert On LAN II* Adapter", |
" 8086 000e EtherExpress PRO/100+ Management Adapter with Alert On LAN*", |
" 8086 000f EtherExpress PRO/100 Desktop Adapter", |
" 8086 0010 EtherExpress PRO/100 S Management Adapter", |
" 8086 0011 EtherExpress PRO/100 S Management Adapter", |
" 8086 0012 EtherExpress PRO/100 S Advanced Management Adapter (D)", |
" 8086 0013 EtherExpress PRO/100 S Advanced Management Adapter (E)", |
" 8086 0030 EtherExpress PRO/100 Management Adapter with Alert On LAN* GC", |
" 8086 0031 EtherExpress PRO/100 Desktop Adapter", |
" 8086 0040 EtherExpress PRO/100 S Desktop Adapter", |
" 8086 0041 EtherExpress PRO/100 S Desktop Adapter", |
" 8086 0042 EtherExpress PRO/100 Desktop Adapter", |
" 8086 0050 EtherExpress PRO/100 S Desktop Adapter", |
" 8086 1009 EtherExpress PRO/100+ Server Adapter", |
" 8086 100c EtherExpress PRO/100+ Server Adapter (PILA8470B)", |
" 8086 1012 EtherExpress PRO/100 S Server Adapter (D)", |
" 8086 1013 EtherExpress PRO/100 S Server Adapter (E)", |
" 8086 1015 EtherExpress PRO/100 S Dual Port Server Adapter", |
" 8086 1017 EtherExpress PRO/100+ Dual Port Server Adapter", |
" 8086 1030 EtherExpress PRO/100+ Management Adapter with Alert On LAN* G Server", |
" 8086 1040 EtherExpress PRO/100 S Server Adapter", |
" 8086 1041 EtherExpress PRO/100 S Server Adapter", |
" 8086 1042 EtherExpress PRO/100 Server Adapter", |
" 8086 1050 EtherExpress PRO/100 S Server Adapter", |
" 8086 1051 EtherExpress PRO/100 Server Adapter", |
" 8086 1052 EtherExpress PRO/100 Server Adapter", |
" 8086 10f0 EtherExpress PRO/100+ Dual Port Adapter", |
" 8086 2009 EtherExpress PRO/100 S Mobile Adapter", |
" 8086 200d EtherExpress PRO/100 Cardbus", |
" 8086 200e EtherExpress PRO/100 LAN+V90 Cardbus Modem", |
" 8086 200f EtherExpress PRO/100 SR Mobile Adapter", |
" 8086 2010 EtherExpress PRO/100 S Mobile Combo Adapter", |
" 8086 2013 EtherExpress PRO/100 SR Mobile Combo Adapter", |
" 8086 2016 EtherExpress PRO/100 S Mobile Adapter", |
" 8086 2017 EtherExpress PRO/100 S Combo Mobile Adapter", |
" 8086 2018 EtherExpress PRO/100 SR Mobile Adapter", |
" 8086 2019 EtherExpress PRO/100 SR Combo Mobile Adapter", |
" 8086 2101 EtherExpress PRO/100 P Mobile Adapter", |
" 8086 2102 EtherExpress PRO/100 SP Mobile Adapter", |
" 8086 2103 EtherExpress PRO/100 SP Mobile Adapter", |
" 8086 2104 EtherExpress PRO/100 SP Mobile Adapter", |
" 8086 2105 EtherExpress PRO/100 SP Mobile Adapter", |
" 8086 2106 EtherExpress PRO/100 P Mobile Adapter", |
" 8086 2107 EtherExpress PRO/100 Network Connection", |
" 8086 2108 EtherExpress PRO/100 Network Connection", |
" 8086 2200 EtherExpress PRO/100 P Mobile Combo Adapter", |
" 8086 2201 EtherExpress PRO/100 P Mobile Combo Adapter", |
" 8086 2202 EtherExpress PRO/100 SP Mobile Combo Adapter", |
" 8086 2203 EtherExpress PRO/100+ MiniPCI", |
" 8086 2204 EtherExpress PRO/100+ MiniPCI", |
" 8086 2205 EtherExpress PRO/100 SP Mobile Combo Adapter", |
" 8086 2206 EtherExpress PRO/100 SP Mobile Combo Adapter", |
" 8086 2207 EtherExpress PRO/100 SP Mobile Combo Adapter", |
" 8086 2208 EtherExpress PRO/100 P Mobile Combo Adapter", |
" 8086 2402 EtherExpress PRO/100+ MiniPCI", |
" 8086 2407 EtherExpress PRO/100+ MiniPCI", |
" 8086 2408 EtherExpress PRO/100+ MiniPCI", |
" 8086 2409 EtherExpress PRO/100+ MiniPCI", |
" 8086 240f EtherExpress PRO/100+ MiniPCI", |
" 8086 2410 EtherExpress PRO/100+ MiniPCI", |
" 8086 2411 EtherExpress PRO/100+ MiniPCI", |
" 8086 2412 EtherExpress PRO/100+ MiniPCI", |
" 8086 2413 EtherExpress PRO/100+ MiniPCI", |
" 8086 3000 82559 Fast Ethernet LAN on Motherboard", |
" 8086 3001 82559 Fast Ethernet LOM with Basic Alert on LAN*", |
" 8086 3002 82559 Fast Ethernet LOM with Alert on LAN II*", |
" 8086 3006 EtherExpress PRO/100 S Network Connection", |
" 8086 3007 EtherExpress PRO/100 S Network Connection", |
" 8086 3008 EtherExpress PRO/100 Network Connection", |
" 8086 3010 EtherExpress PRO/100 S Network Connection", |
" 8086 3011 EtherExpress PRO/100 S Network Connection", |
" 8086 3012 EtherExpress PRO/100 Network Connection", |
" 8086 3411 SDS2 Mainboard", |
" 122d 430FX - 82437FX TSC [Triton I]", |
" 122e 82371FB PIIX ISA [Triton I]", |
" 1230 82371FB PIIX IDE [Triton I]", |
" 1231 DSVD Modem", |
" 1234 430MX - 82371MX Mobile PCI I/O IDE Xcelerator (MPIIX)", |
" 1235 430MX - 82437MX Mob. System Ctrlr (MTSC) & 82438MX Data Path (MTDP)", |
" 1237 440FX - 82441FX PMC [Natoma]", |
" 1239 82371FB PIIX IDE Interface", |
" 123b 82380PB PCI to PCI Docking Bridge", |
" 123c 82380AB (MISA) Mobile PCI-to-ISA Bridge", |
" 123d 683053 Programmable Interrupt Device", |
" 123e 82466GX (IHPC) Integrated Hot-Plug Controller", |
" 123f 82466GX Integrated Hot-Plug Controller (IHPC)", |
" 1240 82752 (752) AGP Graphics Accelerator", |
" 124b 82380FB (MPCI2) Mobile Docking Controller", |
" 1250 430HX - 82439HX TXC [Triton II]", |
" 1360 82806AA PCI64 Hub PCI Bridge", |
" 1361 82806AA PCI64 Hub Controller (HRes)", |
" 8086 1361 82806AA PCI64 Hub Controller (HRes)", |
" 8086 8000 82806AA PCI64 Hub Controller (HRes)", |
" 1460 82870P2 P64H2 Hub PCI Bridge", |
" 1461 82870P2 P64H2 I/OxAPIC", |
" 15d9 3480 P4DP6", |
" 4c53 1090 Cx9/Vx9 mainboard", |
" 1462 82870P2 P64H2 Hot Plug Controller", |
" 1960 80960RP [i960RP Microprocessor]", |
" 101e 0431 MegaRAID 431 RAID Controller", |
" 101e 0438 MegaRAID 438 Ultra2 LVD RAID Controller", |
" 101e 0466 MegaRAID 466 Express Plus RAID Controller", |
" 101e 0467 MegaRAID 467 Enterprise 1500 RAID Controller", |
" 101e 0490 MegaRAID 490 Express 300 RAID Controller", |
" 101e 0762 MegaRAID 762 Express RAID Controller", |
" 101e 09a0 PowerEdge Expandable RAID Controller 2/SC", |
" 1028 0467 PowerEdge Expandable RAID Controller 2/DC", |
" 1028 1111 PowerEdge Expandable RAID Controller 2/SC", |
" 103c 03a2 MegaRAID", |
" 103c 10c6 MegaRAID 438, HP NetRAID-3Si", |
" 103c 10c7 MegaRAID T5, Integrated HP NetRAID", |
" 103c 10cc MegaRAID, Integrated HP NetRAID", |
" 103c 10cd HP NetRAID-1Si", |
" 105a 0000 SuperTrak", |
" 105a 2168 SuperTrak Pro", |
" 105a 5168 SuperTrak66/100", |
" 1111 1111 MegaRAID 466, PowerEdge Expandable RAID Controller 2/SC", |
" 1111 1112 PowerEdge Expandable RAID Controller 2/SC", |
" 113c 03a2 MegaRAID", |
" e4bf 1010 CG1-RADIO", |
" e4bf 1020 CU2-QUARTET", |
" e4bf 1040 CU1-CHORUS", |
" e4bf 3100 CX1-BAND", |
" 1962 80960RM [i960RM Microprocessor]", |
" 105a 0000 SuperTrak SX6000 I2O CPU", |
" 1a21 82840 840 (Carmel) Chipset Host Bridge (Hub A)", |
" 1a23 82840 840 (Carmel) Chipset AGP Bridge", |
" 1a24 82840 840 (Carmel) Chipset PCI Bridge (Hub B)", |
" 1a30 82845 845 (Brookdale) Chipset Host Bridge", |
" 1028 010e Optiplex GX240", |
" 1a31 82845 845 (Brookdale) Chipset AGP Bridge", |
" 1a38 Server DMA Engine", |
" 1a48 PRO/10GbE SR Server Adapter", |
" 2410 82801AA ISA Bridge (LPC)", |
" 2411 82801AA IDE", |
" 2412 82801AA USB", |
" 2413 82801AA SMBus", |
" 2415 82801AA AC'97 Audio", |
" 1028 0095 Precision Workstation 220 Integrated Digital Audio", |
" 110a 0051 Activy 2xx", |
" 11d4 0040 SoundMAX Integrated Digital Audio", |
" 11d4 0048 SoundMAX Integrated Digital Audio", |
" 11d4 5340 SoundMAX Integrated Digital Audio", |
" 1734 1025 Activy 3xx", |
" 2416 82801AA AC'97 Modem", |
" 2418 82801AA PCI Bridge", |
" 2420 82801AB ISA Bridge (LPC)", |
" 2421 82801AB IDE", |
" 2422 82801AB USB", |
" 2423 82801AB SMBus", |
" 2425 82801AB AC'97 Audio", |
" 11d4 0040 SoundMAX Integrated Digital Audio", |
" 11d4 0048 SoundMAX Integrated Digital Audio", |
" 2426 82801AB AC'97 Modem", |
" 2428 82801AB PCI Bridge", |
" 2440 82801BA ISA Bridge (LPC)", |
" 2442 82801BA/BAM USB (Hub #1)", |
" 1014 01c6 Netvista A40/A40p", |
" 1025 1016 Travelmate 612 TX", |
" 1028 010e Optiplex GX240", |
" 1043 8027 TUSL2-C Mainboard", |
" 104d 80df Vaio PCG-FX403", |
" 147b 0507 TH7II-RAID", |
" 8086 4532 D815EEA2 mainboard", |
" 8086 4557 D815EGEW Mainboard", |
" 2443 82801BA/BAM SMBus", |
" 1014 01c6 Netvista A40/A40p", |
" 1025 1016 Travelmate 612 TX", |
" 1028 010e Optiplex GX240", |
" 1043 8027 TUSL2-C Mainboard", |
" 104d 80df Vaio PCG-FX403", |
" 147b 0507 TH7II-RAID", |
" 8086 4532 D815EEA2 mainboard", |
" 8086 4557 D815EGEW Mainboard", |
" 2444 82801BA/BAM USB (Hub #2)", |
" 1025 1016 Travelmate 612 TX", |
" 1028 010e Optiplex GX240", |
" 1043 8027 TUSL2-C Mainboard", |
" 104d 80df Vaio PCG-FX403", |
" 147b 0507 TH7II-RAID", |
" 8086 4532 D815EEA2 mainboard", |
" 2445 82801BA/BAM AC'97 Audio", |
" 0e11 0088 Evo D500", |
" 1014 01c6 Netvista A40/A40p", |
" 1025 1016 Travelmate 612 TX", |
" 104d 80df Vaio PCG-FX403", |
" 1462 3370 STAC9721 AC", |
" 147b 0507 TH7II-RAID", |
" 8086 4557 D815EGEW Mainboard", |
" 2446 82801BA/BAM AC'97 Modem", |
" 1025 1016 Travelmate 612 TX", |
" 104d 80df Vaio PCG-FX403", |
" 2448 82801 Mobile PCI Bridge", |
" 103c 099c NX6110/NC6120", |
" 1734 1055 Amilo M1420", |
" 2449 82801BA/BAM/CA/CAM Ethernet Controller", |
" 0e11 0012 EtherExpress PRO/100 VM", |
" 0e11 0091 EtherExpress PRO/100 VE", |
" 1014 01ce EtherExpress PRO/100 VE", |
" 1014 01dc EtherExpress PRO/100 VE", |
" 1014 01eb EtherExpress PRO/100 VE", |
" 1014 01ec EtherExpress PRO/100 VE", |
" 1014 0202 EtherExpress PRO/100 VE", |
" 1014 0205 EtherExpress PRO/100 VE", |
" 1014 0217 EtherExpress PRO/100 VE", |
" 1014 0234 EtherExpress PRO/100 VE", |
" 1014 023d EtherExpress PRO/100 VE", |
" 1014 0244 EtherExpress PRO/100 VE", |
" 1014 0245 EtherExpress PRO/100 VE", |
" 1014 0265 PRO/100 VE Desktop Connection", |
" 1014 0267 PRO/100 VE Desktop Connection", |
" 1014 026a PRO/100 VE Desktop Connection", |
" 109f 315d EtherExpress PRO/100 VE", |
" 109f 3181 EtherExpress PRO/100 VE", |
" 1179 ff01 PRO/100 VE Network Connection", |
" 1186 7801 EtherExpress PRO/100 VE", |
" 144d 2602 HomePNA 1M CNR", |
" 8086 3010 EtherExpress PRO/100 VE", |
" 8086 3011 EtherExpress PRO/100 VM", |
" 8086 3012 82562EH based Phoneline", |
" 8086 3013 EtherExpress PRO/100 VE", |
" 8086 3014 EtherExpress PRO/100 VM", |
" 8086 3015 82562EH based Phoneline", |
" 8086 3016 EtherExpress PRO/100 P Mobile Combo", |
" 8086 3017 EtherExpress PRO/100 P Mobile", |
" 8086 3018 EtherExpress PRO/100", |
" 244a 82801BAM IDE U100", |
" 1025 1016 Travelmate 612TX", |
" 104d 80df Vaio PCG-FX403", |
" 244b 82801BA IDE U100", |
" 1014 01c6 Netvista A40/A40p", |
" 1028 010e Optiplex GX240", |
" 1043 8027 TUSL2-C Mainboard", |
" 147b 0507 TH7II-RAID", |
" 8086 4532 D815EEA2 mainboard", |
" 8086 4557 D815EGEW Mainboard", |
" 244c 82801BAM ISA Bridge (LPC)", |
" 244e 82801 PCI Bridge", |
" 1014 0267 NetVista A30p", |
" 2450 82801E ISA Bridge (LPC)", |
" 2452 82801E USB", |
" 2453 82801E SMBus", |
" 2459 82801E Ethernet Controller 0", |
" 245b 82801E IDE U100", |
" 245d 82801E Ethernet Controller 1", |
" 245e 82801E PCI Bridge", |
" 2480 82801CA LPC Interface Controller", |
" 2482 82801CA/CAM USB (Hub #1)", |
" 0e11 0030 Evo N600c", |
" 1014 0220 ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 15d9 3480 P4DP6", |
" 8086 1958 vpr Matrix 170B4", |
" 8086 3424 SE7501HG2 Mainboard", |
" 8086 4541 Latitude C640", |
" 2483 82801CA/CAM SMBus Controller", |
" 1014 0220 ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 15d9 3480 P4DP6", |
" 8086 1958 vpr Matrix 170B4", |
" 2484 82801CA/CAM USB (Hub #2)", |
" 0e11 0030 Evo N600c", |
" 1014 0220 ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 15d9 3480 P4DP6", |
" 8086 1958 vpr Matrix 170B4", |
" 2485 82801CA/CAM AC'97 Audio Controller", |
" 1013 5959 Crystal WMD Audio Codec", |
" 1014 0222 ThinkPad T23 (2647-4MG) or A30/A30p (2652/2653)", |
" 1014 0508 ThinkPad T30", |
" 1014 051c ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 144d c006 vpr Matrix 170B4", |
" 2486 82801CA/CAM AC'97 Modem Controller", |
" 1014 0223 ThinkPad A/T/X Series", |
" 1014 0503 ThinkPad R31 2656BBG", |
" 1014 051a ThinkPad A/T/X Series", |
" 101f 1025 620 Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 134d 4c21 Dell Inspiron 2100 internal modem", |
" 144d 2115 vpr Matrix 170B4 internal modem", |
" 14f1 5421 MD56ORD V.92 MDC Modem", |
" 2487 82801CA/CAM USB (Hub #3)", |
" 0e11 0030 Evo N600c", |
" 1014 0220 ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 15d9 3480 P4DP6", |
" 8086 1958 vpr Matrix 170B4", |
" 248a 82801CAM IDE U100", |
" 0e11 0030 Evo N600c", |
" 1014 0220 ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 8086 1958 vpr Matrix 170B4", |
" 8086 4541 Latitude C640", |
" 248b 82801CA Ultra ATA Storage Controller", |
" 15d9 3480 P4DP6", |
" 248c 82801CAM ISA Bridge (LPC)", |
" 24c0 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge", |
" 1014 0267 NetVista A30p", |
" 1462 5800 845PE Max (MS-6580)", |
" 24c1 82801DBL (ICH4-L) IDE Controller", |
" 24c2 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1", |
" 1014 0267 NetVista A30p", |
" 1025 005a TravelMate 290", |
" 1028 0126 Optiplex GX260", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1462 5800 845PE Max (MS-6580)", |
" 1509 2990 Averatec 5110H laptop", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 1734 1055 Amilo M1420", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 8086 4541 Latitude D400", |
" 24c3 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller", |
" 1014 0267 NetVista A30p", |
" 1025 005a TravelMate 290", |
" 1028 0126 Optiplex GX260", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1458 24c2 GA-8PE667 Ultra", |
" 1462 5800 845PE Max (MS-6580)", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 1734 1055 Amilo M1420", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 24c4 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2", |
" 1014 0267 NetVista A30p", |
" 1025 005a TravelMate 290", |
" 1028 0126 Optiplex GX260", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1462 5800 845PE Max (MS-6580)", |
" 1509 2990 Averatec 5110H", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 8086 4541 Latitude D400", |
" 24c5 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller", |
" 0e11 00b8 Analog Devices Inc. codec [SoundMAX]", |
" 1014 0267 NetVista A30p", |
" 1025 005a TravelMate 290", |
" 1028 0139 Latitude D400", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1458 a002 GA-8PE667 Ultra", |
" 1462 5800 845PE Max (MS-6580)", |
" 1734 1005 D1451 (SCENIC N300, i845GV) Sigmatel STAC9750T", |
" 1734 1055 Amilo M1420", |
" 24c6 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller", |
" 1025 003c Aspire 2001WLCi (Compal CL50 motherboard) implementation", |
" 1025 005a TravelMate 290", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 24c7 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3", |
" 1014 0267 NetVista A30p", |
" 1025 005a TravelMate 290", |
" 1028 0126 Optiplex GX260", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1462 5800 845PE Max (MS-6580)", |
" 1509 2990 Averatec 5110H", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 8086 4541 Latitude D400", |
" 24ca 82801DBM (ICH4-M) IDE Controller", |
" 1025 005a TravelMate 290", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1734 1055 Amilo M1420", |
" 8086 4541 Latitude D400", |
" 24cb 82801DB (ICH4) IDE Controller", |
" 1014 0267 NetVista A30p", |
" 1028 0126 Optiplex GX260", |
" 1458 24c2 GA-8PE667 Ultra", |
" 1462 5800 845PE Max (MS-6580)", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 24cc 82801DBM (ICH4-M) LPC Interface Bridge", |
" 1734 1055 Amilo M1420", |
" 24cd 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller", |
" 1014 0267 NetVista A30p", |
" 1025 005a TravelMate 290", |
" 1028 011d Latitude D600", |
" 1028 0126 Optiplex GX260", |
" 1028 0139 Latitude D400", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1462 3981 845PE Max (MS-6580)", |
" 1509 1968 Averatec 5110H", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 1734 1055 Amilo M1420", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 24d0 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge", |
" 24d1 82801EB (ICH5) SATA Controller", |
" 1028 0169 Precision 470", |
" 1028 019a PowerEdge SC1425", |
" 103c 12bc d530 CMT (DG746A)", |
" 1043 80a6 P4P800 SE Mainboard", |
" 1458 24d1 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 15d9 4580 P4SCE Mainboard", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24d2 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1", |
" 1014 02ed xSeries server mainboard", |
" 1028 0169 Precision 470", |
" 1028 0183 PowerEdge 1800", |
" 1028 019a PowerEdge SC1425", |
" 103c 006a NX9500", |
" 103c 12bc d530 CMT (DG746A)", |
" 1043 80a6 P5P800-MX Mainboard", |
" 1458 24d2 GA-8IPE1000/8KNXP motherboard", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 15d9 4580 P4SCE Mainboard", |
" 1734 101c Primergy RX300 S2", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24d3 82801EB/ER (ICH5/ICH5R) SMBus Controller", |
" 1014 02ed xSeries server mainboard", |
" 1028 0156 Precision 360", |
" 1028 0169 Precision 470", |
" 1043 80a6 P4P800 Mainboard", |
" 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 15d9 4580 P4SCE Mainboard", |
" 1734 101c Primergy RX300 S2", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24d4 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2", |
" 1014 02ed xSeries server mainboard", |
" 1028 0169 Precision 470", |
" 1028 0183 PowerEdge 1800", |
" 1028 019a PowerEdge SC1425", |
" 103c 006a NX9500", |
" 103c 12bc d530 CMT (DG746A)", |
" 1043 80a6 P5P800-MX Mainboard", |
" 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 15d9 4580 P4SCE Mainboard", |
" 1734 101c Primergy RX300 S2", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24d5 82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller", |
" 1028 0169 Precision 470", |
" 103c 006a NX9500", |
" 103c 12bc d330 uT", |
" 1043 80f3 P4P800 Mainboard", |
" 1043 810f P5P800-MX Mainboard", |
" 1458 a002 GA-8IPE1000/8KNXP motherboard", |
" 1462 0080 65PE Neo2-V (MS-6788) mainboard", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 8086 a000 D865PERL mainboard", |
" 8086 e000 D865PERL mainboard", |
" 8086 e001 Desktop Board D865GBF", |
" 24d6 82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller", |
" 103c 006a NX9500", |
" 24d7 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #3", |
" 1014 02ed xSeries server mainboard", |
" 1028 0169 Precision 470", |
" 1028 0183 PowerEdge 1800", |
" 103c 006a NX9500", |
" 103c 12bc d530 CMT (DG746A)", |
" 1043 80a6 P5P800-MX Mainboard", |
" 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 15d9 4580 P4SCE Mainboard", |
" 1734 101c Primergy RX300 S2", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24db 82801EB/ER (ICH5/ICH5R) IDE Controller", |
" 1014 02ed xSeries server mainboard", |
" 1028 0169 Precision 470", |
" 1028 019a PowerEdge SC1425", |
" 103c 006a NX9500", |
" 103c 12bc d530 CMT (DG746A)", |
" 1043 80a6 P5P800-MX Mainboard", |
" 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 1462 7580 MSI 875P", |
" 15d9 4580 P4SCE Mainboard", |
" 1734 101c Primergy RX300 S2", |
" 8086 24db P4C800 Mainboard", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24dc 82801EB (ICH5) LPC Interface Bridge", |
" 24dd 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller", |
" 1014 02ed xSeries server mainboard", |
" 1028 0169 Precision 470", |
" 1028 0183 PowerEdge 1800", |
" 1028 019a PowerEdge SC1425", |
" 103c 006a NX9500", |
" 103c 12bc d530 CMT (DG746A)", |
" 1043 80a6 P5P800-MX Mainboard", |
" 1458 5006 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24de 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4", |
" 1014 02ed xSeries server mainboard", |
" 1028 0169 Precision 470", |
" 1043 80a6 P5P800-MX Mainboard", |
" 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 15d9 4580 P4SCE Mainboard", |
" 1734 101c Primergy RX300 S2", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24df 82801ER (ICH5R) SATA Controller", |
" 2500 82820 820 (Camino) Chipset Host Bridge (MCH)", |
" 1028 0095 Precision Workstation 220 Chipset", |
" 1043 801c P3C-2000 system chipset", |
" 2501 82820 820 (Camino) Chipset Host Bridge (MCH)", |
" 1043 801c P3C-2000 system chipset", |
" 250b 82820 820 (Camino) Chipset Host Bridge", |
" 250f 82820 820 (Camino) Chipset AGP Bridge", |
" 2520 82805AA MTH Memory Translator Hub", |
" 2521 82804AA MRH-S Memory Repeater Hub for SDRAM", |
" 2530 82850 850 (Tehama) Chipset Host Bridge (MCH)", |
" 147b 0507 TH7II-RAID", |
" 2531 82860 860 (Wombat) Chipset Host Bridge (MCH)", |
" 2532 82850 850 (Tehama) Chipset AGP Bridge", |
" 2533 82860 860 (Wombat) Chipset AGP Bridge", |
" 2534 82860 860 (Wombat) Chipset PCI Bridge", |
" 2540 E7500 Memory Controller Hub", |
" 15d9 3480 P4DP6", |
" 2541 E7500/E7501 Host RASUM Controller", |
" 15d9 3480 P4DP6", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 8086 3424 SE7501HG2 Mainboard", |
" 2543 E7500/E7501 Hub Interface B PCI-to-PCI Bridge", |
" 2544 E7500/E7501 Hub Interface B RASUM Controller", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 2545 E7500/E7501 Hub Interface C PCI-to-PCI Bridge", |
" 2546 E7500/E7501 Hub Interface C RASUM Controller", |
" 2547 E7500/E7501 Hub Interface D PCI-to-PCI Bridge", |
" 2548 E7500/E7501 Hub Interface D RASUM Controller", |
" 254c E7501 Memory Controller Hub", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 8086 3424 SE7501HG2 Mainboard", |
" 2550 E7505 Memory Controller Hub", |
" 2551 E7505/E7205 Series RAS Controller", |
" 2552 E7505/E7205 PCI-to-AGP Bridge", |
" 2553 E7505 Hub Interface B PCI-to-PCI Bridge", |
" 2554 E7505 Hub Interface B PCI-to-PCI Bridge RAS Controller", |
" 255d E7205 Memory Controller Hub", |
" 2560 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface", |
" 1028 0126 Optiplex GX260", |
" 1458 2560 GA-8PE667 Ultra", |
" 1462 5800 845PE Max (MS-6580)", |
" 2561 82845G/GL[Brookdale-G]/GE/PE Host-to-AGP Bridge", |
" 2562 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device", |
" 0e11 00b9 Evo D510 SFF", |
" 1014 0267 NetVista A30p", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 2570 82865G/PE/P DRAM Controller/Host-Hub Interface", |
" 103c 006a NX9500", |
" 1043 80f2 P5P800-MX Mainboard", |
" 1458 2570 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 2571 82865G/PE/P PCI to AGP Controller", |
" 2572 82865G Integrated Graphics Controller", |
" 1028 019d Dimension 3000", |
" 103c 12bc D530 sff(dc578av)", |
" 1043 80a5 P5P800-MX Mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 2573 82865G/PE/P PCI to CSA Bridge", |
" 2576 82865G/PE/P Processor to I/O Memory Interface", |
" 2578 82875P/E7210 Memory Controller Hub", |
" 1458 2578 GA-8KNXP motherboard (875P)", |
" 1462 7580 MS-6758 (875P Neo)", |
" 15d9 4580 P4SCE Motherboard", |
" 2579 82875P Processor to AGP Controller", |
" 257b 82875P/E7210 Processor to PCI to CSA Bridge", |
" 257e 82875P/E7210 Processor to I/O Memory Interface", |
" 2580 915G/P/GV/GL/PL/910GL Express Memory Controller Hub", |
" 1458 2580 GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105b Scenic W620", |
" 2581 915G/P/GV/GL/PL/910GL Express PCI Express Root Port", |
" 2582 82915G/GV/910GL Express Chipset Family Graphics Controller", |
" 1028 1079 Optiplex GX280", |
" 103c 3006 DC7100 SFF(DX878AV)", |
" 1043 2582 P5GD1-VW Mainboard", |
" 1458 2582 GA-8I915ME-G Mainboard", |
" 1734 105b Scenic W620", |
" 2584 925X/XE Express Memory Controller Hub", |
" 2585 925X/XE Express PCI Express Root Port", |
" 2588 E7220/E7221 Memory Controller Hub", |
" 2589 E7220/E7221 PCI Express Root Port", |
" 258a E7221 Integrated Graphics Controller", |
" 2590 Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller", |
" 1028 0182 Dell Latidude C610", |
" 103c 099c NX6110/NC6120", |
" a304 81b7 Vaio VGN-S3XP", |
" 2591 Mobile 915GM/PM Express PCI Express Root Port", |
" 2592 Mobile 915GM/GMS/910GML Express Graphics Controller", |
" 103c 099c NX6110/NC6120", |
" 103c 308a NC6220", |
" 1043 1881 GMA 900 915GM Integrated Graphics", |
" 25a1 6300ESB LPC Interface Controller", |
" 25a2 6300ESB PATA Storage Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 25a3 6300ESB SATA Storage Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25a4 6300ESB SMBus Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25a6 6300ESB AC'97 Audio Controller", |
" 4c53 10b0 CL9 mainboard", |
" 25a7 6300ESB AC'97 Modem Controller", |
" 25a9 6300ESB USB Universal Host Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25aa 6300ESB USB Universal Host Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 25ab 6300ESB Watchdog Timer", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25ac 6300ESB I/O Advanced Programmable Interrupt Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25ad 6300ESB USB2 Enhanced Host Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25ae 6300ESB 64-bit PCI-X Bridge", |
" 25b0 6300ESB SATA RAID Controller", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25c0 Workstation Memory Controller Hub", |
" 25d0 Server Memory Controller Hub", |
" 25d4 Server Memory Contoller Hub", |
" 25d8 Server Memory Controller Hub", |
" 25e2 Server PCI Express x4 Port 2", |
" 25e3 Server PCI Express x4 Port 3", |
" 25e4 Server PCI Express x4 Port 4", |
" 25e5 Server PCI Express x4 Port 5", |
" 25e6 Server PCI Express x4 Port 6", |
" 25e7 Server PCI Express x4 Port 7", |
" 25e8 Server AMB Memory Mapped Registers", |
" 25f0 Server Error Reporting Registers", |
" 25f1 Reserved Registers", |
" 25f3 Reserved Registers", |
" 25f5 Server FBD Registers", |
" 25f6 Server FBD Registers", |
" 25f7 Server PCI Express x8 Port 2-3", |
" 25f8 Server PCI Express x8 Port 4-5", |
" 25f9 Server PCI Express x8 Port 6-7", |
" 25fa Server PCI Express x16 Port 4-7", |
" 2600 E8500/E8501 Hub Interface 1.5", |
" 2601 E8500/E8501 PCI Express x4 Port D", |
" 2602 E8500/E8501 PCI Express x4 Port C0", |
" 2603 E8500/E8501 PCI Express x4 Port C1", |
" 2604 E8500/E8501 PCI Express x4 Port B0", |
" 2605 E8500/E8501 PCI Express x4 Port B1", |
" 2606 E8500/E8501 PCI Express x4 Port A0", |
" 2607 E8500/E8501 PCI Express x4 Port A1", |
" 2608 E8500/E8501 PCI Express x8 Port C", |
" 2609 E8500/E8501 PCI Express x8 Port B", |
" 260a E8500/E8501 PCI Express x8 Port A", |
" 260c E8500/E8501 IMI Registers", |
" 2610 E8500/E8501 Front Side Bus, Boot, and Interrupt Registers", |
" 2611 E8500/E8501 Address Mapping Registers", |
" 2612 E8500/E8501 RAS Registers", |
" 2613 E8500/E8501 Reserved Registers", |
" 2614 E8500/E8501 Reserved Registers", |
" 2615 E8500/E8501 Miscellaneous Registers", |
" 2617 E8500/E8501 Reserved Registers", |
" 2618 E8500/E8501 Reserved Registers", |
" 2619 E8500/E8501 Reserved Registers", |
" 261a E8500/E8501 Reserved Registers", |
" 261b E8500/E8501 Reserved Registers", |
" 261c E8500/E8501 Reserved Registers", |
" 261d E8500/E8501 Reserved Registers", |
" 261e E8500/E8501 Reserved Registers", |
" 2620 E8500/E8501 eXternal Memory Bridge", |
" 2621 E8500/E8501 XMB Miscellaneous Registers", |
" 2622 E8500/E8501 XMB Memory Interleaving Registers", |
" 2623 E8500/E8501 XMB DDR Initialization and Calibration", |
" 2624 E8500/E8501 XMB Reserved Registers", |
" 2625 E8500/E8501 XMB Reserved Registers", |
" 2626 E8500/E8501 XMB Reserved Registers", |
" 2627 E8500/E8501 XMB Reserved Registers", |
" 2640 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 2641 82801FBM (ICH6M) LPC Interface Bridge", |
" 103c 099c NX6110/NC6120", |
" 2642 82801FW/FRW (ICH6W/ICH6RW) LPC Interface Bridge", |
" 2651 82801FB/FW (ICH6/ICH6W) SATA Controller", |
" 1028 0179 Optiplex GX280", |
" 1043 2601 P5GD1-VW Mainboard", |
" 1734 105c Scenic W620", |
" 8086 4147 D915GAG Motherboard", |
" 2652 82801FR/FRW (ICH6R/ICH6RW) SATA Controller", |
" 1462 7028 915P/G Neo2", |
" 2653 82801FBM (ICH6M) SATA Controller", |
" 2658 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1", |
" 1028 0179 Optiplex GX280", |
" 103c 099c NX6110/NC6120", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 2558 GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 2659 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2", |
" 1028 0179 Optiplex GX280", |
" 103c 099c NX6110/NC6120", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 2659 GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 265a 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3", |
" 1028 0179 Optiplex GX280", |
" 103c 099c NX6110/NC6120", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 265a GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 265b 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4", |
" 1028 0179 Optiplex GX280", |
" 103c 099c NX6110/NC6120", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 265a GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 265c 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller", |
" 1028 0179 Optiplex GX280", |
" 103c 099c NX6110/NC6120", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 5006 GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 2660 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1", |
" 103c 099c NX6110/NC6120", |
" 2662 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 2", |
" 2664 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 3", |
" 2666 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 4", |
" 2668 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller", |
" 1043 814e P5GD1-VW Mainboard", |
" 266a 82801FB/FBM/FR/FW/FRW (ICH6 Family) SMBus Controller", |
" 1028 0179 Optiplex GX280", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 266a GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 266c 82801FB/FBM/FR/FW/FRW (ICH6 Family) LAN Controller", |
" 266d 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Modem Controller", |
" 1025 006a Conexant AC'97 CoDec (in Acer TravelMate 2410 serie laptop)", |
" 103c 099c NX6110/NC6120", |
" 266e 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller", |
" 1025 006a Realtek ALC 655 codec (in Acer TravelMate 2410 serie laptop)", |
" 1028 0179 Optiplex GX280", |
" 1028 0182 Latitude D610 Laptop", |
" 1028 0188 Inspiron 6000 laptop", |
" 103c 0944 Compaq NC6220", |
" 103c 099c NX6110/NC6120", |
" 103c 3006 DC7100 SFF(DX878AV)", |
" 1458 a002 GA-8I915ME-G Mainboard", |
" 152d 0745 Packard Bell A8550 Laptop", |
" 1734 105a Scenic W620", |
" 266f 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller", |
" 103c 099c NX6110/NC6120", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 266f GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 2670 Enterprise Southbridge LPC", |
" 2680 Enterprise Southbridge SATA IDE", |
" 2681 Enterprise Southbridge SATA AHCI", |
" 2682 Enterprise Southbridge SATA RAID", |
" 2683 Enterprise Southbridge SATA RAID", |
" 2688 Enterprise Southbridge UHCI USB #1", |
" 2689 Enterprise Southbridge UHCI USB #2", |
" 268a Enterprise Southbridge UHCI USB #3", |
" 268b Enterprise Southbridge UHCI USB #4", |
" 268c Enterprise Southbridge EHCI USB", |
" 2690 Enterprise Southbridge PCI Express Root Port 1", |
" 2692 Enterprise Southbridge PCI Express Root Port 2", |
" 2694 Enterprise Southbridge PCI Express Root Port 3", |
" 2696 Enterprise Southbridge PCI Express Root Port 4", |
" 2698 Enterprise Southbridge AC '97 Audio", |
" 2699 Enterprise Southbridge AC '97 Modem", |
" 269a Enterprise Southbridge High Definition Audio", |
" 269b Enterprise Southbridge SMBus", |
" 269e Enterprise Southbridge PATA", |
" 2770 945G/GZ/P/PL Express Memory Controller Hub", |
" 8086 544e DeskTop Board D945GTP", |
" 2771 945G/GZ/P/PL Express PCI Express Root Port", |
" 2772 945G/GZ Express Integrated Graphics Controller", |
" 8086 544e DeskTop Board D945GTP", |
" 2774 955X Express Memory Controller Hub", |
" 2775 955X Express PCI Express Root Port", |
" 2776 945G/GZ Express Integrated Graphics Controller", |
" 2778 E7230 Memory Controller Hub", |
" 2779 E7230 PCI Express Root Port", |
" 277a 975X Express PCI Express Root Port", |
" 277c 975X Express Memory Controller Hub", |
" 277d 975X Express PCI Express Root Port", |
" 2782 82915G Express Chipset Family Graphics Controller", |
" 1043 2582 P5GD1-VW Mainboard", |
" 1734 105b Scenic W620", |
" 2792 Mobile 915GM/GMS/910GML Express Graphics Controller", |
" 103c 099c NX6110/NC6120", |
" 1043 1881 GMA 900 915GM Integrated Graphics", |
" 27a0 Mobile 945GM/PM/GMS/940GML and 945GT Express Memory Controller Hub", |
" 27a1 Mobile 945GM/PM/GMS/940GML and 945GT Express PCI Express Root Port", |
" 27a2 Mobile 945GM/GMS/940GML Express Integrated Graphics Controller", |
" 27a6 Mobile 945GM/GMS/940GML Express Integrated Graphics Controller", |
" 27b0 82801GH (ICH7DH) LPC Interface Bridge", |
" 27b8 82801GB/GR (ICH7 Family) LPC Interface Bridge", |
" 8086 544e DeskTop Board D945GTP", |
" 27b9 82801GBM (ICH7-M) LPC Interface Bridge", |
" 27bd 82801GHM (ICH7-M DH) LPC Interface Bridge", |
" 27c0 82801GB/GR/GH (ICH7 Family) Serial ATA Storage Controller IDE", |
" 8086 544e DeskTop Board D945GTP", |
" 27c1 82801GR/GH (ICH7 Family) Serial ATA Storage Controller AHCI", |
" 27c3 82801GR/GH (ICH7 Family) Serial ATA Storage Controller RAID", |
" 27c4 82801GBM/GHM (ICH7 Family) Serial ATA Storage Controller IDE", |
" 27c5 82801GBM/GHM (ICH7 Family) Serial ATA Storage Controller AHCI", |
" 27c6 82801GHM (ICH7-M DH) Serial ATA Storage Controller RAID", |
" 27c8 82801G (ICH7 Family) USB UHCI #1", |
" 8086 544e DeskTop Board D945GTP", |
" 27c9 82801G (ICH7 Family) USB UHCI #2", |
" 8086 544e DeskTop Board D945GTP", |
" 27ca 82801G (ICH7 Family) USB UHCI #3", |
" 8086 544e DeskTop Board D945GTP", |
" 27cb 82801G (ICH7 Family) USB UHCI #4", |
" 8086 544e DeskTop Board D945GTP", |
" 27cc 82801G (ICH7 Family) USB2 EHCI Controller", |
" 8086 544e DeskTop Board D945GTP", |
" 27d0 82801G (ICH7 Family) PCI Express Port 1", |
" 27d2 82801G (ICH7 Family) PCI Express Port 2", |
" 27d4 82801G (ICH7 Family) PCI Express Port 3", |
" 27d6 82801G (ICH7 Family) PCI Express Port 4", |
" 27d8 82801G (ICH7 Family) High Definition Audio Controller", |
" 27da 82801G (ICH7 Family) SMBus Controller", |
" 8086 544e DeskTop Board D945GTP", |
" 27dc 82801G (ICH7 Family) LAN Controller", |
" 8086 308d DeskTop Board D945GTP", |
" 27dd 82801G (ICH7 Family) AC'97 Modem Controller", |
" 27de 82801G (ICH7 Family) AC'97 Audio Controller", |
" 27df 82801G (ICH7 Family) IDE Controller", |
" 8086 544e DeskTop Board D945GTP", |
" 27e0 82801GR/GH/GHM (ICH7 Family) PCI Express Port 5", |
" 27e2 82801GR/GH/GHM (ICH7 Family) PCI Express Port 6", |
" 2810 LPC Interface Controller", |
" 2811 Mobile LPC Interface Controller", |
" 2812 LPC Interface Controller", |
" 2814 LPC Interface Controller", |
" 2815 Mobile LPC Interface Controller", |
" 2820 SATA Controller 1 IDE", |
" 2821 SATA Controller AHCI", |
" 2822 SATA Controller RAID", |
" 2824 SATA Controller AHCI", |
" 2825 SATA Controller 2 IDE", |
" 2828 Mobile SATA Controller IDE", |
" 2829 Mobile SATA Controller AHCI", |
" 282a Mobile SATA Controller RAID", |
" 2830 USB UHCI Controller #1", |
" 2831 USB UHCI Controller #2", |
" 2832 USB UHCI Controller #3", |
" 2834 USB UHCI Controller #4", |
" 2835 USB UHCI Controller #5", |
" 2836 USB2 EHCI Controller #1", |
" 283a USB2 EHCI Controller #2", |
" 283e SMBus Controller", |
" 283f PCI Express Port 1", |
" 2841 PCI Express Port 2", |
" 2843 PCI Express Port 3", |
" 2845 PCI Express Port 4", |
" 2847 PCI Express Port 5", |
" 2849 PCI Express Port 6", |
" 284b HD Audio Controller", |
" 284f Thermal Subsystem", |
" 2850 Mobile IDE Controller", |
" 2970 Memory Controller Hub", |
" 2971 PCI Express Root Port", |
" 2972 Integrated Graphics Controller", |
" 2973 Integrated Graphics Controller", |
" 2974 HECI Controller", |
" 2976 PT IDER Controller", |
" 2977 KT Controller", |
" 2990 Memory Controller Hub", |
" 2991 PCI Express Root Port", |
" 2992 Integrated Graphics Controller", |
" 2993 Integrated Graphics Controller", |
" 2994 HECI Controller", |
" 2995 HECI Controller", |
" 2996 PT IDER Controller", |
" 2997 KT Controller", |
" 29a0 Memory Controller Hub", |
" 29a1 PCI Express Root Port", |
" 29a2 Integrated Graphics Controller", |
" 29a3 Integrated Graphics Controller", |
" 29a4 HECI Controller", |
" 29a5 HECI Controller", |
" 29a6 PT IDER Controller", |
" 29a7 KT Controller", |
" 2a00 Mobile Memory Controller Hub", |
" 2a01 Mobile PCI Express Root Port", |
" 2a02 Mobile Integrated Graphics Controller", |
" 2a03 Mobile Integrated Graphics Controller", |
" 3092 Integrated RAID", |
" 3200 GD31244 PCI-X SATA HBA", |
" 3340 82855PM Processor to I/O Controller", |
" 1025 005a TravelMate 290", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 3341 82855PM Processor to AGP Controller", |
" 3500 Enterprise Southbridge PCI Express Upstream Port", |
" 3501 Enterprise Southbridge PCI Express Upstream Port", |
" 3504 Enterprise Southbridge IOxAPIC", |
" 3505 Enterprise Southbridge IOxAPIC", |
" 350c Enterprise Southbridge PCI Express to PCI-X Bridge", |
" 350d Enterprise Southbridge PCI Express to PCI-X Bridge", |
" 3510 Enterprise Southbridge PCI Express Downstream Port E1", |
" 3511 Enterprise Southbridge PCI Express Downstream Port E1", |
" 3514 Enterprise Southbridge PCI Express Downstream Port E2", |
" 3515 Enterprise Southbridge PCI Express Downstream Port E2", |
" 3518 Enterprise Southbridge PCI Express Downstream Port E3", |
" 3519 Enterprise Southbridge PCI Express Downstream Port E3", |
" 3575 82830 830 Chipset Host Bridge", |
" 0e11 0030 Evo N600c", |
" 1014 021d ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 3576 82830 830 Chipset AGP Bridge", |
" 3577 82830 CGC [Chipset Graphics Controller]", |
" 1014 0513 ThinkPad A/T/X Series", |
" 3578 82830 830 Chipset Host Bridge", |
" 3580 82852/82855 GM/GME/PM/GMV Processor to I/O Controller", |
" 1028 0139 Latitude D400", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 1734 1055 Amilo M1420", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 3581 82852/82855 GM/GME/PM/GMV Processor to AGP Controller", |
" 1734 1055 Amilo M1420", |
" 3582 82852/855GM Integrated Graphics Device", |
" 1028 0139 Latitude D400", |
" 1028 0163 Latitude D505", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 3584 82852/82855 GM/GME/PM/GMV Processor to I/O Controller", |
" 1028 0139 Latitude D400", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 1734 1055 Amilo M1420", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 3585 82852/82855 GM/GME/PM/GMV Processor to I/O Controller", |
" 1028 0139 Latitude D400", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 1734 1055 Amilo M1420", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 3590 E7520 Memory Controller Hub", |
" 1028 019a PowerEdge SC1425", |
" 1734 103e Primergy RX300 S2", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 3591 E7525/E7520 Error Reporting Registers", |
" 1028 0169 Precision 470", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 3592 E7320 Memory Controller Hub", |
" 3593 E7320 Error Reporting Registers", |
" 3594 E7520 DMA Controller", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 3595 E7525/E7520/E7320 PCI Express Port A", |
" 3596 E7525/E7520/E7320 PCI Express Port A1", |
" 3597 E7525/E7520 PCI Express Port B", |
" 3598 E7520 PCI Express Port B1", |
" 3599 E7520 PCI Express Port C", |
" 359a E7520 PCI Express Port C1", |
" 359b E7525/E7520/E7320 Extended Configuration Registers", |
" 359e E7525 Memory Controller Hub", |
" 1028 0169 Precision 470", |
" 4220 PRO/Wireless 2200BG Network Connection", |
" 4222 PRO/Wireless 3945ABG Network Connection", |
" 8086 1005 PRO/Wireless 3945BG Network Connection", |
" 8086 1034 PRO/Wireless 3945BG Network Connection", |
" 8086 1044 PRO/Wireless 3945BG Network Connection", |
" 4223 PRO/Wireless 2915ABG Network Connection", |
" 1351 103c Compaq NC6220", |
" 4224 PRO/Wireless 2915ABG Network Connection", |
" 4227 PRO/Wireless 3945ABG Network Connection", |
" 8086 1011 Thinkpad X60s", |
" 8086 1014 PRO/Wireless 3945BG Network Connection", |
" 5200 EtherExpress PRO/100 Intelligent Server", |
" 5201 EtherExpress PRO/100 Intelligent Server", |
" 8086 0001 EtherExpress PRO/100 Server Ethernet Adapter", |
" 530d 80310 IOP [IO Processor]", |
" 7000 82371SB PIIX3 ISA [Natoma/Triton II]", |
" 7010 82371SB PIIX3 IDE [Natoma/Triton II]", |
" 7020 82371SB PIIX3 USB [Natoma/Triton II]", |
" 7030 430VX - 82437VX TVX [Triton VX]", |
" 7050 Intercast Video Capture Card", |
" 7051 PB 642365-003 (Business Video Conferencing Card)", |
" 7100 430TX - 82439TX MTXC", |
" 7110 82371AB/EB/MB PIIX4 ISA", |
" 15ad 1976 virtualHW v3", |
" 7111 82371AB/EB/MB PIIX4 IDE", |
" 15ad 1976 virtualHW v3", |
" 7112 82371AB/EB/MB PIIX4 USB", |
" 15ad 1976 virtualHW v3", |
" 7113 82371AB/EB/MB PIIX4 ACPI", |
" 15ad 1976 virtualHW v3", |
" 7120 82810 GMCH [Graphics Memory Controller Hub]", |
" 4c53 1040 CL7 mainboard", |
" 4c53 1060 PC7 mainboard", |
" 7121 82810 CGC [Chipset Graphics Controller]", |
" 4c53 1040 CL7 mainboard", |
" 4c53 1060 PC7 mainboard", |
" 8086 4341 Cayman (CA810) Mainboard", |
" 7122 82810 DC-100 GMCH [Graphics Memory Controller Hub]", |
" 7123 82810 DC-100 CGC [Chipset Graphics Controller]", |
" 7124 82810E DC-133 GMCH [Graphics Memory Controller Hub]", |
" 7125 82810E DC-133 CGC [Chipset Graphics Controller]", |
" 7126 82810 DC-133 System and Graphics Controller", |
" 7128 82810-M DC-100 System and Graphics Controller", |
" 712a 82810-M DC-133 System and Graphics Controller", |
" 7180 440LX/EX - 82443LX/EX Host bridge", |
" 7181 440LX/EX - 82443LX/EX AGP bridge", |
" 7190 440BX/ZX/DX - 82443BX/ZX/DX Host bridge", |
" 0e11 0500 Armada 1750 Laptop System Chipset", |
" 0e11 b110 Armada M700/E500", |
" 1028 008e PowerEdge 1300 mainboard", |
" 1179 0001 Toshiba Tecra 8100 Laptop System Chipset", |
" 15ad 1976 virtualHW v3", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" 7191 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge", |
" 1028 008e PowerEdge 1300 mainboard", |
" 7192 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled)", |
" 0e11 0460 Armada 1700 Laptop System Chipset", |
" 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard", |
" 7194 82440MX Host Bridge", |
" 1033 0000 Versa Note Vxi", |
" 4c53 10a0 CA3/CR3 mainboard", |
" 7195 82440MX AC'97 Audio Controller", |
" 1033 80cc Versa Note VXi", |
" 10cf 1099 QSound_SigmaTel Stac97 PCI Audio", |
" 11d4 0040 SoundMAX Integrated Digital Audio", |
" 11d4 0048 SoundMAX Integrated Digital Audio", |
" 7196 82440MX AC'97 Modem Controller", |
" 7198 82440MX ISA Bridge", |
" 7199 82440MX EIDE Controller", |
" 719a 82440MX USB Universal Host Controller", |
" 719b 82440MX Power Management Controller", |
" 71a0 440GX - 82443GX Host bridge", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" 71a1 440GX - 82443GX AGP bridge", |
" 71a2 440GX - 82443GX Host bridge (AGP disabled)", |
" 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard", |
" 7600 82372FB PIIX5 ISA", |
" 7601 82372FB PIIX5 IDE", |
" 7602 82372FB PIIX5 USB", |
" 7603 82372FB PIIX5 SMBus", |
" 7800 82740 (i740) AGP Graphics Accelerator", |
" 003d 0008 Starfighter AGP", |
" 003d 000b Starfighter AGP", |
" 1092 0100 Stealth II G460", |
" 10b4 201a Lightspeed 740", |
" 10b4 202f Lightspeed 740", |
" 8086 0000 Terminator 2x/i", |
" 8086 0100 Intel740 Graphics Accelerator", |
" 84c4 450KX/GX [Orion] - 82454KX/GX PCI bridge", |
" 84c5 450KX/GX [Orion] - 82453KX/GX Memory controller", |
" 84ca 450NX - 82451NX Memory & I/O Controller", |
" 84cb 450NX - 82454NX/84460GX PCI Expander Bridge", |
" 84e0 460GX - 84460GX System Address Controller (SAC)", |
" 84e1 460GX - 84460GX System Data Controller (SDC)", |
" 84e2 460GX - 84460GX AGP Bridge (GXB function 2)", |
" 84e3 460GX - 84460GX Memory Address Controller (MAC)", |
" 84e4 460GX - 84460GX Memory Data Controller (MDC)", |
" 84e6 460GX - 82466GX Wide and fast PCI eXpander Bridge (WXB)", |
" 84ea 460GX - 84460GX AGP Bridge (GXB function 1)", |
" 8500 IXP4XX Intel Network Processor (IXP420/421/422/425/IXC1100)", |
" 1993 0ded mGuard-PCI AV#2", |
" 1993 0dee mGuard-PCI AV#1", |
" 1993 0def mGuard-PCI AV#0", |
" 9000 IXP2000 Family Network Processor", |
" 9001 IXP2400 Network Processor", |
" 9002 IXP2300 Network Processor", |
" 9004 IXP2800 Network Processor", |
" 9621 Integrated RAID", |
" 9622 Integrated RAID", |
" 9641 Integrated RAID", |
" 96a1 Integrated RAID", |
" b152 21152 PCI-to-PCI Bridge", |
" b154 21154 PCI-to-PCI Bridge", |
" b555 21555 Non transparent PCI-to-PCI Bridge", |
" 12d9 000a PCI VoIP Gateway", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" e4bf 1000 CC8-1-BLUES", |
"8401 TRENDware International Inc.", |
"8800 Trigem Computer Inc.", |
" 2008 Video assistent component", |
"8866 T-Square Design Inc.", |
"8888 Silicon Magic", |
"8912 TRX", |
"8c4a Winbond", |
" 1980 W89C940 misprogrammed [ne2k]", |
"8e0e Computone Corporation", |
"8e2e KTI", |
" 3000 ET32P2", |
"9004 Adaptec", |
" 0078 AHA-2940U_CN", |
" 1078 AIC-7810", |
" 1160 AIC-1160 [Family Fibre Channel Adapter]", |
" 2178 AIC-7821", |
" 3860 AHA-2930CU", |
" 3b78 AHA-4844W/4844UW", |
" 5075 AIC-755x", |
" 5078 AHA-7850", |
" 9004 7850 AHA-2904/Integrated AIC-7850", |
" 5175 AIC-755x", |
" 5178 AIC-7851", |
" 5275 AIC-755x", |
" 5278 AIC-7852", |
" 5375 AIC-755x", |
" 5378 AIC-7850", |
" 5475 AIC-755x", |
" 5478 AIC-7850", |
" 5575 AVA-2930", |
" 5578 AIC-7855", |
" 5647 ANA-7711 TCP Offload Engine", |
" 9004 7710 ANA-7711F TCP Offload Engine - Optical", |
" 9004 7711 ANA-7711LP TCP Offload Engine - Copper", |
" 5675 AIC-755x", |
" 5678 AIC-7856", |
" 5775 AIC-755x", |
" 5778 AIC-7850", |
" 5800 AIC-5800", |
" 5900 ANA-5910/5930/5940 ATM155 & 25 LAN Adapter", |
" 5905 ANA-5910A/5930A/5940A ATM Adapter", |
" 6038 AIC-3860", |
" 6075 AIC-1480 / APA-1480", |
" 9004 7560 AIC-1480 / APA-1480 Cardbus", |
" 6078 AIC-7860", |
" 6178 AIC-7861", |
" 9004 7861 AHA-2940AU Single", |
" 6278 AIC-7860", |
" 6378 AIC-7860", |
" 6478 AIC-786x", |
" 6578 AIC-786x", |
" 6678 AIC-786x", |
" 6778 AIC-786x", |
" 6915 ANA620xx/ANA69011A", |
" 9004 0008 ANA69011A/TX 10/100", |
" 9004 0009 ANA69011A/TX 10/100", |
" 9004 0010 ANA62022 2-port 10/100", |
" 9004 0018 ANA62044 4-port 10/100", |
" 9004 0019 ANA62044 4-port 10/100", |
" 9004 0020 ANA62022 2-port 10/100", |
" 9004 0028 ANA69011A/TX 10/100", |
" 9004 8008 ANA69011A/TX 64 bit 10/100", |
" 9004 8009 ANA69011A/TX 64 bit 10/100", |
" 9004 8010 ANA62022 2-port 64 bit 10/100", |
" 9004 8018 ANA62044 4-port 64 bit 10/100", |
" 9004 8019 ANA62044 4-port 64 bit 10/100", |
" 9004 8020 ANA62022 2-port 64 bit 10/100", |
" 9004 8028 ANA69011A/TX 64 bit 10/100", |
" 7078 AHA-294x / AIC-7870", |
" 7178 AHA-2940/2940W / AIC-7871", |
" 7278 AHA-3940/3940W / AIC-7872", |
" 7378 AHA-3985 / AIC-7873", |
" 7478 AHA-2944/2944W / AIC-7874", |
" 7578 AHA-3944/3944W / AIC-7875", |
" 7678 AHA-4944W/UW / AIC-7876", |
" 7710 ANA-7711F Network Accelerator Card (NAC) - Optical", |
" 7711 ANA-7711C Network Accelerator Card (NAC) - Copper", |
" 7778 AIC-787x", |
" 7810 AIC-7810", |
" 7815 AIC-7815 RAID+Memory Controller IC", |
" 9004 7815 ARO-1130U2 RAID Controller", |
" 9004 7840 AIC-7815 RAID+Memory Controller IC", |
" 7850 AIC-7850", |
" 7855 AHA-2930", |
" 7860 AIC-7860", |
" 7870 AIC-7870", |
" 7871 AHA-2940", |
" 7872 AHA-3940", |
" 7873 AHA-3980", |
" 7874 AHA-2944", |
" 7880 AIC-7880P", |
" 7890 AIC-7890", |
" 7891 AIC-789x", |
" 7892 AIC-789x", |
" 7893 AIC-789x", |
" 7894 AIC-789x", |
" 7895 AHA-2940U/UW / AHA-39xx / AIC-7895", |
" 9004 7890 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B", |
" 9004 7891 AHA-2940U/2940UW Dual", |
" 9004 7892 AHA-3940AU/AUW/AUWD/UWD", |
" 9004 7894 AHA-3944AUWD", |
" 9004 7895 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B", |
" 9004 7896 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B", |
" 9004 7897 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B", |
" 7896 AIC-789x", |
" 7897 AIC-789x", |
" 8078 AIC-7880U", |
" 9004 7880 AIC-7880P Ultra/Ultra Wide SCSI Chipset", |
" 8178 AHA-2940U/UW/D / AIC-7881U", |
" 9004 7881 AHA-2940UW SCSI Host Adapter", |
" 8278 AHA-3940U/UW/UWD / AIC-7882U", |
" 8378 AHA-3940U/UW / AIC-7883U", |
" 8478 AHA-2944UW / AIC-7884U", |
" 8578 AHA-3944U/UWD / AIC-7885", |
" 8678 AHA-4944UW / AIC-7886", |
" 8778 AHA-2940UW Pro / AIC-788x", |
" 9004 7887 2940UW Pro Ultra-Wide SCSI Controller", |
" 8878 AHA-2930UW / AIC-7888", |
" 9004 7888 AHA-2930UW SCSI Controller", |
" 8b78 ABA-1030", |
" ec78 AHA-4944W/UW", |
"9005 Adaptec", |
" 0010 AHA-2940U2/U2W", |
" 9005 2180 AHA-2940U2 SCSI Controller", |
" 9005 8100 AHA-2940U2B SCSI Controller", |
" 9005 a100 AHA-2940U2B SCSI Controller", |
" 9005 a180 AHA-2940U2W SCSI Controller", |
" 9005 e100 AHA-2950U2B SCSI Controller", |
" 0011 AHA-2930U2", |
" 0013 78902", |
" 9005 0003 AAA-131U2 Array1000 1 Channel RAID Controller", |
" 9005 000f AIC7890_ARO", |
" 001f AHA-2940U2/U2W / 7890/7891", |
" 9005 000f 2940U2W SCSI Controller", |
" 9005 a180 2940U2W SCSI Controller", |
" 0020 AIC-7890", |
" 002f AIC-7890", |
" 0030 AIC-7890", |
" 003f AIC-7890", |
" 0050 AHA-3940U2x/395U2x", |
" 9005 f500 AHA-3950U2B", |
" 9005 ffff AHA-3950U2B", |
" 0051 AHA-3950U2D", |
" 9005 b500 AHA-3950U2D", |
" 0053 AIC-7896 SCSI Controller", |
" 9005 ffff AIC-7896 SCSI Controller mainboard implementation", |
" 005f AIC-7896U2/7897U2", |
" 0080 AIC-7892A U160/m", |
" 0e11 e2a0 Compaq 64-Bit/66MHz Wide Ultra3 SCSI Adapter", |
" 9005 6220 AHA-29160C", |
" 9005 62a0 29160N Ultra160 SCSI Controller", |
" 9005 e220 29160LP Low Profile Ultra160 SCSI Controller", |
" 9005 e2a0 29160 Ultra160 SCSI Controller", |
" 0081 AIC-7892B U160/m", |
" 9005 62a1 19160 Ultra160 SCSI Controller", |
" 0083 AIC-7892D U160/m", |
" 008f AIC-7892P U160/m", |
" 1179 0001 Magnia Z310", |
" 15d9 9005 Onboard SCSI Host Adapter", |
" 00c0 AHA-3960D / AIC-7899A U160/m", |
" 0e11 f620 Compaq 64-Bit/66MHz Dual Channel Wide Ultra3 SCSI Adapter", |
" 9005 f620 AHA-3960D U160/m", |
" 00c1 AIC-7899B U160/m", |
" 00c3 AIC-7899D U160/m", |
" 00c5 RAID subsystem HBA", |
" 1028 00c5 PowerEdge 2400,2500,2550,4400", |
" 00cf AIC-7899P U160/m", |
" 1028 00ce PowerEdge 1400", |
" 1028 00d1 PowerEdge 2550", |
" 1028 00d9 PowerEdge 2500", |
" 10f1 2462 Thunder K7 S2462", |
" 15d9 9005 Onboard SCSI Host Adapter", |
" 8086 3411 SDS2 Mainboard", |
" 0241 Serial ATA II RAID 1420SA", |
" 0250 ServeRAID Controller", |
" 1014 0279 ServeRAID-xx", |
" 1014 028c ServeRAID-xx", |
" 0279 ServeRAID 6M", |
" 0283 AAC-RAID", |
" 9005 0283 Catapult", |
" 0284 AAC-RAID", |
" 9005 0284 Tomcat", |
" 0285 AAC-RAID", |
" 0e11 0295 SATA 6Ch (Bearcat)", |
" 1014 02f2 ServeRAID 8i", |
" 1028 0287 PowerEdge Expandable RAID Controller 320/DC", |
" 1028 0291 CERC SATA RAID 2 PCI SATA 6ch (DellCorsair)", |
" 103c 3227 AAR-2610SA", |
" 17aa 0286 Legend S220 (Legend Crusader)", |
" 17aa 0287 Legend S230 (Legend Vulcan)", |
" 9005 0285 2200S (Vulcan)", |
" 9005 0286 2120S (Crusader)", |
" 9005 0287 2200S (Vulcan-2m)", |
" 9005 0288 3230S (Harrier)", |
" 9005 0289 3240S (Tornado)", |
" 9005 028a ASR-2020ZCR", |
" 9005 028b ASR-2025ZCR (Terminator)", |
" 9005 028e ASR-2020SA (Skyhawk)", |
" 9005 028f ASR-2025SA", |
" 9005 0290 AAR-2410SA PCI SATA 4ch (Jaguar II)", |
" 9005 0292 AAR-2810SA PCI SATA 8ch (Corsair-8)", |
" 9005 0293 AAR-21610SA PCI SATA 16ch (Corsair-16)", |
" 9005 0294 ESD SO-DIMM PCI-X SATA ZCR (Prowler)", |
" 9005 0296 ASR-2240S", |
" 9005 0297 ASR-4005SAS", |
" 9005 0298 ASR-4000SAS", |
" 9005 0299 ASR-4800SAS", |
" 9005 029a 4805SAS", |
" 0286 AAC-RAID (Rocket)", |
" 1014 9540 ServeRAID 8k/8k-l4", |
" 1014 9580 ServeRAID 8k/8k-l8", |
" 9005 028c ASR-2230S + ASR-2230SLP PCI-X (Lancer)", |
" 9005 028d ASR-2130S", |
" 9005 029b ASR-2820SA", |
" 9005 029c ASR-2620SA", |
" 9005 029d ASR-2420SA", |
" 9005 029e ICP ICP9024R0", |
" 9005 029f ICP ICP9014R0", |
" 9005 02a0 ICP ICP9047MA", |
" 9005 02a1 ICP ICP9087MA", |
" 9005 02a2 3800SAS", |
" 9005 02a3 ICP ICP5445AU", |
" 9005 02a4 ICP ICP5085LI", |
" 9005 02a5 ICP ICP5085BR", |
" 9005 02a6 ICP9067MA", |
" 9005 02a7 AAR-2830SA", |
" 9005 02a8 AAR-2430SA", |
" 9005 02a9 ICP5087AU", |
" 9005 02aa ICP5047AU", |
" 9005 0800 Callisto", |
" 0500 Obsidian chipset SCSI controller", |
" 1014 02c1 PCI-X DDR 3Gb SAS Adapter (572A/572C)", |
" 1014 02c2 PCI-X DDR 3Gb SAS RAID Adapter (572B/572D)", |
" 0503 Scamp chipset SCSI controller", |
" 1014 02bf Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571E)", |
" 1014 02d5 Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571F)", |
" 0910 AUA-3100B", |
" 091e AUA-3100B", |
" 8000 ASC-29320A U320", |
" 800f AIC-7901 U320", |
" 8010 ASC-39320 U320", |
" 8011 ASC-39320D", |
" 0e11 00ac ASC-39320D U320", |
" 9005 0041 ASC-39320D U320", |
" 8012 ASC-29320 U320", |
" 8013 ASC-29320B U320", |
" 8014 ASC-29320LP U320", |
" 8015 ASC-39320B U320", |
" 8016 ASC-39320A U320", |
" 8017 ASC-29320ALP U320", |
" 801c ASC-39320D U320", |
" 801d AIC-7902B U320", |
" 801e AIC-7901A U320", |
" 801f AIC-7902 U320", |
" 1734 1011 Primergy RX300", |
" 8080 ASC-29320A U320 w/HostRAID", |
" 808f AIC-7901 U320 w/HostRAID", |
" 8090 ASC-39320 U320 w/HostRAID", |
" 8091 ASC-39320D U320 w/HostRAID", |
" 8092 ASC-29320 U320 w/HostRAID", |
" 8093 ASC-29320B U320 w/HostRAID", |
" 8094 ASC-29320LP U320 w/HostRAID", |
" 8095 ASC-39320(B) U320 w/HostRAID", |
" 8096 ASC-39320A U320 w/HostRAID", |
" 8097 ASC-29320ALP U320 w/HostRAID", |
" 809c ASC-39320D(B) U320 w/HostRAID", |
" 809d AIC-7902(B) U320 w/HostRAID", |
" 809e AIC-7901A U320 w/HostRAID", |
" 809f AIC-7902 U320 w/HostRAID", |
"907f Atronics", |
" 2015 IDE-2015PL", |
"919a Gigapixel Corp", |
"9412 Holtek", |
" 6565 6565", |
"9699 Omni Media Technology Inc", |
" 6565 6565", |
"9710 NetMos Technology", |
" 7780 USB IRDA-port", |
" 9805 PCI 1 port parallel adapter", |
" 9815 PCI 9815 Multi-I/O Controller", |
" 1000 0020 2P0S (2 port parallel adaptor)", |
" 9835 PCI 9835 Multi-I/O Controller", |
" 1000 0002 2S (16C550 UART)", |
" 1000 0012 1P2S", |
" 9845 PCI 9845 Multi-I/O Controller", |
" 1000 0004 0P4S (4 port 16550A serial card)", |
" 1000 0006 0P6S (6 port 16550a serial card)", |
" 9855 PCI 9855 Multi-I/O Controller", |
" 1000 0014 1P4S", |
"9902 Stargen Inc.", |
" 0001 SG2010 PCI over Starfabric Bridge", |
" 0002 SG2010 PCI to Starfabric Gateway", |
" 0003 SG1010 Starfabric Switch and PCI Bridge", |
"a0a0 AOPEN Inc.", |
"a0f1 UNISYS Corporation", |
"a200 NEC Corporation", |
"a259 Hewlett Packard", |
"a25b Hewlett Packard GmbH PL24-MKT", |
"a304 Sony", |
"a727 3Com Corporation", |
" 0013 3CRPAG175 Wireless PC Card", |
"aa42 Scitex Digital Video", |
"ac1e Digital Receiver Technology Inc", |
"ac3d Actuality Systems", |
"aecb Adrienne Electronics Corporation", |
" 6250 VITC/LTC Timecode Reader card [PCI-VLTC/RDR]", |
"affe Sirrix AG security technologies", |
" dead Sirrix.PCI4S0 4-port ISDN S0 interface", |
"b1b3 Shiva Europe Limited", |
"bd11 Pinnacle Systems, Inc. (Wrong ID)", |
"c001 TSI Telsys", |
"c0a9 Micron/Crucial Technology", |
"c0de Motorola", |
"c0fe Motion Engineering, Inc.", |
"ca50 Varian Australia Pty Ltd", |
"cafe Chrysalis-ITS", |
" 0003 Luna K3 Hardware Security Module", |
"cccc Catapult Communications", |
"cddd Tyzx, Inc.", |
" 0101 DeepSea 1 High Speed Stereo Vision Frame Grabber", |
" 0200 DeepSea 2 High Speed Stereo Vision Frame Grabber", |
"d161 Digium, Inc.", |
" 0205 Wildcard TE205P", |
" 0210 Wildcard TE210P", |
" 0405 Wildcard TE405P Quad-Span togglable E1/T1/J1 card 5.0v", |
" 0406 Wildcard TE406P Quad-Span togglable E1/T1/J1 echo cancellation card 5.0v", |
" 0410 Wildcard TE410P Quad-Span togglable E1/T1/J1 card 3.3v", |
" 0411 Wildcard TE411P Quad-Span togglable E1/T1/J1 echo cancellation card 3.3v", |
" 2400 Wildcard TDM2400P", |
"d4d4 Dy4 Systems Inc", |
" 0601 PCI Mezzanine Card", |
"d531 I+ME ACTIA GmbH", |
"d84d Exsys", |
"dead Indigita Corporation", |
"deaf Middle Digital Inc.", |
" 9050 PC Weasel Virtual VGA", |
" 9051 PC Weasel Serial Port", |
" 9052 PC Weasel Watchdog Timer", |
"e000 Winbond", |
" e000 W89C940", |
"e159 Tiger Jet Network Inc.", |
" 0001 Tiger3XX Modem/ISDN interface", |
" 0059 0001 128k ISDN-S/T Adapter", |
" 0059 0003 128k ISDN-U Adapter", |
" 00a7 0001 TELES.S0/PCI 2.x ISDN Adapter", |
" 8086 0003 Digium X100P/X101P analogue PSTN FXO interface", |
" 0002 Tiger100APC ISDN chipset", |
"e4bf EKF Elektronik GmbH", |
"e55e Essence Technology, Inc.", |
"ea01 Eagle Technology", |
" 000a PCI-773 Temperature Card", |
" 0032 PCI-730 & PC104P-30 Card", |
" 003e PCI-762 Opto-Isolator Card", |
" 0041 PCI-763 Reed Relay Card", |
" 0043 PCI-769 Opto-Isolator Reed Relay Combo Card", |
" 0046 PCI-766 Analog Output Card", |
" 0052 PCI-703 Analog I/O Card", |
" 0800 PCI-800 Digital I/O Card", |
"ea60 RME", |
" 9896 Digi32", |
" 9897 Digi32 Pro", |
" 9898 Digi32/8", |
"eabb Aashima Technology B.V.", |
"eace Endace Measurement Systems, Ltd", |
" 3100 DAG 3.10 OC-3/OC-12", |
" 3200 DAG 3.2x OC-3/OC-12", |
" 320e DAG 3.2E Fast Ethernet", |
" 340e DAG 3.4E Fast Ethernet", |
" 341e DAG 3.41E Fast Ethernet", |
" 3500 DAG 3.5 OC-3/OC-12", |
" 351c DAG 3.5ECM Fast Ethernet", |
" 4100 DAG 4.10 OC-48", |
" 4110 DAG 4.11 OC-48", |
" 4220 DAG 4.2 OC-48", |
" 422e DAG 4.2E Dual Gigabit Ethernet", |
"ec80 Belkin Corporation", |
" ec00 F5D6000", |
"ecc0 Echo Digital Audio Corporation", |
"edd8 ARK Logic Inc", |
" a091 1000PV [Stingray]", |
" a099 2000PV [Stingray]", |
" a0a1 2000MT", |
" a0a9 2000MI", |
"f1d0 AJA Video", |
" c0fe Xena HS/HD-R", |
" c0ff Kona/Xena 2", |
" cafe Kona SD", |
" cfee Xena LS/SD-22-DA/SD-DA", |
" dcaf Kona HD", |
" dfee Xena HD-DA", |
" efac Xena SD-MM/SD-22-MM", |
" facd Xena HD-MM", |
"fa57 Interagon AS", |
" 0001 PMC [Pattern Matching Chip]", |
"fab7 Fabric7 Systems, Inc.", |
"febd Ultraview Corp.", |
"feda Broadcom Inc", |
" a0fa BCM4210 iLine10 HomePNA 2.0", |
" a10e BCM4230 iLine10 HomePNA 2.0", |
"fede Fedetec Inc.", |
" 0003 TABIC PCI v3", |
"fffd XenSource, Inc.", |
" 0101 PCI Event Channel Controller", |
"fffe VMWare Inc", |
" 0405 Virtual SVGA 4.0", |
" 0710 Virtual SVGA", |
"ffff Illegal Vendor ID", |
"C 00 Unclassified device", |
" 00 Non-VGA unclassified device", |
" 01 VGA compatible unclassified device", |
"C 01 Mass storage controller", |
" 00 SCSI storage controller", |
" 01 IDE interface", |
" 02 Floppy disk controller", |
" 03 IPI bus controller", |
" 04 RAID bus controller", |
" 05 ATA controller", |
" 20 ADMA single stepping", |
" 40 ADMA continuous operation", |
" 06 SATA controller", |
" 00 Vendor specific", |
" 01 AHCI 1.0", |
" 07 Serial Attached SCSI controller", |
" 80 Mass storage controller", |
"C 02 Network controller", |
" 00 Ethernet controller", |
" 01 Token ring network controller", |
" 02 FDDI network controller", |
" 03 ATM network controller", |
" 04 ISDN controller", |
" 80 Network controller", |
"C 03 Display controller", |
" 00 VGA compatible controller", |
" 00 VGA", |
" 01 8514", |
" 01 XGA compatible controller", |
" 02 3D controller", |
" 80 Display controller", |
"C 04 Multimedia controller", |
" 00 Multimedia video controller", |
" 01 Multimedia audio controller", |
" 02 Computer telephony device", |
" 03 Audio device", |
" 80 Multimedia controller", |
"C 05 Memory controller", |
" 00 RAM memory", |
" 01 FLASH memory", |
" 80 Memory controller", |
"C 06 Bridge", |
" 00 Host bridge", |
" 01 ISA bridge", |
" 02 EISA bridge", |
" 03 MicroChannel bridge", |
" 04 PCI bridge", |
" 00 Normal decode", |
" 01 Subtractive decode", |
" 05 PCMCIA bridge", |
" 06 NuBus bridge", |
" 07 CardBus bridge", |
" 08 RACEway bridge", |
" 00 Transparent mode", |
" 01 Endpoint mode", |
" 09 Semi-transparent PCI-to-PCI bridge", |
" 40 Primary bus towards host CPU", |
" 80 Secondary bus towards host CPU", |
" 0a InfiniBand to PCI host bridge", |
" 80 Bridge", |
"C 07 Communication controller", |
" 00 Serial controller", |
" 00 8250", |
" 01 16450", |
" 02 16550", |
" 03 16650", |
" 04 16750", |
" 05 16850", |
" 06 16950", |
" 01 Parallel controller", |
" 00 SPP", |
" 01 BiDir", |
" 02 ECP", |
" 03 IEEE1284", |
" fe IEEE1284 Target", |
" 02 Multiport serial controller", |
" 03 Modem", |
" 00 Generic", |
" 01 Hayes/16450", |
" 02 Hayes/16550", |
" 03 Hayes/16650", |
" 04 Hayes/16750", |
" 80 Communication controller", |
"C 08 Generic system peripheral", |
" 00 PIC", |
" 00 8259", |
" 01 ISA PIC", |
" 02 EISA PIC", |
" 10 IO-APIC", |
" 20 IO(X)-APIC", |
" 01 DMA controller", |
" 00 8237", |
" 01 ISA DMA", |
" 02 EISA DMA", |
" 02 Timer", |
" 00 8254", |
" 01 ISA Timer", |
" 02 EISA Timers", |
" 03 RTC", |
" 00 Generic", |
" 01 ISA RTC", |
" 04 PCI Hot-plug controller", |
" 80 System peripheral", |
"C 09 Input device controller", |
" 00 Keyboard controller", |
" 01 Digitizer Pen", |
" 02 Mouse controller", |
" 03 Scanner controller", |
" 04 Gameport controller", |
" 00 Generic", |
" 10 Extended", |
" 80 Input device controller", |
"C 0a Docking station", |
" 00 Generic Docking Station", |
" 80 Docking Station", |
"C 0b Processor", |
" 00 386", |
" 01 486", |
" 02 Pentium", |
" 10 Alpha", |
" 20 Power PC", |
" 30 MIPS", |
" 40 Co-processor", |
"C 0c Serial bus controller", |
" 00 FireWire (IEEE 1394)", |
" 00 Generic", |
" 10 OHCI", |
" 01 ACCESS Bus", |
" 02 SSA", |
" 03 USB Controller", |
" 00 UHCI", |
" 10 OHCI", |
" 20 EHCI", |
" 80 Unspecified", |
" fe USB Device", |
" 04 Fibre Channel", |
" 05 SMBus", |
" 06 InfiniBand", |
"C 0d Wireless controller", |
" 00 IRDA controller", |
" 01 Consumer IR controller", |
" 10 RF controller", |
" 80 Wireless controller", |
"C 0e Intelligent controller", |
" 00 I2O", |
"C 0f Satellite communications controller", |
" 00 Satellite TV controller", |
" 01 Satellite audio communication controller", |
" 03 Satellite voice communication controller", |
" 04 Satellite data communication controller", |
"C 10 Encryption controller", |
" 00 Network and computing encryption device", |
" 10 Entertainment encryption device", |
" 80 Encryption controller", |
"C 11 Signal processing controller", |
" 00 DPIO module", |
" 01 Performance counters", |
" 10 Communication synchronizer", |
" 80 Signal processing controller", |
"" |
}; |
/tags/0.2.0/uspace/pci/libpci/Makefile |
---|
0,0 → 1,29 |
# Makefile for The PCI Library |
# (c) 1999 Martin Mares <mj@ucw.cz> |
# Modified and ported to HelenOS by Jakub Jermar |
LIBC_PREFIX=$(shell cd ../../libc; pwd) |
include $(LIBC_PREFIX)/Makefile.toolchain |
LIBS = $(LIBC_PREFIX)/libc.a |
CFLAGS += -I$(LIBC_PREFIX)/include -trigraphs |
OBJS=access.o generic.o names.o |
INCL=internal.h pci.h header.h sysdep.h types.h pci_ids.h |
PCILIB=libpci.a |
OBJS += i386-ports.o |
all: $(PCILIB) |
$(PCILIB): $(OBJS) |
$(AR) rc $@ $(OBJS) |
%.o: %.c $(INCL) |
$(CC) $(CFLAGS) -c $< -o $@ |
clean: |
-rm *.o libpci.a |
/tags/0.2.0/uspace/pci/COPYING |
---|
0,0 → 1,340 |
GNU GENERAL PUBLIC LICENSE |
Version 2, June 1991 |
Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Everyone is permitted to copy and distribute verbatim copies |
of this license document, but changing it is not allowed. |
Preamble |
The licenses for most software are designed to take away your |
freedom to share and change it. By contrast, the GNU General Public |
License is intended to guarantee your freedom to share and change free |
software--to make sure the software is free for all its users. This |
General Public License applies to most of the Free Software |
Foundation's software and to any other program whose authors commit to |
using it. (Some other Free Software Foundation software is covered by |
the GNU Library General Public License instead.) You can apply it to |
your programs, too. |
When we speak of free software, we are referring to freedom, not |
price. Our General Public Licenses are designed to make sure that you |
have the freedom to distribute copies of free software (and charge for |
this service if you wish), that you receive source code or can get it |
if you want it, that you can change the software or use pieces of it |
in new free programs; and that you know you can do these things. |
To protect your rights, we need to make restrictions that forbid |
anyone to deny you these rights or to ask you to surrender the rights. |
These restrictions translate to certain responsibilities for you if you |
distribute copies of the software, or if you modify it. |
For example, if you distribute copies of such a program, whether |
gratis or for a fee, you must give the recipients all the rights that |
you have. You must make sure that they, too, receive or can get the |
source code. And you must show them these terms so they know their |
rights. |
We protect your rights with two steps: (1) copyright the software, and |
(2) offer you this license which gives you legal permission to copy, |
distribute and/or modify the software. |
Also, for each author's protection and ours, we want to make certain |
that everyone understands that there is no warranty for this free |
software. If the software is modified by someone else and passed on, we |
want its recipients to know that what they have is not the original, so |
that any problems introduced by others will not reflect on the original |
authors' reputations. |
Finally, any free program is threatened constantly by software |
patents. We wish to avoid the danger that redistributors of a free |
program will individually obtain patent licenses, in effect making the |
program proprietary. To prevent this, we have made it clear that any |
patent must be licensed for everyone's free use or not licensed at all. |
The precise terms and conditions for copying, distribution and |
modification follow. |
GNU GENERAL PUBLIC LICENSE |
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
0. This License applies to any program or other work which contains |
a notice placed by the copyright holder saying it may be distributed |
under the terms of this General Public License. The "Program", below, |
refers to any such program or work, and a "work based on the Program" |
means either the Program or any derivative work under copyright law: |
that is to say, a work containing the Program or a portion of it, |
either verbatim or with modifications and/or translated into another |
language. (Hereinafter, translation is included without limitation in |
the term "modification".) Each licensee is addressed as "you". |
Activities other than copying, distribution and modification are not |
covered by this License; they are outside its scope. The act of |
running the Program is not restricted, and the output from the Program |
is covered only if its contents constitute a work based on the |
Program (independent of having been made by running the Program). |
Whether that is true depends on what the Program does. |
1. You may copy and distribute verbatim copies of the Program's |
source code as you receive it, in any medium, provided that you |
conspicuously and appropriately publish on each copy an appropriate |
copyright notice and disclaimer of warranty; keep intact all the |
notices that refer to this License and to the absence of any warranty; |
and give any other recipients of the Program a copy of this License |
along with the Program. |
You may charge a fee for the physical act of transferring a copy, and |
you may at your option offer warranty protection in exchange for a fee. |
2. You may modify your copy or copies of the Program or any portion |
of it, thus forming a work based on the Program, and copy and |
distribute such modifications or work under the terms of Section 1 |
above, provided that you also meet all of these conditions: |
a) You must cause the modified files to carry prominent notices |
stating that you changed the files and the date of any change. |
b) You must cause any work that you distribute or publish, that in |
whole or in part contains or is derived from the Program or any |
part thereof, to be licensed as a whole at no charge to all third |
parties under the terms of this License. |
c) If the modified program normally reads commands interactively |
when run, you must cause it, when started running for such |
interactive use in the most ordinary way, to print or display an |
announcement including an appropriate copyright notice and a |
notice that there is no warranty (or else, saying that you provide |
a warranty) and that users may redistribute the program under |
these conditions, and telling the user how to view a copy of this |
License. (Exception: if the Program itself is interactive but |
does not normally print such an announcement, your work based on |
the Program is not required to print an announcement.) |
These requirements apply to the modified work as a whole. If |
identifiable sections of that work are not derived from the Program, |
and can be reasonably considered independent and separate works in |
themselves, then this License, and its terms, do not apply to those |
sections when you distribute them as separate works. But when you |
distribute the same sections as part of a whole which is a work based |
on the Program, the distribution of the whole must be on the terms of |
this License, whose permissions for other licensees extend to the |
entire whole, and thus to each and every part regardless of who wrote it. |
Thus, it is not the intent of this section to claim rights or contest |
your rights to work written entirely by you; rather, the intent is to |
exercise the right to control the distribution of derivative or |
collective works based on the Program. |
In addition, mere aggregation of another work not based on the Program |
with the Program (or with a work based on the Program) on a volume of |
a storage or distribution medium does not bring the other work under |
the scope of this License. |
3. You may copy and distribute the Program (or a work based on it, |
under Section 2) in object code or executable form under the terms of |
Sections 1 and 2 above provided that you also do one of the following: |
a) Accompany it with the complete corresponding machine-readable |
source code, which must be distributed under the terms of Sections |
1 and 2 above on a medium customarily used for software interchange; or, |
b) Accompany it with a written offer, valid for at least three |
years, to give any third party, for a charge no more than your |
cost of physically performing source distribution, a complete |
machine-readable copy of the corresponding source code, to be |
distributed under the terms of Sections 1 and 2 above on a medium |
customarily used for software interchange; or, |
c) Accompany it with the information you received as to the offer |
to distribute corresponding source code. (This alternative is |
allowed only for noncommercial distribution and only if you |
received the program in object code or executable form with such |
an offer, in accord with Subsection b above.) |
The source code for a work means the preferred form of the work for |
making modifications to it. For an executable work, complete source |
code means all the source code for all modules it contains, plus any |
associated interface definition files, plus the scripts used to |
control compilation and installation of the executable. However, as a |
special exception, the source code distributed need not include |
anything that is normally distributed (in either source or binary |
form) with the major components (compiler, kernel, and so on) of the |
operating system on which the executable runs, unless that component |
itself accompanies the executable. |
If distribution of executable or object code is made by offering |
access to copy from a designated place, then offering equivalent |
access to copy the source code from the same place counts as |
distribution of the source code, even though third parties are not |
compelled to copy the source along with the object code. |
4. You may not copy, modify, sublicense, or distribute the Program |
except as expressly provided under this License. Any attempt |
otherwise to copy, modify, sublicense or distribute the Program is |
void, and will automatically terminate your rights under this License. |
However, parties who have received copies, or rights, from you under |
this License will not have their licenses terminated so long as such |
parties remain in full compliance. |
5. You are not required to accept this License, since you have not |
signed it. However, nothing else grants you permission to modify or |
distribute the Program or its derivative works. These actions are |
prohibited by law if you do not accept this License. Therefore, by |
modifying or distributing the Program (or any work based on the |
Program), you indicate your acceptance of this License to do so, and |
all its terms and conditions for copying, distributing or modifying |
the Program or works based on it. |
6. Each time you redistribute the Program (or any work based on the |
Program), the recipient automatically receives a license from the |
original licensor to copy, distribute or modify the Program subject to |
these terms and conditions. You may not impose any further |
restrictions on the recipients' exercise of the rights granted herein. |
You are not responsible for enforcing compliance by third parties to |
this License. |
7. If, as a consequence of a court judgment or allegation of patent |
infringement or for any other reason (not limited to patent issues), |
conditions are imposed on you (whether by court order, agreement or |
otherwise) that contradict the conditions of this License, they do not |
excuse you from the conditions of this License. If you cannot |
distribute so as to satisfy simultaneously your obligations under this |
License and any other pertinent obligations, then as a consequence you |
may not distribute the Program at all. For example, if a patent |
license would not permit royalty-free redistribution of the Program by |
all those who receive copies directly or indirectly through you, then |
the only way you could satisfy both it and this License would be to |
refrain entirely from distribution of the Program. |
If any portion of this section is held invalid or unenforceable under |
any particular circumstance, the balance of the section is intended to |
apply and the section as a whole is intended to apply in other |
circumstances. |
It is not the purpose of this section to induce you to infringe any |
patents or other property right claims or to contest validity of any |
such claims; this section has the sole purpose of protecting the |
integrity of the free software distribution system, which is |
implemented by public license practices. Many people have made |
generous contributions to the wide range of software distributed |
through that system in reliance on consistent application of that |
system; it is up to the author/donor to decide if he or she is willing |
to distribute software through any other system and a licensee cannot |
impose that choice. |
This section is intended to make thoroughly clear what is believed to |
be a consequence of the rest of this License. |
8. If the distribution and/or use of the Program is restricted in |
certain countries either by patents or by copyrighted interfaces, the |
original copyright holder who places the Program under this License |
may add an explicit geographical distribution limitation excluding |
those countries, so that distribution is permitted only in or among |
countries not thus excluded. In such case, this License incorporates |
the limitation as if written in the body of this License. |
9. The Free Software Foundation may publish revised and/or new versions |
of the General Public License from time to time. Such new versions will |
be similar in spirit to the present version, but may differ in detail to |
address new problems or concerns. |
Each version is given a distinguishing version number. If the Program |
specifies a version number of this License which applies to it and "any |
later version", you have the option of following the terms and conditions |
either of that version or of any later version published by the Free |
Software Foundation. If the Program does not specify a version number of |
this License, you may choose any version ever published by the Free Software |
Foundation. |
10. If you wish to incorporate parts of the Program into other free |
programs whose distribution conditions are different, write to the author |
to ask for permission. For software which is copyrighted by the Free |
Software Foundation, write to the Free Software Foundation; we sometimes |
make exceptions for this. Our decision will be guided by the two goals |
of preserving the free status of all derivatives of our free software and |
of promoting the sharing and reuse of software generally. |
NO WARRANTY |
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
REPAIR OR CORRECTION. |
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
POSSIBILITY OF SUCH DAMAGES. |
END OF TERMS AND CONDITIONS |
How to Apply These Terms to Your New Programs |
If you develop a new program, and you want it to be of the greatest |
possible use to the public, the best way to achieve this is to make it |
free software which everyone can redistribute and change under these terms. |
To do so, attach the following notices to the program. It is safest |
to attach them to the start of each source file to most effectively |
convey the exclusion of warranty; and each file should have at least |
the "copyright" line and a pointer to where the full notice is found. |
<one line to give the program's name and a brief idea of what it does.> |
Copyright (C) <year> <name of author> |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Also add information on how to contact you by electronic and paper mail. |
If the program is interactive, make it output a short notice like this |
when it starts in an interactive mode: |
Gnomovision version 69, Copyright (C) year name of author |
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
This is free software, and you are welcome to redistribute it |
under certain conditions; type `show c' for details. |
The hypothetical commands `show w' and `show c' should show the appropriate |
parts of the General Public License. Of course, the commands you use may |
be called something other than `show w' and `show c'; they could even be |
mouse-clicks or menu items--whatever suits your program. |
You should also get your employer (if you work as a programmer) or your |
school, if any, to sign a "copyright disclaimer" for the program, if |
necessary. Here is a sample; alter the names: |
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
<signature of Ty Coon>, 1 April 1989 |
Ty Coon, President of Vice |
This General Public License does not permit incorporating your program into |
proprietary programs. If your program is a subroutine library, you may |
consider it more useful to permit linking proprietary applications with the |
library. If this is what you want to do, use the GNU Library General |
Public License instead of this License. |
/tags/0.2.0/uspace/pci/update-ids |
---|
0,0 → 1,16 |
#! /bin/bash |
wget http://pciids.sourceforge.net/v2.2/pci.ids |
cat >pci_ids.h <<EOF |
/* DO NOT EDIT, THIS FILE IS AUTOMATICALLY GENERATED */ |
char *pci_ids[] = { |
EOF |
cat pci.ids | grep -v '^#.*' | grep -v '^$' | tr \" \' | sed -n 's/\(.*\)/"\1",/p' >>pci_ids.h |
cat >>pci_ids.h <<EOF |
"" |
}; |
EOF |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.2.0/uspace/Makefile |
---|
0,0 → 1,86 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Include configuration |
# |
-include Makefile.config |
DIRS = \ |
libc \ |
softint \ |
softfloat \ |
init \ |
ns \ |
fb \ |
kbd \ |
console \ |
tetris \ |
ipcc \ |
klog |
ifeq ($(ARCH), amd64) |
DIRS += pci |
endif |
ifeq ($(ARCH), ia32) |
DIRS += pci |
endif |
CFLAGS += -DCONFIG_MIPS_FPU |
BUILDS := $(addsuffix .build,$(DIRS)) |
CLEANS := $(addsuffix .clean,$(DIRS)) |
.PHONY: all config build $(BUILDS) $(CLEANS) clean distclean |
all: |
tools/config.py default $(NARCH) |
ifdef NARCH |
ifneq ($(ARCH), $(NARCH)) |
$(MAKE) -C . clean |
endif |
endif |
$(MAKE) -C . build |
config: |
tools/config.py |
build: $(BUILDS) |
clean: $(CLEANS) |
find $(SOURCES) -name '*.o' -follow -exec rm \{\} \; |
find libc -name "_link.ld" -exec rm \{\} \; |
distclean: clean |
-rm Makefile.config |
$(CLEANS): |
$(MAKE) -C $(basename $@) clean ARCH=$(ARCH) |
$(BUILDS): |
$(MAKE) -C $(basename $@) all ARCH=$(ARCH) COMPILER=$(COMPILER) |
/tags/0.2.0/uspace/ipcc/ipcc.c |
---|
0,0 → 1,281 |
/* |
* Copyright (C) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author 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 ``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 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. |
*/ |
/** @addtogroup ippc IPC Tester |
* @brief IPC tester and task faulter. |
* @{ |
*/ |
/** |
* @file |
*/ |
#include <stdio.h> |
#include <async.h> |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <errno.h> |
#define TEST_START 10000 |
#define MAXLIST 4 |
#define MSG_HANG_ME_UP 2000 |
static int connections[50]; |
static ipc_callid_t callids[50]; |
static int phones[20]; |
static int myservice = 0; |
static void client_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
ipcarg_t phonehash = icall->in_phone_hash; |
int retval; |
int i; |
printf("Connected phone: %P, accepting\n", icall->in_phone_hash); |
ipc_answer_fast(iid, 0, 0, 0); |
for (i=0;i < 1024;i++) |
if (!connections[i]) { |
connections[i] = phonehash; |
break; |
} |
while (1) { |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
printf("Phone (%P) hung up.\n", phonehash); |
retval = 0; |
break; |
default: |
printf("Received message from %P: %X\n", phonehash,callid); |
for (i=0; i < 1024; i++) |
if (!callids[i]) { |
callids[i] = callid; |
break; |
} |
continue; |
} |
ipc_answer_fast(callid, retval, 0, 0); |
} |
} |
static void printhelp(void) |
{ |
printf("? - help\n"); |
printf("c - connect to other service\n"); |
printf("h - hangup connection\n"); |
printf("a - send async message to other service\n"); |
printf("s - send sync message to other service\n"); |
printf("d - answer message that we have received\n"); |
printf("j - jump to endless loop\n"); |
printf("p - page fault\n"); |
printf("u - unaligned read\n"); |
} |
static void callback(void *private, int retval, ipc_call_t *data) |
{ |
printf("Received response to msg %d - retval: %d.\n", private, |
retval); |
} |
static void do_answer_msg(void) |
{ |
int i,cnt, errn; |
char c; |
ipc_callid_t callid; |
cnt = 0; |
for (i=0;i < 50;i++) { |
if (callids[i]) { |
printf("%d: %P\n", cnt, callids[i]); |
cnt++; |
} |
if (cnt >= 10) |
break; |
} |
if (!cnt) |
return; |
printf("Choose message:\n"); |
do { |
c = getchar(); |
} while (c < '0' || (c-'0') >= cnt); |
cnt = c - '0' + 1; |
for (i=0;cnt;i++) |
if (callids[i]) |
cnt--; |
i -= 1; |
printf("Normal (n) or hangup (h) or error(e) message?\n"); |
do { |
c = getchar(); |
} while (c != 'n' && c != 'h' && c != 'e'); |
if (c == 'n') |
errn = 0; |
else if (c == 'h') |
errn = EHANGUP; |
else if (c == 'e') |
errn = ENOENT; |
printf("Answering %P\n", callids[i]); |
ipc_answer_fast(callids[i], errn, 0, 0); |
callids[i] = 0; |
} |
static void do_send_msg(int async) |
{ |
int phoneid; |
int res; |
static int msgid = 1; |
char c; |
printf("Select phoneid to send msg: 2-9\n"); |
do { |
c = getchar(); |
} while (c < '2' || c > '9'); |
phoneid = c - '0'; |
if (async) { |
ipc_call_async(phoneid, 2000, 0, (void *)msgid, callback, 1); |
printf("Async sent - msg %d\n", msgid); |
msgid++; |
} else { |
printf("Sending msg..."); |
res = ipc_call_sync_2(phoneid, 2000, 0, 0, NULL, NULL); |
printf("done: %d\n", res); |
} |
} |
static void do_hangup(void) |
{ |
char c; |
int res; |
int phoneid; |
printf("Select phoneid to hangup: 2-9\n"); |
do { |
c = getchar(); |
} while (c < '2' || c > '9'); |
phoneid = c - '0'; |
printf("Hanging up..."); |
res = ipc_hangup(phoneid); |
printf("done: %d\n", phoneid); |
} |
static void do_connect(void) |
{ |
char c; |
int svc; |
int phid; |
printf("Choose one service: 0:10000....9:10009\n"); |
do { |
c = getchar(); |
} while (c < '0' || c > '9'); |
svc = TEST_START + c - '0'; |
if (svc == myservice) { |
printf("Currently cannot connect to myself, update test\n"); |
return; |
} |
printf("Connecting to %d..", svc); |
phid = ipc_connect_me_to(PHONE_NS, svc, 0); |
if (phid > 0) { |
printf("phoneid: %d\n", phid); |
phones[phid] = 1; |
} else |
printf("error: %d\n", phid); |
} |
int main(void) |
{ |
ipcarg_t phonead; |
int i; |
char c; |
int res; |
volatile long long var; |
volatile int var1; |
printf("********************************\n"); |
printf("***********IPC Tester***********\n"); |
printf("********************************\n"); |
async_set_client_connection(client_connection); |
for (i=TEST_START;i < TEST_START+10;i++) { |
res = ipc_connect_to_me(PHONE_NS, i, 0, &phonead); |
if (!res) |
break; |
printf("Failed registering as %d..:%d\n", i, res); |
} |
printf("Registered as service: %d\n", i); |
myservice = i; |
printhelp(); |
while (1) { |
c = getchar(); |
switch (c) { |
case '?': |
printhelp(); |
break; |
case 'h': |
do_hangup(); |
break; |
case 'c': |
do_connect(); |
break; |
case 'a': |
do_send_msg(1); |
break; |
case 's': |
do_send_msg(0); |
break; |
case 'd': |
do_answer_msg(); |
break; |
case 'j': |
while (1) |
; |
case 'p': |
printf("Doing page fault\n"); |
*((char *)0) = 1; |
printf("done\n"); |
case 'u': |
var1=*( (int *) ( ( (char *)(&var) ) + 1 ) ); |
break; |
} |
} |
} |
/** @} |
*/ |
/tags/0.2.0/uspace/ipcc/Makefile |
---|
0,0 → 1,73 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author 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 ``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 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. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../libc |
SOFTINT_PREFIX = ../softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I../kbd/include |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = ipcc |
SOURCES = ipcc.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |