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

📄 rombios.c

📁 xen虚拟机源代码安装包
💻 C
📖 第 1 页 / 共 5 页
字号:
#else#  define BX_DEBUG_INT1A(a...)#endif#if DEBUG_INT74#  define BX_DEBUG_INT74(a...) BX_DEBUG(a)#else#  define BX_DEBUG_INT74(a...)#endif#define SET_AL(val8) AX = ((AX & 0xff00) | (val8))#define SET_BL(val8) BX = ((BX & 0xff00) | (val8))#define SET_CL(val8) CX = ((CX & 0xff00) | (val8))#define SET_DL(val8) DX = ((DX & 0xff00) | (val8))#define SET_AH(val8) AX = ((AX & 0x00ff) | ((val8) << 8))#define SET_BH(val8) BX = ((BX & 0x00ff) | ((val8) << 8))#define SET_CH(val8) CX = ((CX & 0x00ff) | ((val8) << 8))#define SET_DH(val8) DX = ((DX & 0x00ff) | ((val8) << 8))#define GET_AL() ( AX & 0x00ff )#define GET_BL() ( BX & 0x00ff )#define GET_CL() ( CX & 0x00ff )#define GET_DL() ( DX & 0x00ff )#define GET_AH() ( AX >> 8 )#define GET_BH() ( BX >> 8 )#define GET_CH() ( CX >> 8 )#define GET_DH() ( DX >> 8 )#define GET_ELDL() ( ELDX & 0x00ff )#define GET_ELDH() ( ELDX >> 8 )#define SET_CF()     FLAGS |= 0x0001#define CLEAR_CF()   FLAGS &= 0xfffe#define GET_CF()     (FLAGS & 0x0001)#define SET_ZF()     FLAGS |= 0x0040#define CLEAR_ZF()   FLAGS &= 0xffbf#define GET_ZF()     (FLAGS & 0x0040)#define UNSUPPORTED_FUNCTION 0x86#define none 0#define MAX_SCAN_CODE 0x58static struct {  Bit16u normal;  Bit16u shift;  Bit16u control;  Bit16u alt;  Bit8u lock_flags;  } scan_to_scanascii[MAX_SCAN_CODE + 1] = {      {   none,   none,   none,   none, none },      { 0x011b, 0x011b, 0x011b, 0x0100, none }, /* escape */      { 0x0231, 0x0221,   none, 0x7800, none }, /* 1! */      { 0x0332, 0x0340, 0x0300, 0x7900, none }, /* 2@ */      { 0x0433, 0x0423,   none, 0x7a00, none }, /* 3# */      { 0x0534, 0x0524,   none, 0x7b00, none }, /* 4$ */      { 0x0635, 0x0625,   none, 0x7c00, none }, /* 5% */      { 0x0736, 0x075e, 0x071e, 0x7d00, none }, /* 6^ */      { 0x0837, 0x0826,   none, 0x7e00, none }, /* 7& */      { 0x0938, 0x092a,   none, 0x7f00, none }, /* 8* */      { 0x0a39, 0x0a28,   none, 0x8000, none }, /* 9( */      { 0x0b30, 0x0b29,   none, 0x8100, none }, /* 0) */      { 0x0c2d, 0x0c5f, 0x0c1f, 0x8200, none }, /* -_ */      { 0x0d3d, 0x0d2b,   none, 0x8300, none }, /* =+ */      { 0x0e08, 0x0e08, 0x0e7f,   none, none }, /* backspace */      { 0x0f09, 0x0f00,   none,   none, none }, /* tab */      { 0x1071, 0x1051, 0x1011, 0x1000, 0x40 }, /* Q */      { 0x1177, 0x1157, 0x1117, 0x1100, 0x40 }, /* W */      { 0x1265, 0x1245, 0x1205, 0x1200, 0x40 }, /* E */      { 0x1372, 0x1352, 0x1312, 0x1300, 0x40 }, /* R */      { 0x1474, 0x1454, 0x1414, 0x1400, 0x40 }, /* T */      { 0x1579, 0x1559, 0x1519, 0x1500, 0x40 }, /* Y */      { 0x1675, 0x1655, 0x1615, 0x1600, 0x40 }, /* U */      { 0x1769, 0x1749, 0x1709, 0x1700, 0x40 }, /* I */      { 0x186f, 0x184f, 0x180f, 0x1800, 0x40 }, /* O */      { 0x1970, 0x1950, 0x1910, 0x1900, 0x40 }, /* P */      { 0x1a5b, 0x1a7b, 0x1a1b,   none, none }, /* [{ */      { 0x1b5d, 0x1b7d, 0x1b1d,   none, none }, /* ]} */      { 0x1c0d, 0x1c0d, 0x1c0a,   none, none }, /* Enter */      {   none,   none,   none,   none, none }, /* L Ctrl */      { 0x1e61, 0x1e41, 0x1e01, 0x1e00, 0x40 }, /* A */      { 0x1f73, 0x1f53, 0x1f13, 0x1f00, 0x40 }, /* S */      { 0x2064, 0x2044, 0x2004, 0x2000, 0x40 }, /* D */      { 0x2166, 0x2146, 0x2106, 0x2100, 0x40 }, /* F */      { 0x2267, 0x2247, 0x2207, 0x2200, 0x40 }, /* G */      { 0x2368, 0x2348, 0x2308, 0x2300, 0x40 }, /* H */      { 0x246a, 0x244a, 0x240a, 0x2400, 0x40 }, /* J */      { 0x256b, 0x254b, 0x250b, 0x2500, 0x40 }, /* K */      { 0x266c, 0x264c, 0x260c, 0x2600, 0x40 }, /* L */      { 0x273b, 0x273a,   none,   none, none }, /* ;: */      { 0x2827, 0x2822,   none,   none, none }, /* '" */      { 0x2960, 0x297e,   none,   none, none }, /* `~ */      {   none,   none,   none,   none, none }, /* L shift */      { 0x2b5c, 0x2b7c, 0x2b1c,   none, none }, /* |\ */      { 0x2c7a, 0x2c5a, 0x2c1a, 0x2c00, 0x40 }, /* Z */      { 0x2d78, 0x2d58, 0x2d18, 0x2d00, 0x40 }, /* X */      { 0x2e63, 0x2e43, 0x2e03, 0x2e00, 0x40 }, /* C */      { 0x2f76, 0x2f56, 0x2f16, 0x2f00, 0x40 }, /* V */      { 0x3062, 0x3042, 0x3002, 0x3000, 0x40 }, /* B */      { 0x316e, 0x314e, 0x310e, 0x3100, 0x40 }, /* N */      { 0x326d, 0x324d, 0x320d, 0x3200, 0x40 }, /* M */      { 0x332c, 0x333c,   none,   none, none }, /* ,< */      { 0x342e, 0x343e,   none,   none, none }, /* .> */      { 0x352f, 0x353f,   none,   none, none }, /* /? */      {   none,   none,   none,   none, none }, /* R Shift */      { 0x372a, 0x372a,   none,   none, none }, /* * */      {   none,   none,   none,   none, none }, /* L Alt */      { 0x3920, 0x3920, 0x3920, 0x3920, none }, /* space */      {   none,   none,   none,   none, none }, /* caps lock */      { 0x3b00, 0x5400, 0x5e00, 0x6800, none }, /* F1 */      { 0x3c00, 0x5500, 0x5f00, 0x6900, none }, /* F2 */      { 0x3d00, 0x5600, 0x6000, 0x6a00, none }, /* F3 */      { 0x3e00, 0x5700, 0x6100, 0x6b00, none }, /* F4 */      { 0x3f00, 0x5800, 0x6200, 0x6c00, none }, /* F5 */      { 0x4000, 0x5900, 0x6300, 0x6d00, none }, /* F6 */      { 0x4100, 0x5a00, 0x6400, 0x6e00, none }, /* F7 */      { 0x4200, 0x5b00, 0x6500, 0x6f00, none }, /* F8 */      { 0x4300, 0x5c00, 0x6600, 0x7000, none }, /* F9 */      { 0x4400, 0x5d00, 0x6700, 0x7100, none }, /* F10 */      {   none,   none,   none,   none, none }, /* Num Lock */      {   none,   none,   none,   none, none }, /* Scroll Lock */      { 0x4700, 0x4737, 0x7700,   none, 0x20 }, /* 7 Home */      { 0x4800, 0x4838,   none,   none, 0x20 }, /* 8 UP */      { 0x4900, 0x4939, 0x8400,   none, 0x20 }, /* 9 PgUp */      { 0x4a2d, 0x4a2d,   none,   none, none }, /* - */      { 0x4b00, 0x4b34, 0x7300,   none, 0x20 }, /* 4 Left */      { 0x4c00, 0x4c35,   none,   none, 0x20 }, /* 5 */      { 0x4d00, 0x4d36, 0x7400,   none, 0x20 }, /* 6 Right */      { 0x4e2b, 0x4e2b,   none,   none, none }, /* + */      { 0x4f00, 0x4f31, 0x7500,   none, 0x20 }, /* 1 End */      { 0x5000, 0x5032,   none,   none, 0x20 }, /* 2 Down */      { 0x5100, 0x5133, 0x7600,   none, 0x20 }, /* 3 PgDn */      { 0x5200, 0x5230,   none,   none, 0x20 }, /* 0 Ins */      { 0x5300, 0x532e,   none,   none, 0x20 }, /* Del */      {   none,   none,   none,   none, none }, /* ??? */      {   none,   none,   none,   none, none }, /* ??? */      {   none,   none,   none,   none, none }, /* ??? */      { 0x8500, 0x8700, 0x8900, 0x8b00, none }, /* F11 */      { 0x8600, 0x8800, 0x8a00, 0x8c00, none }, /* F12 */      };  Bit8uinb(port)  Bit16u port;{ASM_START  push bp  mov  bp, sp    push dx    mov  dx, 4[bp]    in   al, dx    pop  dx  pop  bpASM_END}#if BX_USE_ATADRV  Bit16uinw(port)  Bit16u port;{ASM_START  push bp  mov  bp, sp    push dx    mov  dx, 4[bp]    in   ax, dx    pop  dx  pop  bpASM_END}#endif  voidoutb(port, val)  Bit16u port;  Bit8u  val;{ASM_START  push bp  mov  bp, sp    push ax    push dx    mov  dx, 4[bp]    mov  al, 6[bp]    out  dx, al    pop  dx    pop  ax  pop  bpASM_END}#if BX_USE_ATADRV  voidoutw(port, val)  Bit16u port;  Bit16u  val;{ASM_START  push bp  mov  bp, sp    push ax    push dx    mov  dx, 4[bp]    mov  ax, 6[bp]    out  dx, ax    pop  dx    pop  ax  pop  bpASM_END}#endif  voidoutb_cmos(cmos_reg, val)  Bit8u cmos_reg;  Bit8u val;{ASM_START  push bp  mov  bp, sp    mov  al, 4[bp] ;; cmos_reg    out  0x70, al    mov  al, 6[bp] ;; val    out  0x71, al  pop  bpASM_END}  Bit8uinb_cmos(cmos_reg)  Bit8u cmos_reg;{ASM_START  push bp  mov  bp, sp    mov  al, 4[bp] ;; cmos_reg    out 0x70, al    in  al, 0x71  pop  bpASM_END}  voidinit_rtc(){  outb_cmos(0x0a, 0x26);  outb_cmos(0x0b, 0x02);  inb_cmos(0x0c);  inb_cmos(0x0d);}  bx_boolrtc_updating(){  // This function checks to see if the update-in-progress bit  // is set in CMOS Status Register A.  If not, it returns 0.  // If it is set, it tries to wait until there is a transition  // to 0, and will return 0 if such a transition occurs.  A 1  // is returned only after timing out.  The maximum period  // that this bit should be set is constrained to 244useconds.  // The count I use below guarantees coverage or more than  // this time, with any reasonable IPS setting.  Bit16u count;  count = 25000;  while (--count != 0) {    if ( (inb_cmos(0x0a) & 0x80) == 0 )      return(0);    }  return(1); // update-in-progress never transitioned to 0}  Bit8uread_byte(seg, offset)  Bit16u seg;  Bit16u offset;{ASM_START  push bp  mov  bp, sp    push bx    push ds    mov  ax, 4[bp] ; segment    mov  ds, ax    mov  bx, 6[bp] ; offset    mov  al, [bx]    ;; al = return value (byte)    pop  ds    pop  bx  pop  bpASM_END}  Bit16uread_word(seg, offset)  Bit16u seg;  Bit16u offset;{ASM_START  push bp  mov  bp, sp    push bx    push ds    mov  ax, 4[bp] ; segment    mov  ds, ax    mov  bx, 6[bp] ; offset    mov  ax, [bx]    ;; ax = return value (word)    pop  ds    pop  bx  pop  bpASM_END}  voidwrite_byte(seg, offset, data)  Bit16u seg;  Bit16u offset;  Bit8u data;{ASM_START  push bp  mov  bp, sp    push ax    push bx    push ds    mov  ax, 4[bp] ; segment    mov  ds, ax    mov  bx, 6[bp] ; offset    mov  al, 8[bp] ; data byte    mov  [bx], al  ; write data byte    pop  ds    pop  bx    pop  ax  pop  bpASM_END}  voidwrite_word(seg, offset, data)  Bit16u seg;  Bit16u offset;  Bit16u data;{ASM_START  push bp  mov  bp, sp    push ax    push bx    push ds    mov  ax, 4[bp] ; segment    mov  ds, ax    mov  bx, 6[bp] ; offset    mov  ax, 8[bp] ; data word    mov  [bx], ax  ; write data word    pop  ds    pop  bx    pop  ax  pop  bpASM_END}  Bit16uget_CS(){ASM_START  mov  ax, csASM_END}//  Bit16u//get_DS()//{//ASM_START//  mov  ax, ds//ASM_END//}////  void//set_DS(ds_selector)//  Bit16u ds_selector;//{//ASM_START//  push bp//  mov  bp, sp////    push ax//    mov  ax, 4[bp] ; ds_selector//    mov  ds, ax//    pop  ax////  pop  bp//ASM_END//}  Bit16uget_SS(){ASM_START  mov  ax, ssASM_END}#ifdef HVMASSISTvoidcopy_e820_table(){  Bit8u nr_entries = read_byte(0x9000, 0x1e8);  Bit32u base_mem;  if (nr_entries > 32)  	nr_entries = 32;  write_word(0xe000, 0x8, nr_entries);  memcpyb(0xe000, 0x10, 0x9000, 0x2d0, nr_entries * 0x14);  /* Report the proper base memory size at address 0x0413: otherwise   * non-e820 code will clobber things if BASE_MEM_IN_K is bigger than   * the first e820 entry.  Get the size by reading the second 64bit    * field of the first e820 slot. */   base_mem = read_dword(0x9000, 0x2d0 + 8);  write_word(0x40, 0x13, base_mem >> 10);}voidset_rom_write_access(action)  Bit16u action;{    Bit16u off = (Bit16u)&((struct bios_info *)0)->xen_pfiob;ASM_START    mov si,.set_rom_write_access.off[bp]    push ds    mov ax,#(ACPI_PHYSICAL_ADDRESS >> 4)    mov ds,ax    mov dx,[si]    pop ds    mov ax,.set_rom_write_access.action[bp]    out dx,alASM_END}void enable_rom_write_access(){    set_rom_write_access(0);}void disable_rom_write_access(){    set_rom_write_access(PFFLAG_ROM_LOCK);}    #endif /* HVMASSIST */#if BX_DEBUG_SERIAL/* serial debug port*/#define BX_DEBUG_PORT 0x03f8/* data */#define UART_RBR 0x00#define UART_THR 0x00/* control */#define UART_IER 0x01#define UART_IIR 0x02#define UART_FCR 0x02#define UART_LCR 0x03#define UART_MCR 0x04#define UART_DLL 0x00#define UART_DLM 0x01/* status */#define UART_LSR 0x05#define UART_MSR 0x06#define UART_SCR 0x07int uart_can_tx_byte(base_port)    Bit16u base_port;{    return inb(base_port + UART_LSR) & 0x20;}void uart_wait_to_tx_byte(base_port)    Bit16u base_port;{    while (!uart_can_tx_byte(base_port));}void uart_wait_until_sent(base_port)    Bit16u base_port;{    while (!(inb(base_port + UART_LSR) & 0x40));}

⌨️ 快捷键说明

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