VirtualBox

儲存庫 vbox 的更動 42332


忽略:
時間撮記:
2012-7-23 下午04:48:01 (12 年 以前)
作者:
vboxsync
訊息:

BIOS: Expanded PCI service, removed old 16-bit implementation.

位置:
trunk/src/VBox/Devices/PC/BIOS
檔案:
修改 8 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/Devices/PC/BIOS/inlines.h

    r42127 r42332  
    6161    modify exact [] nomemory aborts;
    6262
     63#ifdef __386__
     64
     65void rep_movsb(void __far *d, void __far *s, int nbytes);
     66#pragma aux rep_movsb =     \
     67    "push   ds"             \
     68    "mov    ds, dx"         \
     69    "rep    movsb"          \
     70    "pop    ds"             \
     71    parm [es edi] [dx esi] [ecx];
     72
     73#else
     74
     75void rep_movsb(void __far *d, void __far *s, int nbytes);
     76#pragma aux rep_movsb =     \
     77    "push   ds"             \
     78    "mov    ds, dx"         \
     79    "rep    movsb"          \
     80    "pop    ds"             \
     81    parm [es di] [dx si] [cx];
     82
     83#endif
     84
    6385void rep_movsw(void __far *d, void __far *s, int nwords);
    6486#pragma aux rep_movsw =     \
  • trunk/src/VBox/Devices/PC/BIOS/makefile

    r42258 r42332  
    1515!endif
    1616CFLAGS   = -q -0 -wx -zu -s -oas -d1+ -ms
    17 CFLAGS32 = -q -wx -zu -s -oas -d1+ -nt=BIOS32 -nd=BIOS32
     17CFLAGS32 = -q -wx -zu -s -oas -d1+ -ms -nt=BIOS32 -nd=BIOS32
    1818
    1919DEFS = -DVBOX -DVBOX_LANBOOT_SEG=0xE200 -DVBOX_VERSION_STRING=$(Q)0.9$(Q) &
  • trunk/src/VBox/Devices/PC/BIOS/orgs.asm

    r42127 r42332  
    110110extrn           _int19_function:near
    111111extrn           _int1a_function:near
    112 extrn           _int1a_function_pci:near
    113112extrn           _pci16_function:near
    114113extrn           _int70_function:near
     
    16461645                jne     int1a_normal
    16471646
    1648 if 0
    1649                 call    pcibios_real
    1650                 jc      pcibios_error
    1651 
    1652                 jmp     iret_modify_cf  ; don't trash caller's flags!
    1653 
    1654 pcibios_error:
    1655 ;               mov     bl, ah
    1656 ;               mov     ah, 0B1h
    1657                 pusha
    1658 ;               mov     ax, ss  ; set readable descriptor to DS for calling
    1659 ;               mov     ds, ax  ; PCI BIOS from 16-bit protected mode
    1660                 ; TODO: C environment?!
    1661                 call    _int1a_function_pci
    1662                 popa
    1663                 iret
    1664 else
    16651647                push    es
    16661648                push    ds
     
    16741656                pop     es
    16751657                iret
    1676 endif
    16771658
    16781659int1a_normal:
  • trunk/src/VBox/Devices/PC/BIOS/pcibio32.asm

    r42127 r42332  
    116116
    117117                pushfd
     118                push    es
    118119                pushad
    119120                call    _pci32_function
    120121                popad
     122                pop     es
    121123                popfd
    122124                retf
  • trunk/src/VBox/Devices/PC/BIOS/pcibios.c

    r42127 r42332  
    9797typedef struct {
    9898    pushad_regs_t   gr;
     99    uint32_t        es;
    99100    uint32_t        flags;
    100101} pci_regs_t;
     
    157158
    158159#endif
     160
     161/* PCI IRQ routing expansion buffer descriptor. */
     162typedef struct {
     163    uint16_t        buf_size;
     164    uint8_t __far   *buf_ptr;
     165} pci_route_buf;
     166
     167/* Defined in assembler module .*/
     168extern char     pci_routing_table[];
     169extern uint16_t pci_routing_table_size;
    159170
    160171/* Write the CONFIG_ADDRESS register to prepare for data access. Requires
     
    293304void BIOSCALL PCIxx(function)(volatile pci_regs_t r)
    294305{
    295     uint16_t    device;
     306    pci_route_buf __far     *route_buf;
     307    uint16_t                device;
    296308
    297309    BX_DEBUG_PCI("PCI: AX=%04X BX=%04X CX=%04X\n", AX, BX, CX);
     
    367379        }
    368380        break;
     381    case GET_IRQ_ROUTING:
     382        route_buf = ES :> (void *)DI;
     383        if (pci_routing_table_size > route_buf->buf_size) {
     384            SET_AH(BUFFER_TOO_SMALL);
     385            SET_CF();
     386        } else {
     387            rep_movsb(route_buf->buf_ptr, pci_routing_table, pci_routing_table_size);
     388        }
     389        break;
    369390    default:
    370391        BX_INFO("PCI: Unsupported function AX=%04X BX=%04X called\n", AX, BX);
  • trunk/src/VBox/Devices/PC/BIOS/pcibios.inc

    r41989 r42332  
    4949; Publics for easier debugging and disassembly
    5050
    51 public          pcibios_real
    52 public          pci_present
    53 public          pci_real_f02
    54 public          pci_real_devloop
    55 public          pci_real_nextdev
    56 public          pci_real_f03
    57 public          pci_real_devloop2
    58 public          pci_real_nextdev2
    59 public          pci_real_ok
    60 public          pci_real_fail
    61 public          pci_real_select_reg
    6251public          pcibios_init_iomem_bases
    6352public          pci_init_io_loop1
     
    8170
    8271.386
    83 pcibios_real:
    84                 push    eax
    85                 push    dx
    86 ifdef PCI_FIXED_HOST_BRIDGE_1
    87                 mov     eax, 80000000h
    88                 mov     dx, PCI_CFG1
    89                 out     dx, eax
    90                 mov     dx, PCI_CFG2
    91                 in      eax, dx
    92                 cmp     eax, PCI_FIXED_HOST_BRIDGE_1
    93                 je      pci_present
    94 endif
    95 
    96 ifdef PCI_FIXED_HOST_BRIDGE_2
    97                 ; 18h << 11
    98                 mov     eax, 8000c000h
    99                 mov     dx, PCI_CFG1
    100                 out     dx, eax
    101                 mov     dx, PCI_CFG2
    102                 in      eax, dx
    103                 cmp     eax, PCI_FIXED_HOST_BRIDGE_2
    104                 je      pci_present
    105                 ; 19h << 11
    106                 mov     eax, 8000c800h
    107                 mov     dx, PCI_CFG1
    108                 out     dx, eax
    109                 mov     dx, PCI_CFG2
    110                 in      eax, dx
    111                 cmp     eax, PCI_FIXED_HOST_BRIDGE_2
    112                 je      pci_present
    113 endif
    114                 pop     dx
    115                 pop     eax
    116                 mov     ah, 0FFh
    117                 stc
    118                 ret
    119 pci_present:
    120                 pop     dx
    121                 pop     eax
    122                 cmp     al, 1           ; installation check
    123                 jne pci_real_f02
    124                 mov     ax, 0001h
    125                 mov     bx, 0210h
    126                 mov     cx, 0
    127                 mov     edx, ' ICP'     ; #0x20494350 "PCI "
    128 ;; @todo!
    129 if 0
    130                 mov     edi, 0f0000h
    131                 mov     di, pcibios_protected
    132 else
    133                 mov     edi, pcibios_protected
    134 endif
    135                 clc
    136                 ret
    137 
    138 pci_real_f02: ;; find pci device
    139                 push    esi
    140                 push    edi
    141                 push    edx
    142                 cmp     al, 2
    143                 jne     pci_real_f03
    144 
    145                 shl     ecx, 16
    146                 mov     cx, dx
    147                 xor     ebx, ebx
    148                 mov     di, 0
    149 pci_real_devloop:
    150                 call    pci_real_select_reg
    151                 mov     dx, PCI_CFG2
    152                 in      eax, dx
    153                 cmp     eax, ecx
    154                 jne     pci_real_nextdev
    155 
    156                 cmp     si, 0
    157                 je      pci_real_ok
    158 
    159                 dec     si
    160 pci_real_nextdev:
    161                 inc     ebx
    162                 cmp     ebx, MAX_BUSDEVFN
    163                 jne     pci_real_devloop
    164 
    165                 mov     dx, cx
    166                 shr     ecx, 16
    167                 mov     ax, 8602h
    168                 jmp     pci_real_fail
    169 pci_real_f03: ;; find class code
    170                 cmp     al, 3
    171                 jne     pci_real_f08
    172                 xor     ebx, ebx
    173                 mov     di, 8
    174 pci_real_devloop2:
    175                 call    pci_real_select_reg
    176                 mov     dx, PCI_CFG2
    177                 in      eax, dx
    178                 shr     eax, 8
    179                 cmp     eax, ecx
    180                 jne     pci_real_nextdev2
    181 
    182                 cmp     si, 0
    183                 je      pci_real_ok
    184 
    185                 dec     si
    186 pci_real_nextdev2:
    187                 inc     ebx
    188                 cmp     ebx, MAX_BUSDEVFN
    189                 jne     pci_real_devloop2
    190 
    191                 mov     ax, 8603h
    192                 jmp     pci_real_fail
    193 
    194 pci_real_f08: ;; read configuration byte
    195                 cmp     al, 8
    196                 jne     pci_real_f09
    197 
    198                 call    pci_real_select_reg
    199                 push    dx
    200                 mov     dx, di
    201                 and     dx, 3
    202                 add     dx, PCI_CFG2
    203                 in      al, dx
    204                 pop     dx
    205                 mov     cl, al
    206                 jmp     pci_real_ok
    207 
    208 pci_real_f09: ;; read configuration word
    209                 cmp     al, 9
    210                 jne     pci_real_f0a
    211 
    212                 call    pci_real_select_reg
    213                 push    dx
    214                 mov     dx, di
    215                 and     dx, 2
    216                 add     dx, PCI_CFG2
    217                 in      ax, dx
    218                 pop     dx
    219                 mov     cx, ax
    220                 jmp     pci_real_ok
    221 pci_real_f0a: ;; read configuration dword
    222                 cmp     al, 0Ah
    223                 jne     pci_real_f0b
    224 
    225                 call    pci_real_select_reg
    226                 push    dx
    227                 mov     dx, PCI_CFG2
    228                 in      eax, dx
    229                 pop     dx
    230                 mov     ecx, eax
    231                 jmp     pci_real_ok
    232 
    233 pci_real_f0b: ;; write configuration byte
    234                 cmp     al, 0Bh
    235                 jne     pci_real_f0c
    236 
    237                 call    pci_real_select_reg
    238                 push    dx
    239                 mov     dx, di
    240                 and     dx, 3
    241                 add     dx, PCI_CFG2
    242                 mov     al, cl
    243                 out     dx, al
    244                 pop     dx
    245                 jmp     pci_real_ok
    246 
    247 pci_real_f0c: ;; write configuration word
    248                 cmp     al, 0Ch
    249                 jne     pci_real_f0d
    250 
    251                 call    pci_real_select_reg
    252                 push    dx
    253                 mov     dx, di
    254                 and     dx, 2
    255                 add     dx, PCI_CFG2
    256                 mov     ax, cx
    257                 out     dx, ax
    258                 pop     dx
    259                 jmp     pci_real_ok
    260 
    261 pci_real_f0d: ;; write configuration dword
    262                 cmp     al, 0Dh
    263                 jne     pci_real_f0e
    264 
    265                 call    pci_real_select_reg
    266                 push    dx
    267                 mov     dx, PCI_CFG2
    268                 mov     eax, ecx
    269                 out     dx, eax
    270                 pop     dx
    271                 jmp     pci_real_ok
    272 
    273 pci_real_f0e: ;; get irq routing options
    274                 cmp     al, 0Eh
    275                 jne     pci_real_unknown
    276 
    277                 cmp     word ptr es:[di], pci_routing_table_structure_end - pci_routing_table_structure_start
    278                 jb      pci_real_too_small
    279 
    280                 mov     word ptr es:[di], pci_routing_table_structure_end - pci_routing_table_structure_start
    281                 pushf
    282                 push    ds
    283                 push    es
    284                 push    cx
    285                 push    si
    286                 push    di
    287                 cld
    288                 mov     si, pci_routing_table_structure_start
    289                 push    cs
    290                 pop     ds
    291                 mov     cx, es:[di+2]
    292                 mov     es, es:[di+4]
    293                 mov     di, cx
    294                 mov     cx, pci_routing_table_structure_end - pci_routing_table_structure_start
    295                 rep     movsb
    296                 pop     di
    297                 pop     si
    298                 pop     cx
    299                 pop     es
    300                 pop     ds
    301                 popf
    302                 mov     bx, (1 shl 9) or (1 shl 11) ; #(1 << 9) | (1 << 11)   ;; irq 9 and 11 are used
    303                 jmp     pci_real_ok
    304 
    305 pci_real_too_small:
    306                 mov     word ptr es:[di], pci_routing_table_structure_end - pci_routing_table_structure_start
    307                 mov     ah, 89h
    308                 jmp     pci_real_fail
    309 
    310 pci_real_unknown:
    311                 mov     ah, 81h
    312 pci_real_fail:
    313                 pop     edx
    314                 pop     edi
    315                 pop     esi
    316                 stc
    317                 ret
    318 pci_real_ok:
    319                 xor     ah, ah
    320                 pop     edx
    321                 pop     edi
    322                 pop     esi
    323                 clc
    324                 ret
    325 
    326 ;; prepare from reading the PCI config space; on input:
    327 ;; bx = bus/dev/fn
    328 ;; di = offset into config space header
    329 ;; destroys eax and may modify di
    330 pci_real_select_reg:
    331                 push    dx
    332                 mov     eax, 800000h
    333                 mov     ax,  bx
    334                 shl     eax, 8
    335                 and     di,  0FFh
    336                 or      ax,  di
    337                 and     al,  0FCh
    338                 mov     dx,  PCI_CFG1
    339                 out     dx,  eax
    340                 pop     dx
    341                 ret
    34272
    34373if not BX_ROMBIOS32
  • trunk/src/VBox/Devices/PC/BIOS/pirq.inc

    r41496 r42332  
    4040
    4141if BX_PCIBIOS
    42 public pci_routing_table_structure      ; For disassembly
     42public _pci_routing_table
     43public _pci_routing_table_size
    4344
    4445align 16
     
    6364  db 7 ;; checksum
    6465endif ; !VBOX
    65 pci_routing_table_structure_start:
     66_pci_routing_table:
     67pci_routing_table:
    6668  ;; first slot entry PCI-to-ISA (embedded)
    6769  db 0 ;; pci bus number
     
    456458  db 0 ;; reserved
    457459endif ; VBOX
    458 pci_routing_table_structure_end:
     460pci_routing_table_end:
     461;; Size of the table
     462pci_routing_table_size dw       pci_routing_table_end - pci_routing_table
    459463
    460464endif   ; BX_PCIBIOS
  • trunk/src/VBox/Devices/PC/BIOS/timepci.c

    r38699 r42332  
    146146// in the following routines
    147147
    148 /* The PCI BIOS routine must be callable from protected mode, and
    149  * therefore must not modify any segment registers(!).
    150  */
    151 #if BX_PCIBIOS
    152 void BIOSCALL int1a_function_pci(i1apci_regs_t r)
    153 {
    154 #if 0
    155     // real mode PCI BIOS functions now handled in assembler code
    156     // this C code handles the error code for information only
    157     if (r.gr.u.r8.ah == 0xff) {
    158         BX_INFO("PCI BIOS: PCI not present\n");
    159     } else if (r.gr.u.r8.ah == 0x81) {
    160         BX_INFO("unsupported PCI BIOS function 0x%02x\n", r.gr.u.r8.al);
    161     } else if (r.gr.u.r8.ah == 0x83) {
    162         BX_INFO("bad PCI vendor ID %04x\n", r.gr.u.r16.dx);
    163     } else if (r.gr.u.r8.ah == 0x86) {
    164         if (r.gr.u.r8.ah == 0x02) {
    165             BX_INFO("PCI device %04x:%04x not found at index %d\n", r.gr.u.r16.dx, r.gr.u.r16.cx, r.gr.u.r16.si);
    166         } else {
    167             BX_INFO("no PCI device with class code 0x%02x%04x found at index %d\n", r.gr.u.r8.cl, r.gr.u.r16.dx, r.gr.u.r16.si);
    168         }
    169     }
    170 #endif
    171     //@todo: OS/2 MCP2 apparently calls us in protected mode with a DS which does not
    172     // point to the BIOS segment!?!
    173     send(BIOS_PRINTF_INFO, '!');
    174     send(BIOS_PRINTF_INFO, '\n');
    175     if (!GetCF(r.ra.flags)) {
    176         SetCF(r.ra.flags);
    177     }
    178 }
    179 #endif
    180 
    181 
    182148void BIOSCALL int1a_function(pusha_regs_t regs, uint16_t ds, uint16_t es, iret_addr_t iret_addr)
    183149{
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette