dpmi.h
来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 532 行
H
532 行
/* * Copyright (c) 1994-1996, 1998 University of Utah and the Flux Group. * All rights reserved. * * This file is part of the Flux OSKit. The OSKit is free software, also known * as "open source;" you can redistribute it and/or modify it under the terms * of the GNU General Public License (GPL), version 2, as published by the Free * Software Foundation (FSF). To explore alternate licensing terms, contact * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. * * The OSKit 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 GPL for more details. You should have * received a copy of the GPL along with the OSKit; see the file COPYING. If * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. */#ifndef _OSKIT_X86_DOS_DPMI_H_#define _OSKIT_X86_DOS_DPMI_H_#include <oskit/inline.h>#include <oskit/x86/seg.h>typedef unsigned short dpmi_error_t;#define DPMI_UNSUPPORTED_FUNCTION 0x8001#define DPMI_OBJECT_WRONG_STATE 0x8002#define DPMI_SYSTEM_INTEGRITY 0x8003#define DPMI_DEADLOCK 0x8004#define DPMI_SERIALIZATION_CANCELLED 0x8005#define DPMI_OUT_OF_RESOURCES 0x8010#define DPMI_DESCRIPTOR_UNAVAILABLE 0x8011#define DPMI_LINEAR_MEMORY_UNAVAILABLE 0x8012#define DPMI_PHYSICAL_MEMORY_UNAVAILABLE 0x8013#define DPMI_BACKING_STORE_UNAVAILABLE 0x8014#define DPMI_CALLBACK_UNAVAILABLE 0x8015#define DPMI_HANDLE_UNAVAILABLE 0x8016#define DPMI_MAX_LOCK_COUNT_EXCEEDED 0x8017#define DPMI_ALREADY_SERIALIZED_EXCLUSIVELY 0x8018#define DPMI_ALREADY_SERIALIZED_SHARED 0x8019#define DPMI_INVALID_VALUE 0x8021#define DPMI_INVALID_SELECTOR 0x8022#define DPMI_INVALID_HANDLE 0x8023#define DPMI_INVALID_CALLBACK 0x8024#define DPMI_INVALID_LINEAR_ADDRESS 0x8025#define DPMI_NOT_SUPPORTED_BY_HARDWARE 0x8026struct real_call_data; /*XXX*/MACH_INLINE dpmi_error_t dpmi_switch_to_pmode( struct far_pointer_16 *pmode_entry_vector, unsigned short host_data_seg){ dpmi_error_t err; asm volatile(" movw %3,%%es lcallw %2 jc 1f xorw %%ax,%%ax 1: pushw %%ds popw %%es " : "=a" (err) : "a" (1), "m" (*pmode_entry_vector), "rm" (host_data_seg)); return err;}MACH_INLINE dpmi_error_t dpmi_allocate_descriptors( unsigned short count, unsigned short *out_selector){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f movw %%ax,%1 xorw %%ax,%%ax 1: " : "=a" (err), "=rm" (*out_selector) : "a" (0x0000), "c" (count)); return err;}MACH_INLINE dpmi_error_t dpmi_get_segment_base( unsigned short selector, unsigned long *out_base){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax shll $16,%ecx movw %dx,%cx 1: " : "=a" (err), "=c" (*out_base) : "a" (0x0006), "b" (selector) : "edx"); return err;}MACH_INLINE dpmi_error_t dpmi_set_segment_base( unsigned short selector, unsigned long base){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err) : "a" (0x0007), "b" (selector), "c" (base >> 16), "d" (base)); return err;}MACH_INLINE dpmi_error_t dpmi_set_segment_limit( unsigned short selector, unsigned limit){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err) : "a" (0x0008), "b" (selector), "c" (limit >> 16), "d" (limit)); return err;}MACH_INLINE dpmi_error_t dpmi_create_code_segment_alias( unsigned short code_selector, unsigned short *out_data_selector){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f movw %%ax,%1 xorw %%ax,%%ax 1: " : "=a" (err), "=rm" (*out_data_selector) : "a" (0x000a), "b" (code_selector)); return err;}MACH_INLINE dpmi_error_t dpmi_get_descriptor( unsigned short selector, struct i386_descriptor *out_descriptor){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err) : "a" (0x000b), "b" (selector), "D" (out_descriptor)); return err;}MACH_INLINE dpmi_error_t dpmi_set_descriptor( unsigned short selector, struct i386_descriptor *descriptor){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err) : "a" (0x000c), "b" (selector), "D" (descriptor)); return err;}MACH_INLINE dpmi_error_t dpmi_allocate_specific_descriptor( unsigned short selector){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err) : "a" (0x000d), "b" (selector)); return err;}MACH_INLINE dpmi_error_t dpmi_get_exception_handler( unsigned char trapno, struct far_pointer_32 *out_vector){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err), "=c" (out_vector->seg), "=d" (out_vector->ofs) : "a" (0x0202), "b" (trapno)); return err;}MACH_INLINE dpmi_error_t dpmi_set_exception_handler( unsigned char trapno, struct far_pointer_32 *vector){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err) : "a" (0x0203), "b" (trapno), "c" (vector->seg), "d" (vector->ofs)); return err;}MACH_INLINE dpmi_error_t dpmi_get_interrupt_handler( unsigned char intvec, struct far_pointer_32 *out_vector){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err), "=c" (out_vector->seg), "=d" (out_vector->ofs) : "a" (0x0204), "b" (intvec)); return err;}MACH_INLINE dpmi_error_t dpmi_set_interrupt_handler( unsigned char intvec, struct far_pointer_32 *vector){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err) : "a" (0x0205), "b" (intvec), "c" (vector->seg), "d" (vector->ofs)); return err;}MACH_INLINE dpmi_error_t dpmi_simulate_real_mode_interrupt( unsigned char intnum, struct real_call_data *call_data){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err) : "a" (0x0300), "b" ((unsigned short)intnum), "c" (0), "D" (call_data)); return err;}struct dpmi_version_status{ unsigned char minor_version; unsigned char major_version; unsigned short flags; unsigned char slave_pic_base; unsigned char master_pic_base; unsigned char processor_type;};MACH_INLINE void dpmi_get_version(struct dpmi_version_status *status){ asm volatile(" int $0x31 " : "=a" (*((short*)&status->minor_version)), "=b" (status->flags), "=c" (status->processor_type), "=d" (*((short*)&status->slave_pic_base)) : "a" (0x0400));}MACH_INLINE dpmi_error_t dpmi_allocate_memory( unsigned size, unsigned *out_linear_addr, unsigned *out_mem_handle){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f shll $16,%%ebx movw %%cx,%%bx shll $16,%%esi movw %%di,%%si xorw %%ax,%%ax 1: " : "=a" (err), "=b" (*out_linear_addr), "=S" (*out_mem_handle) : "a" (0x0501), "b" (size >> 16), "c" (size) : "ebx", "ecx", "esi", "edi"); return err;}MACH_INLINE dpmi_error_t dpmi_free_memory( unsigned mem_handle){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err) : "a" (0x0502), "S" (mem_handle >> 16), "D" (mem_handle)); return err;}MACH_INLINE dpmi_error_t dpmi_allocate_linear_memory( unsigned linear_addr, unsigned size, unsigned flags, unsigned *out_linear_addr, unsigned *out_mem_handle){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err), "=b" (*out_linear_addr), "=S" (*out_mem_handle) : "a" (0x0504), "b" (linear_addr), "c" (size), "d" (flags)); return err;}MACH_INLINE dpmi_error_t dpmi_resize_linear_memory( unsigned handle, unsigned new_size, unsigned flags, unsigned short *update_selector_array, unsigned update_selector_count, unsigned *out_new_linear_addr){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err), "=b" (*out_new_linear_addr) : "a" (0x0505), "b" (update_selector_array), "c" (new_size), "d" (flags), "S" (handle), "D" (update_selector_count)); return err;}MACH_INLINE dpmi_error_t dpmi_map_conventional_memory( unsigned handle, oskit_addr_t offset, oskit_addr_t low_addr, oskit_size_t page_count){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err) : "a" (0x0509), "S" (handle), "b" (offset), "c" (page_count), "d" (low_addr)); return err;}MACH_INLINE dpmi_error_t dpmi_lock_linear_region( oskit_addr_t start_la, oskit_size_t size){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err) : "a" (0x0600), "b" (start_la >> 16), "c" (start_la), "S" (size >> 16), "D" (size)); return err;}MACH_INLINE dpmi_error_t dpmi_unlock_linear_region( oskit_addr_t start_la, oskit_size_t size){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f xorw %%ax,%%ax 1: " : "=a" (err) : "a" (0x0601), "b" (start_la >> 16), "c" (start_la), "S" (size >> 16), "D" (size)); return err;}MACH_INLINE dpmi_error_t dpmi_get_page_size( unsigned *out_page_size){ dpmi_error_t err; asm volatile(" int $0x31 jc 1f shll $16,%%ebx movw %%cx,%%bx xorw %%ax,%%ax 1: " : "=a" (err), "=b" (*out_page_size) : "a" (0x0604) : "ecx"); return err;}#endif /* _OSKIT_X86_DOS_DPMI_H_ */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?