From a4f10b756551e021bdebe73f31f5427fd80e8859 Mon Sep 17 00:00:00 2001 From: "Sergey Semyonov (Serge)" Date: Mon, 23 Jul 2007 17:50:42 +0000 Subject: [PATCH] From Ghost: calls to PCIBIOS services git-svn-id: svn://kolibrios.org@586 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/bus/pci/pci32.inc | 147 +++++++++++++++++++++++++++++---- kernel/trunk/const.inc | 1 + kernel/trunk/core/syscall.inc | 2 +- kernel/trunk/data16.inc | 8 +- kernel/trunk/data32.inc | 20 +++++ kernel/trunk/docs/sysfuncr.txt | 96 +++++++++++---------- kernel/trunk/init.inc | 63 ++++++++++++++ kernel/trunk/kernel.asm | 5 ++ 8 files changed, 281 insertions(+), 61 deletions(-) diff --git a/kernel/trunk/bus/pci/pci32.inc b/kernel/trunk/bus/pci/pci32.inc index 6d3bdfb66e..f44acec115 100644 --- a/kernel/trunk/bus/pci/pci32.inc +++ b/kernel/trunk/bus/pci/pci32.inc @@ -1,23 +1,25 @@ $Revision$ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; +;; ;; ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; ;; Distributed under terms of the GNU General Public License ;; ;; ;; ;; ;; -;; PCI32.INC ;; -;; ;; -;; 32 bit PCI driver code ;; -;; ;; -;; Version 0.2 December 21st, 2002 ;; -;; ;; -;; Author: Victor Prodan, victorprodan@yahoo.com ;; -;; Credits: ;; -;; Ralf Brown ;; -;; Mike Hibbett, mikeh@oceanfree.net ;; -;; ;; -;; See file COPYING for details ;; -;; ;; +;; PCI32.INC ;; +;; ;; +;; 32 bit PCI driver code ;; +;; ;; +;; Version 0.3 April 9, 2007 ;; +;; Version 0.2 December 21st, 2002 ;; +;; ;; +;; Author: Victor Prodan, victorprodan@yahoo.com ;; +;; Mihailov Ilia, ghost.nsk@gmail.com ;; +;; Credits: ;; +;; Ralf Brown ;; +;; Mike Hibbett, mikeh@oceanfree.net ;; +;; ;; +;; See file COPYING for details ;; +;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -108,6 +110,7 @@ pci_make_config_cmd: ; read a register from the PCI config space into EAX/AX/AL ; IN: ah=bus,device+func=bh,register address=bl ; number of bytes to read (1,2,4) coded into AL, bits 0-1 +; (0 - byte, 1 - word, 2 - dword) ;*************************************************************************** align 4 @@ -238,6 +241,7 @@ pci_read_reg_err: ; IN: ah=bus,device+func=bh,register address (dword aligned)=bl, ; value to write in ecx ; number of bytes to write (1,2,4) coded into AL, bits 0-1 +; (0 - byte, 1 - word, 2 - dword) ;*************************************************************************** align 4 @@ -361,3 +365,118 @@ pci_write_reg_err: xor eax,eax dec eax ret + +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +; VendID (2), DevID (2), Revision = 0 (1), Class Code (3), FNum (1), Bus (1) +pci_emu_dat: times 30*10 db 0 + +;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +align 4 +sys_pcibios: + cmp [pci_access_enabled], 1 + jne .unsupported_func + mov edi, [pci_bios_entry] + test edi, edi + jz .emulate_bios + xchg ebx, eax + xchg ecx, eax + xchg edx, eax + xchg esi, eax + mov edi, eax + + push ds + mov ax, pci_data_sel + mov ds, ax + mov eax, ebp + call pword [cs:pci_bios_entry] + pop ds + + jmp .return + ;-=-=-=-=-=-=-=-= +.emulate_bios: + cmp ebp, 1 ; PCI_FUNCTION_ID + jnz .not_PCI_BIOS_PRESENT + mov edx, 'PCI ' + xor ah, ah + mov al, [OS_BASE+0x2F0000 + 0x9020] + mov bx, [OS_BASE+0x2F0000 + 0x9022] + mov cl, [OS_BASE+0x2F0000 + 0x9021] + jmp .return + +.not_PCI_BIOS_PRESENT: + cmp ebp, 2 ; FIND_PCI_DEVICE + jne .not_FIND_PCI_DEVICE + mov esi, pci_emu_dat +..nxt: cmp [esi], cx + jne ..no + cmp [esi + 2], bx + jne ..no + dec dx + jns ..no + mov bx, [esi + 4] + xor ah, ah + jmp .return +..no: cmp word[esi], 0 + je ..dev_not_found + add esi, 10 + jmp ..nxt +..dev_not_found: + mov ah, 0x86 ; DEVICE_NOT_FOUND + jmp .return + +.not_FIND_PCI_DEVICE: + cmp ebp, 3 ; FIND_PCI_CLASS_CODE + jne .not_FIND_PCI_CLASS_CODE + mov esi, pci_emu_dat + shl ebx, 8 +..nxt2: cmp [esi], ebx + jne ..no2 + mov bx, [esi] + xor ah, ah + jmp .return +..no2: cmp dword[esi], 0 + je ..dev_not_found2 + add esi, 10 + jmp ..nxt2 +..dev_not_found2: + mov ah, 0x86 ; DEVICE_NOT_FOUND + jmp .return + +.not_FIND_PCI_CLASS_CODE: + cmp ebp, 8 ; READ_CONFIG_* + jb .not_READ_CONFIG + cmp ebp, 0x0A + ja .not_READ_CONFIG + mov ebx, esi + mov bh, al + mov edx, ebp + mov al, dl + call pci_read_reg + mov ecx, eax + xor ah, ah ; SUCCESSFUL + jmp .return +.not_READ_CONFIG: + cmp ebp, 0x0B ; WRITE_CONFIG_* + jb .not_WRITE_CONFIG + cmp ebp, 0x0D + ja .not_WRITE_CONFIG + mov ecx, ebx + mov ebx, esi + mov bh, al + mov edx, ebp + inc edx + mov al, dl + call pci_write_reg + xor ah, ah ; SUCCESSFUL + jmp .return +.not_WRITE_CONFIG: +.unsupported_func: + mov ah, 0x81 ; FUNC_NOT_SUPPORTED +.return:mov dword[esp + 8 ], edi + mov dword[esp + 12], esi + mov dword[esp + 24], ebx + mov dword[esp + 28], edx + mov dword[esp + 32], ecx + mov dword[esp + 36], eax + ret diff --git a/kernel/trunk/const.inc b/kernel/trunk/const.inc index a60c39202c..34403311ab 100644 --- a/kernel/trunk/const.inc +++ b/kernel/trunk/const.inc @@ -6,6 +6,7 @@ $Revision$ ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +dpl0 equ 10010000b ; data read dpl0 drw0 equ 10010010b ; data read/write dpl0 drw3 equ 11110010b ; data read/write dpl3 cpl0 equ 10011010b ; code read dpl0 diff --git a/kernel/trunk/core/syscall.inc b/kernel/trunk/core/syscall.inc index c73f1e6382..ee4b4da939 100644 --- a/kernel/trunk/core/syscall.inc +++ b/kernel/trunk/core/syscall.inc @@ -196,7 +196,7 @@ iglobal dd user_events ; 54-User events dd sound_interface ; 55-Sound interface dd undefined_syscall ; 56-reserved - dd undefined_syscall ; 57-reserved + dd sys_pcibios ; 57-reserved dd file_system ; 58-Common file system interface dd undefined_syscall ; 59-reserved dd sys_IPC ; 60-Inter Process Communication diff --git a/kernel/trunk/data16.inc b/kernel/trunk/data16.inc index 25a40aca02..fb29ff83c3 100644 --- a/kernel/trunk/data16.inc +++ b/kernel/trunk/data16.inc @@ -4,10 +4,10 @@ $Revision$ flm db 0 preboot_lfb db 0 preboot_bootlog db 0 - -bx_from_load: dw 'r1' ; ёЄЁєъЄєЁр фы  їЁрэхэш  ярЁрьхЄЁют- юЄъєфр ур°Ёєчшышё№, схЁхЄё  эшцх шч bx ; {SPraid}[13.03.2007] - ; a,b,c,d - тшэўхёЄхЁ√, r - Ёрь фшёъ - ; # фшёър... ёшьтюы, р эх срщЄ. '1', р эх 1 +boot_drive db 0 +bx_from_load: dw 'r1' ; ёЄЁєъЄєЁр фы  їЁрэхэш  ярЁрьхЄЁют- юЄъєфр ур°Ёєчшышё№, схЁхЄё  эшцх шч bx ; {SPraid}[13.03.2007] + ; a,b,c,d - тшэўхёЄхЁ√, r - Ёрь фшёъ + ; # фшёър... ёшьтюы, р эх срщЄ. '1', р эх 1 align 4 old_ints_h: diff --git a/kernel/trunk/data32.inc b/kernel/trunk/data32.inc index 9319d8260b..351229d63d 100644 --- a/kernel/trunk/data32.inc +++ b/kernel/trunk/data32.inc @@ -117,6 +117,8 @@ syslang dd 1 boot_y dd 10 +pci_bios_entry dd 0 + dw pci_code_sel if __DEBUG__ eq 1 include_debug_strings @@ -164,6 +166,24 @@ app_data_l: db drw3 dw G32+D32+(new_app_base shr 16)+0xF; +; ------------- PCI BIOS ------------------ + +pci_code_32: + dw 0 ;lim 0-15 + dw 0 ;base 0-15 + db 0 ;base 16-23 + db cpl0 ;type + db D32 ;lim 16-19+props + db 0 ;base 24-31 + +pci_data_32: + dw 0 ;lim 0-15 + dw 0 ;base 0-15 + db 0 ;base 16-23 + db dpl0 ;type + db D32 ;lim 16-19+props + db 0 ;base 24-31 + ; --------------- APM --------------------- apm_code_32: dw 0x0f ; limit 64kb diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index 9a94e9cf68..97fdf198a9 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -41,7 +41,7 @@ * esi = 0xXYRRGGBB - цвет заголовка * RR, GG, BB определяют сам цвет * Y=0 - обычное окно, Y=1 - неперемещаемое окно - * X определяет градиент заголовка: X=0 - нет градиента, + * X определяет градиент заголовка: X=0 - нет градиента, X=8 - обычный градиент, для окон типа II X=4 - негативный градиент * прочие значения X и Y зарезервированы @@ -67,7 +67,7 @@ координата (или, возможно, обе) считается нулем, а если и это не помогает, то соответствующий размер (или, возможно, оба) устанавливается в размер экрана. - + Далее обозначим xpos,ypos,xsize,ysize - значения, передаваемые в ebx,ecx. Координаты приводятся относительно левого верхнего угла окна, который, таким образом, задается как (0,0), координаты @@ -675,7 +675,7 @@ * Узнать, какое окно является активным, можно вызовом подфункции 7. ====================================================================== - Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду. + Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду. ====================================================================== Под пустыми тактами понимается время, в которое процессор простаивает в ожидании прерывания (в инструкции hlt). @@ -696,7 +696,7 @@ * eax = тактовая частота (по модулю 2^32 тактов = 4ГГц) ====================================================================== - Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске. + Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске. ====================================================================== Параметры: * eax = 18 - номер функции @@ -786,7 +786,7 @@ Замечания: * Минимизированное окно с точки зрения функции 9 сохраняет положение и размеры. - * Восстановление окна приложения происходит при активизировании + * Восстановление окна приложения происходит при активизировании подфункцией 3. * Обычно нет необходимости явно сворачивать/разворачивать своё окно: сворачивание окна осуществляется системой при нажатии на кнопку @@ -1039,7 +1039,7 @@ dd 533 * eax = 0 - успешно * eax = 1 - не определён базовый порт Замечания: - * Предварительно должен быть определён базовый порт вызовом + * Предварительно должен быть определён базовый порт вызовом подфункции 1 функции 21. ====================================================================== @@ -1055,7 +1055,7 @@ dd 533 Замечания: * Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF. * Установка базы нужна для работы функции 20. - * Получить установленный базовый порт можно вызовом + * Получить установленный базовый порт можно вызовом подфункции 1 функции 26. ====================================================================== @@ -1085,7 +1085,7 @@ dd 533 нормальная раскладка, после чего из кода вычитается 0x60; если не нажата ни одна из управляющих клавиш, то используется нормальная раскладка. - * Получить раскладки и идентификатор страны можно с помощью + * Получить раскладки и идентификатор страны можно с помощью подфункции 2 функции 26. * Идентификатор страны - глобальная системная переменная, которая самим ядром не используется; однако приложение @panel отображает @@ -1103,7 +1103,7 @@ dd 533 * eax = 0 Замечания: * База CD используется функцией 24. - * Получить установленную базу CD можно вызовом + * Получить установленную базу CD можно вызовом подфункции 3 функции 26. ====================================================================== @@ -1119,7 +1119,7 @@ dd 533 Замечания: * Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF. * Установка базы нужна для работы функций 25, 28, 55. - * Получить установленный базовый порт можно вызовом + * Получить установленный базовый порт можно вызовом подфункции 4 функции 26. ====================================================================== @@ -1157,7 +1157,7 @@ dd 533 * Не следует изменять базу, когда какое-нибудь приложение работает с жёстким диском. Если не хотите глюков системы. * Получить установленную базу можно вызовом подфункции 7 функции 26. - * Следует также определить используемый раздел жёсткого диска + * Следует также определить используемый раздел жёсткого диска подфункцией 8. ====================================================================== @@ -1180,9 +1180,9 @@ dd 533 * Получить установленный раздел можно вызовом подфункции 8 функции 26. * Проверок на корректность не делается. - * Узнать число разделов на жёстком диске можно вызовом + * Узнать число разделов на жёстком диске можно вызовом подфункции 11 функции 18. - * Следует также определить используемую базу жёсткого диска + * Следует также определить используемую базу жёсткого диска подфункцией 7. ====================================================================== @@ -1198,7 +1198,7 @@ dd 533 Замечания: * Номер канала DMA используется в подфункции 1 функции 55. - * Получить канал DMA для звука можно вызовом + * Получить канал DMA для звука можно вызовом подфункции 10 функции 26. ====================================================================== @@ -1284,13 +1284,13 @@ dd 533 * ebx = частота вертикальной развёртки (в Гц) * ecx = номер текущего видеорежима Замечания: - * Драйвер предварительно должен быть инициализирован вызовом + * Драйвер предварительно должен быть инициализирован вызовом функции драйвера 1. * Если нужны только размеры экрана, целесообразней использовать функцию 14 с учётом того, что она возвращает размеры на 1 меньше. ====================================================================== -= Функция 21, подфункция 13, подподфункция 3 - установить видеорежим. += Функция 21, подфункция 13, подподфункция 3 - установить видеорежим. ====================================================================== Параметры: * eax = 21 - номер функции @@ -1303,7 +1303,7 @@ dd 533 * eax = 0 - успешно * ebx, ecx разрушаются Замечания: - * Драйвер предварительно должен быть инициализирован вызовом + * Драйвер предварительно должен быть инициализирован вызовом функции драйвера 1. * Номер видеорежима и частота должны быть в таблице, возвращаемой функцией драйвера 1. @@ -1322,7 +1322,7 @@ dd 533 * eax = 0 - успешно * ebx, ecx разрушаются Замечания: - * Драйвер предварительно должен быть инициализирован вызовом + * Драйвер предварительно должен быть инициализирован вызовом функции драйвера 1. ====================================================================== @@ -1342,7 +1342,7 @@ dd 533 * eax = 0 - успешно * ebx, ecx разрушаются Замечания: - * Драйвер предварительно должен быть инициализирован вызовом + * Драйвер предварительно должен быть инициализирован вызовом функции драйвера 1. * Функция влияет только на физический размер изображения на мониторе; логический размер (число пикселей) не меняется. @@ -1423,7 +1423,7 @@ dd 533 * eax = 0 - успешно * eax = 1 - не определена база CD Замечания: - * Предварительно нужно определить базовый порт CD вызовом + * Предварительно нужно определить базовый порт CD вызовом подфункции 3 функции 21. * В секунде 75 фреймов, в минуте 60 секунд. * Функция асинхронна (возвращает управление, когда началось @@ -1444,7 +1444,7 @@ dd 533 * Формат таблицы с информацией о дорожках такой же, как и для ATAPI-CD команды 43h (READ TOC), обычной таблицы (подкоманда 00h). Адреса возвращаются в формате MSF. - * Предварительно нужно определить базовый порт CD вызовом + * Предварительно нужно определить базовый порт CD вызовом подфункции 3 функции 21. * Функция возвращает информацию только о не более чем 100 первых дорожках. В большинстве случаев этого достаточно. @@ -1459,7 +1459,7 @@ dd 533 * eax = 0 - успешно * eax = 1 - не определена база CD Замечания: - * Предварительно нужно определить базовый порт CD вызовом + * Предварительно нужно определить базовый порт CD вызовом подфункции 3 функции 21. ====================================================================== @@ -1477,7 +1477,7 @@ dd 533 * eax = 1 - не определена база SB * eax = 2 - неверная подфункция Замечания: - * Предварительно нужно определить базовый порт SB вызовом + * Предварительно нужно определить базовый порт SB вызовом подфункции 4 функции 21. * Смотри также функцию 28 установки звука для более позднего стандарта SB16. @@ -1491,7 +1491,7 @@ dd 533 Возвращаемое значение: * eax = номер порта Замечания: - * Установить базовый порт можно вызовом + * Установить базовый порт можно вызовом подфункции 1 функции 21. ====================================================================== @@ -1524,7 +1524,7 @@ dd 533 нормальная раскладка, после чего из кода вычитается 0x60; если не нажата ни одна из управляющих клавиш, то используется нормальная раскладка. - * Установить раскладки и идентификатор страны можно с помощью + * Установить раскладки и идентификатор страны можно с помощью подфункции 2 функции 21. * Идентификатор страны - глобальная системная переменная, которая самим ядром не используется; однако приложение @panel отображает @@ -1644,7 +1644,7 @@ dd 533 * eax = 0/1 - запрещён/разрешён Замечания: * Используется при LBA-чтении (подфункция 8 функции 58). - * Установить текущее состояние можно вызовом + * Установить текущее состояние можно вызовом подфункции 11 функции 21. ====================================================================== @@ -1659,7 +1659,7 @@ dd 533 Замечания: * Используется при работе с шиной PCI (функция 62). * Текущая реализация использует только младший бит ecx. - * Установить текущее состояние можно вызовом + * Установить текущее состояние можно вызовом подфункции 12 функции 21. ====================================================================== @@ -1676,7 +1676,7 @@ dd 533 * eax = 1 - не определена база SB * eax = 2 - неверная подфункция Замечания: - * Предварительно нужно определить базовый порт SB вызовом + * Предварительно нужно определить базовый порт SB вызовом подфункции 4 функции 21. * Эта функция предоставляет больше вариантов для громкости, чем функция 25. @@ -1913,7 +1913,7 @@ dd 533 Возвращаемое значение: * eax = [ширина]*65536 + [высота] Замечания: - * Есть парная команда установки размеров фонового изображения - + * Есть парная команда установки размеров фонового изображения - подфункция 1 функции 15. После которой, разумеется, следует заново определить само изображение. @@ -1932,7 +1932,7 @@ dd 533 * Не следует полагаться на возвращаемое значение в случае неверного смещения, оно может измениться в следующих версиях ядра. * Смещение точки с координатами (x,y) вычисляется как (x+y*xsize)*3. - * Есть парная функция установки точки на фоновом изображении - + * Есть парная функция установки точки на фоновом изображении - подфункция 2 функции 15. ====================================================================== @@ -1945,7 +1945,7 @@ dd 533 * eax = 1 - замостить * eax = 2 - растянуть Замечания: - * Есть парная функция установки режима отрисовки фона - + * Есть парная функция установки режима отрисовки фона - подфункция 4 функции 15. ====================================================================== @@ -2079,7 +2079,7 @@ dd 533 все зарезервированные им IRQ. ====================================================================== -= Функция 46 - зарезервировать/освободить группу портов ввода/вывода. += Функция 46 - зарезервировать/освободить группу портов ввода/вывода. ====================================================================== К зарезервированным портам можно обращаться напрямую из приложения командами in/out (рекомендуемый способ) и вызовом функции 43 @@ -2171,7 +2171,7 @@ dd 533 Возвращаемое значение: * функция не возвращает значения Замечания: - * После вызова описываемой функции следует перерисовать экран + * После вызова описываемой функции следует перерисовать экран подфункцией 0. * Тип кнопок влияет только на их прорисовку функцией 8. @@ -2188,7 +2188,7 @@ dd 533 Возвращаемое значение: * функция не возвращает значения Замечания: - * После вызова описываемой функции следует перерисовать экран + * После вызова описываемой функции следует перерисовать экран подфункцией 0. * Таблица стандартных цветов влияет только на приложения, которые эту таблицу явным образом получают (подфункцией 3) и @@ -2302,7 +2302,7 @@ dword- Аналогично по оси y. * Смотри также функцию 14, позволяющую определить размеры всего экрана. - * Есть парная функция получения рабочей области - + * Есть парная функция получения рабочей области - подфункция 5. * Эта функция автоматически перерисовывает экран, по ходу дела обновляет координаты и размеры максимизированных окон. @@ -2426,7 +2426,7 @@ dword- * иначе eax = TID - идентификатор потока ====================================================================== -= Функция 52, подфункция 0 - получить конфигурацию сетевого драйвера. += Функция 52, подфункция 0 - получить конфигурацию сетевого драйвера. ====================================================================== Параметры: * eax = 52 - номер функции @@ -2451,7 +2451,7 @@ dword- * Локальный IP-адрес устанавливается подфункцией 3. ====================================================================== - Функция 52, подфункция 2 - установить конфигурацию сетевого драйвера. + Функция 52, подфункция 2 - установить конфигурацию сетевого драйвера. ====================================================================== Параметры: * eax = 52 - номер функции @@ -2799,7 +2799,7 @@ dword- * Проверки на правильность хэндла не делается. ====================================================================== - Функция 53, подфункция 255 - отладочная информация сетевого драйвера. + Функция 53, подфункция 255 - отладочная информация сетевого драйвера. ====================================================================== Параметры: * eax = 53 - номер функции @@ -2916,6 +2916,18 @@ dword- * Данные должны сохраняться в памяти по крайней мере до конца проигрывания. +====================================================================== +============================ Функция 57 ============================== +====================== Вызов сервисов PCIBIOS ======================== +====================================================================== +Параметры: + * eax = 57 + * ebp = соответствует регистру al по спецификации PCIBIOS + * остальные регистры по спецификации PCIBIOS +Возвращаемые значения: + * CF не определён + * остальные регистры по спецификации PCIBIOS + ====================================================================== ============== Функция 58 - работа с файловой системой. ============== ====================================================================== @@ -3076,8 +3088,8 @@ dword- * Размер блока - 512 байт; читается один блок. * Не следует полагаться на возвращаемое значение, оно может измениться в следующих версиях. - * Требуется, чтобы был разрешён LBA-доступ к устройствам - подфункцией 11 функции 21. Узнать это можно вызовом + * Требуется, чтобы был разрешён LBA-доступ к устройствам + подфункцией 11 функции 21. Узнать это можно вызовом подфункцией 11 функции 26. * LBA-чтение дискеты не поддерживается. * Функция считывает данные физического жёсткого диска; @@ -3091,7 +3103,7 @@ dword- это будет считаться успехом (eax=0). ====================================================================== -= Функция 58, подфункция 15 - получить информацию о файловой системе. += Функция 58, подфункция 15 - получить информацию о файловой системе. ====================================================================== Параметры: * eax = 58 - номер функции @@ -3978,7 +3990,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); общем описании). ====================================================================== - Функция 69, подфункция 7 - записать в память отлаживаемого процесса. + Функция 69, подфункция 7 - записать в память отлаживаемого процесса. ====================================================================== Параметры: * eax = 69 - номер функции diff --git a/kernel/trunk/init.inc b/kernel/trunk/init.inc index b9062a3009..8a76d5d694 100644 --- a/kernel/trunk/init.inc +++ b/kernel/trunk/init.inc @@ -159,6 +159,69 @@ proc init_page_map ret endp +align 4 + +init_BIOS32: + mov edi, 0xE0000 +.pcibios_nxt: + cmp dword[edi], '_32_' ; "magic" word + je .BIOS32_found +.pcibios_nxt2: + add edi, 0x10 + cmp edi, 0xFFFF0 + je .BIOS32_not_found + jmp .pcibios_nxt +.BIOS32_found: ; magic word found, check control summ + + movzx ecx, byte[edi + 9] + shl ecx, 4 + mov esi, edi + xor eax, eax + cld ; paranoia +@@: lodsb + add ah, al + loop @b + jnz .pcibios_nxt2 ; control summ must be zero + ; BIOS32 service found ! + mov ebp, [edi + 4] + mov [bios32_entry], ebp + ; check PCI BIOS present + mov eax, '$PCI' + xor ebx, ebx + push cs ; special for 'ret far' from BIOS + call ebp + test al, al + jnz .PCI_BIOS32_not_found + + ; чфхё№ ёючфр■Єё  фшёъЁшяЄюЁ√ фы  PCI BIOS + + add ebx, OS_BASE + dec ecx + mov [(pci_code_32-OS_BASE)], cx ;limit 0-15 + mov [(pci_data_32-OS_BASE)], cx ;limit 0-15 + + mov [(pci_code_32-OS_BASE)+2], bx ;base 0-15 + mov [(pci_data_32-OS_BASE)+2], bx ;base 0-15 + + shr ebx, 16 + mov [(pci_code_32-OS_BASE)+4], bl ;base 16-23 + mov [(pci_data_32-OS_BASE)+4], bl ;base 16-23 + + shr ecx, 16 + and cl, 0x0F + mov ch, bh + add cx, D32 + mov [(pci_code_32-OS_BASE)+6], cx ;lim 16-19 & + mov [(pci_data_32-OS_BASE)+6], cx ;base 24-31 + + mov [(pci_bios_entry-OS_BASE)], edx + ; jmp .end +.PCI_BIOS32_not_found: + ; чфхё№ фюыцэр чряюыэ Єё  pci_emu_dat +.BIOS32_not_found: +.end: + + align 4 proc test_cpu locals diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index c36e222cf4..b5608699ea 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -74,6 +74,8 @@ graph_data equ (3+graph_data_l-gdts) tss0 equ (tss0_l-gdts) app_code equ (3+app_code_l-gdts) app_data equ (3+app_data_l-gdts) +pci_code_sel equ (pci_code_32-gdts) +pci_data_sel equ (pci_data_32-gdts) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -237,6 +239,7 @@ B32: call test_cpu bts [cpu_caps-OS_BASE], CAPS_TSC ;force use rdtsc + call init_BIOS32 ; MEMORY MODEL call mem_test call init_mem @@ -255,7 +258,9 @@ B32: jmp pword os_code:high_code align 4 +bios32_entry dd ? tmp_page_tabs dd ? + use16 org $-0x10000 include "boot/shutdown.inc" ; shutdown or restart