From 21132138a1cf25c56fabc232f6dd83cc049e2d1d Mon Sep 17 00:00:00 2001 From: CleverMouse Date: Mon, 18 Aug 2014 11:18:15 +0000 Subject: [PATCH] support for stripped PE headers in drivers; declare COFF drivers deprecated git-svn-id: svn://kolibrios.org@5039 a494cfbc-eb01-0410-851d-a64ba20cac60 --- data/common/pestrip.asm | 116 +++++++++ data/eng/Makefile | 39 +-- data/eng/Makefile.pestrip | 11 + data/et/Makefile | 39 +-- data/et/Makefile.pestrip | 11 + data/it/Makefile | 40 +-- data/it/Makefile.pestrip | 11 + data/rus/Makefile | 39 +-- data/rus/Makefile.pestrip | 11 + data/sp/Makefile | 39 +-- data/sp/Makefile.pestrip | 11 + drivers/video/vidintel.asm | 467 +++++++++++++++++++++++++++++++++++ kernel/trunk/const.inc | 22 ++ kernel/trunk/core/dll.inc | 2 + kernel/trunk/core/peload.inc | 356 +++++++++++++------------- kernel/trunk/data32.inc | 2 +- kernel/trunk/kernel.asm | 2 +- 17 files changed, 969 insertions(+), 249 deletions(-) create mode 100644 data/common/pestrip.asm create mode 100644 data/eng/Makefile.pestrip create mode 100644 data/et/Makefile.pestrip create mode 100644 data/it/Makefile.pestrip create mode 100644 data/rus/Makefile.pestrip create mode 100644 data/sp/Makefile.pestrip create mode 100644 drivers/video/vidintel.asm diff --git a/data/common/pestrip.asm b/data/common/pestrip.asm new file mode 100644 index 0000000000..20a79af4d4 --- /dev/null +++ b/data/common/pestrip.asm @@ -0,0 +1,116 @@ +; If you know macro language of FASM, there is almost nothing to comment here. +; If you don't know macro language of FASM, comments would not help you. + +filename equ '%EXENAME%' + +SPE_DIR_ORDER fix IMPORT EXPORT BASERELOC EXCEPTION TLS BOUND_IMPORT RESOURCE +count = 0 +irps dir,SPE_DIR_ORDER +{ +SPE_DIRECTORY_#dir = count +count = count + 1 +} + +IMAGE_DIRECTORY_ENTRY_EXPORT = 0 +IMAGE_DIRECTORY_ENTRY_IMPORT = 1 +IMAGE_DIRECTORY_ENTRY_RESOURCE = 2 +IMAGE_DIRECTORY_ENTRY_EXCEPTION = 3 +IMAGE_DIRECTORY_ENTRY_BASERELOC = 5 +IMAGE_DIRECTORY_ENTRY_TLS = 9 +IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT = 11 + +virtual at 0 +file filename:3Ch,4 +load pehea dword from 0 +end virtual + +virtual at 0 +file filename:pehea,0F8h +load NumberOfSections word from 6 +load SizeOfOptionalHeader word from 14h +if SizeOfOptionalHeader<>0E0h +error Nonstandard PE header +end if +load Characteristics word from 16h +load AddressOfEntryPoint dword from 28h +load ImageBase dword from 34h +load SectionAlignment dword from 38h +load FileAlignment dword from 3Ch +load MajorOperatingSystemVersion word from 40h +load MinorOperatingSystemVersion word from 42h +load MajorSubsystemVersion word from 48h +load MinorSubsystemVersion word from 4Ah +load SizeOfImage dword from 50h +load SizeOfHeaders dword from 54h +load Subsystem word from 5Ch +load SizeOfStackReserve dword from 60h +load SizeOfHeapReserve dword from 68h +load SrcNumberOfRvaAndSizes dword from 74h + +DstNumberOfRvaAndSizes = 0 +irps dir,SPE_DIR_ORDER +{ +if IMAGE_DIRECTORY_ENTRY_#dir < SrcNumberOfRvaAndSizes +load DirRVA_#dir dword from 78h + 8*IMAGE_DIRECTORY_ENTRY_#dir +load DirSize_#dir dword from 7Ch + 8*IMAGE_DIRECTORY_ENTRY_#dir +else +DirRVA_#dir = 0 +DirSize_#dir = 0 +end if +if DirRVA_#dir > 0 & DirSize_#dir > 0 +DstNumberOfRvaAndSizes = SPE_DIRECTORY_#dir + 1 +end if +} + +end virtual + +SectionAlignmentLog = 0 +while SectionAlignment <> 1 shl SectionAlignmentLog +SectionAlignmentLog = SectionAlignmentLog + 1 +end while +FileAlignmentLog = 0 +while FileAlignment <> 1 shl FileAlignmentLog +FileAlignmentLog = FileAlignmentLog + 1 +end while + +; header + dw 'PE' xor 'S' ; Signature + dw Characteristics or 0x100 ; IMAGE_FILE_32BIT_MACHINE + dd AddressOfEntryPoint + dd ImageBase + db SectionAlignmentLog + db FileAlignmentLog + db MajorSubsystemVersion + db MinorSubsystemVersion + dd SizeOfImage + dd SizeOfStackReserve + dd SizeOfHeapReserve +SizeOfHeadersField: + dd 0 + db Subsystem + db DstNumberOfRvaAndSizes + dw NumberOfSections +; directories +irps dir,SPE_DIR_ORDER +{ +if SPE_DIRECTORY_#dir < DstNumberOfRvaAndSizes + dd DirRVA_#dir, DirSize_#dir +end if +} + +NumBytesDeleted = pehea + 0F8h - $ + NumberOfSections*0Ch +DeltaDeleted = NumBytesDeleted and not (FileAlignment - 1) +; Use store instead of declaring SizeOfHeaders - DeltaDeleted directly in dd +; to avoid the second compilation pass. +store dword SizeOfHeaders - DeltaDeleted at SizeOfHeadersField +; sections +repeat NumberOfSections +file filename:pehea+0F8h+(%-1)*28h,18h +load a dword from $-4 +store dword a-DeltaDeleted at $-4 +file filename:pehea+0F8h+(%-1)*28h+24h,4 +end repeat +; padding to keep FileAlignment +times NumBytesDeleted - DeltaDeleted db 0 +; data +file filename:pehea+0F8h+NumberOfSections*28h diff --git a/data/eng/Makefile b/data/eng/Makefile index 67ff50f1c8..04ed0733bd 100644 --- a/data/eng/Makefile +++ b/data/eng/Makefile @@ -135,24 +135,10 @@ FASM_PROGRAMS:=\ drivers/usbhid.obj:DRIVERS/USBHID.OBJ:$(KERNEL)/drivers/usbhid/usbhid.asm \ drivers/usbstor.obj:DRIVERS/USBSTOR.OBJ:$(KERNEL)/drivers/usbstor.asm \ drivers/vt823x.obj:DRIVERS/VT823X.OBJ:$(KERNEL)/drivers/vt823x.asm \ - drivers/vidintel.obj:DRIVERS/VIDINTEL.OBJ:$(KERNEL)/drivers/vidintel.asm \ drivers/3c59x.obj:DRIVERS/3C59X.OBJ:$(REPOSITORY)/drivers/ethernet/3c59x.asm \ drivers/dec21x4x.obj:DRIVERS/DEC21X4X.OBJ:$(REPOSITORY)/drivers/ethernet/dec21x4x.asm \ - drivers/forcedeth.sys:DRIVERS/FORCEDETH.SYS:$(REPOSITORY)/drivers/ethernet/forcedeth.asm \ - drivers/i8254x.sys:DRIVERS/I8254X.SYS:$(REPOSITORY)/drivers/ethernet/i8254x.asm \ - drivers/i8255x.sys:DRIVERS/I8255X.SYS:$(REPOSITORY)/drivers/ethernet/i8255x.asm \ - drivers/mtd80x.sys:DRIVERS/MTD80X.SYS:$(REPOSITORY)/drivers/ethernet/mtd80x.asm \ - drivers/pcnet32.sys:DRIVERS/PCNET32.SYS:$(REPOSITORY)/drivers/ethernet/pcnet32.asm \ - drivers/r6040.sys:DRIVERS/R6040.SYS:$(REPOSITORY)/drivers/ethernet/R6040.asm \ - drivers/rhine.sys:DRIVERS/RHINE.SYS:$(REPOSITORY)/drivers/ethernet/rhine.asm \ - drivers/rtl8029.sys:DRIVERS/RTL8029.SYS:$(REPOSITORY)/drivers/ethernet/RTL8029.asm \ drivers/rtl8139.obj:DRIVERS/RTL8139.OBJ:$(REPOSITORY)/drivers/ethernet/RTL8139.asm \ drivers/rtl8169.obj:DRIVERS/RTL8169.OBJ:$(REPOSITORY)/drivers/ethernet/RTL8169.asm \ - drivers/sis900.sys:DRIVERS/SIS900.SYS:$(REPOSITORY)/drivers/ethernet/sis900.asm \ - drivers/uhci.sys:DRIVERS/UHCI.SYS:$(REPOSITORY)/drivers/usb/uhci.asm \ - drivers/ohci.sys:DRIVERS/OHCI.SYS:$(REPOSITORY)/drivers/usb/ohci.asm \ - drivers/ehci.sys:DRIVERS/EHCI.SYS:$(REPOSITORY)/drivers/usb/ehci.asm \ - drivers/rdc.sys:DRIVERS/RDC.SYS:$(REPOSITORY)/drivers/video/rdc.asm \ File|Managers/kfar:File|Managers/KFAR:$(PROGS)/fs/kfar/trunk/kfar.asm \ File|Managers/kfm:File|Managers/KFM:$(PROGS)/fs/kfm/trunk/kfm.asm \ File|Managers/opendial:File|Managers/OPENDIAL:$(PROGS)/fs/opendial/opendial.asm \ @@ -212,6 +198,23 @@ FASM_PROGRAMS:=\ network/ircc:NETWORK/IRCC:$(PROGS)/network/ircc/ircc.asm \ network/downloader:NETWORK/DOWNLOADER:$(PROGS)/network/downloader/downloader.asm \ # end of list +# Same as above with PE stripping as extra step. +FASM_PROGRAMS_PESTRIP:=\ + drivers/vidintel.sys:DRIVERS/VIDINTEL.SYS:$(REPOSITORY)/drivers/vidintel.asm \ + drivers/forcedeth.sys:DRIVERS/FORCEDETH.SYS:$(REPOSITORY)/drivers/ethernet/forcedeth.asm \ + drivers/i8254x.sys:DRIVERS/I8254X.SYS:$(REPOSITORY)/drivers/ethernet/i8254x.asm \ + drivers/i8255x.sys:DRIVERS/I8255X.SYS:$(REPOSITORY)/drivers/ethernet/i8255x.asm \ + drivers/mtd80x.sys:DRIVERS/MTD80X.SYS:$(REPOSITORY)/drivers/ethernet/mtd80x.asm \ + drivers/pcnet32.sys:DRIVERS/PCNET32.SYS:$(REPOSITORY)/drivers/ethernet/pcnet32.asm \ + drivers/r6040.sys:DRIVERS/R6040.SYS:$(REPOSITORY)/drivers/ethernet/R6040.asm \ + drivers/rhine.sys:DRIVERS/RHINE.SYS:$(REPOSITORY)/drivers/ethernet/rhine.asm \ + drivers/rtl8029.sys:DRIVERS/RTL8029.SYS:$(REPOSITORY)/drivers/ethernet/RTL8029.asm \ + drivers/sis900.sys:DRIVERS/SIS900.SYS:$(REPOSITORY)/drivers/ethernet/sis900.asm \ + drivers/uhci.sys:DRIVERS/UHCI.SYS:$(REPOSITORY)/drivers/usb/uhci.asm \ + drivers/ohci.sys:DRIVERS/OHCI.SYS:$(REPOSITORY)/drivers/usb/ohci.asm \ + drivers/ehci.sys:DRIVERS/EHCI.SYS:$(REPOSITORY)/drivers/usb/ehci.asm \ + drivers/rdc.sys:DRIVERS/RDC.SYS:$(REPOSITORY)/drivers/video/rdc.asm \ +# end of list # The list of all FASM programs with one main FASM file for CD image. # Format of an item is exactly the same as in the previous list. FASM_PROGRAMS_CD:=\ @@ -448,9 +451,15 @@ fimage=$(call respace,$(call imagepart,$(f))) fsource=$(call respace,$(call sourcepart,$(f))) fparam=$(call respace,$(call parampart,$(f))) +# Add stripped PE files produced by fasm to FASM_NOKPACK_PROGRAMS. +include Makefile.pestrip +FASM_NOKPACK_PROGRAMS:=$(FASM_NOKPACK_PROGRAMS) \ + $(foreach f,$(FASM_PROGRAMS_PESTRIP),$(fbinary).full:-:$(fsource)) +$(foreach f,$(FASM_PROGRAMS_PESTRIP),$(eval $(call pestrip_meta_rule,$(fbinary),$(fbinary).full))) + # Define targets for image file. # Join all the lists above. -targets_full:=$(COPY_FILES) $(FASM_PROGRAMS) $(NASM_PROGRAMS) $(OTHER_FILES) $(CMM_PROGRAMS) +targets_full:=$(COPY_FILES) $(FASM_PROGRAMS) $(FASM_PROGRAMS_PESTRIP) $(NASM_PROGRAMS) $(OTHER_FILES) $(CMM_PROGRAMS) # For each item in the united list call fbinary. targets:=$(foreach f,$(targets_full),$(fbinary)) diff --git a/data/eng/Makefile.pestrip b/data/eng/Makefile.pestrip new file mode 100644 index 0000000000..2cc74c7e15 --- /dev/null +++ b/data/eng/Makefile.pestrip @@ -0,0 +1,11 @@ +# This is not a independent Makefile; it is auxiliary file +# included from main Makefile. + +# The arguments of macro pestrip_meta_rule: +# $(1) = name of stripped file, +# $(2) = name of input file +define pestrip_meta_rule +$(1): $(2) Makefile.pestrip + EXENAME="$$<" fasm ../common/pestrip.asm "$$@" + kpack --nologo "$$@" +endef diff --git a/data/et/Makefile b/data/et/Makefile index d4f7964565..5ad66ec385 100644 --- a/data/et/Makefile +++ b/data/et/Makefile @@ -135,24 +135,10 @@ FASM_PROGRAMS:=\ drivers/usbhid.obj:DRIVERS/USBHID.OBJ:$(KERNEL)/drivers/usbhid/usbhid.asm \ drivers/usbstor.obj:DRIVERS/USBSTOR.OBJ:$(KERNEL)/drivers/usbstor.asm \ drivers/vt823x.obj:DRIVERS/VT823X.OBJ:$(KERNEL)/drivers/vt823x.asm \ - drivers/vidintel.obj:DRIVERS/VIDINTEL.OBJ:$(KERNEL)/drivers/vidintel.asm \ drivers/3c59x.obj:DRIVERS/3C59X.OBJ:$(REPOSITORY)/drivers/ethernet/3c59x.asm \ drivers/dec21x4x.obj:DRIVERS/DEC21X4X.OBJ:$(REPOSITORY)/drivers/ethernet/dec21x4x.asm \ - drivers/forcedeth.sys:DRIVERS/FORCEDETH.SYS:$(REPOSITORY)/drivers/ethernet/forcedeth.asm \ - drivers/i8254x.sys:DRIVERS/I8254X.SYS:$(REPOSITORY)/drivers/ethernet/i8254x.asm \ - drivers/i8255x.sys:DRIVERS/I8255X.SYS:$(REPOSITORY)/drivers/ethernet/i8255x.asm \ - drivers/mtd80x.sys:DRIVERS/MTD80X.SYS:$(REPOSITORY)/drivers/ethernet/mtd80x.asm \ - drivers/pcnet32.sys:DRIVERS/PCNET32.SYS:$(REPOSITORY)/drivers/ethernet/pcnet32.asm \ - drivers/r6040.sys:DRIVERS/R6040.SYS:$(REPOSITORY)/drivers/ethernet/R6040.asm \ - drivers/rhine.sys:DRIVERS/RHINE.SYS:$(REPOSITORY)/drivers/ethernet/rhine.asm \ - drivers/rtl8029.sys:DRIVERS/RTL8029.SYS:$(REPOSITORY)/drivers/ethernet/RTL8029.asm \ drivers/rtl8139.obj:DRIVERS/RTL8139.OBJ:$(REPOSITORY)/drivers/ethernet/RTL8139.asm \ drivers/rtl8169.obj:DRIVERS/RTL8169.OBJ:$(REPOSITORY)/drivers/ethernet/RTL8169.asm \ - drivers/sis900.sys:DRIVERS/SIS900.SYS:$(REPOSITORY)/drivers/ethernet/sis900.asm \ - drivers/uhci.sys:DRIVERS/UHCI.SYS:$(REPOSITORY)/drivers/usb/uhci.asm \ - drivers/ohci.sys:DRIVERS/OHCI.SYS:$(REPOSITORY)/drivers/usb/ohci.asm \ - drivers/ehci.sys:DRIVERS/EHCI.SYS:$(REPOSITORY)/drivers/usb/ehci.asm \ - drivers/rdc.sys:DRIVERS/RDC.SYS:$(REPOSITORY)/drivers/video/rdc.asm \ File|Managers/kfar:File|Managers/KFAR:$(PROGS)/fs/kfar/trunk/kfar.asm \ File|Managers/kfm:File|Managers/KFM:$(PROGS)/fs/kfm/trunk/kfm.asm \ File|Managers/opendial:File|Managers/OPENDIAL:$(PROGS)/fs/opendial/opendial.asm \ @@ -212,6 +198,23 @@ FASM_PROGRAMS:=\ network/ircc:NETWORK/IRCC:$(PROGS)/network/ircc/ircc.asm \ network/downloader:NETWORK/DOWNLOADER:$(PROGS)/network/downloader/downloader.asm \ # end of list +# Same as above with PE stripping as extra step. +FASM_PROGRAMS_PESTRIP:=\ + drivers/vidintel.sys:DRIVERS/VIDINTEL.SYS:$(REPOSITORY)/drivers/vidintel.asm \ + drivers/forcedeth.sys:DRIVERS/FORCEDETH.SYS:$(REPOSITORY)/drivers/ethernet/forcedeth.asm \ + drivers/i8254x.sys:DRIVERS/I8254X.SYS:$(REPOSITORY)/drivers/ethernet/i8254x.asm \ + drivers/i8255x.sys:DRIVERS/I8255X.SYS:$(REPOSITORY)/drivers/ethernet/i8255x.asm \ + drivers/mtd80x.sys:DRIVERS/MTD80X.SYS:$(REPOSITORY)/drivers/ethernet/mtd80x.asm \ + drivers/pcnet32.sys:DRIVERS/PCNET32.SYS:$(REPOSITORY)/drivers/ethernet/pcnet32.asm \ + drivers/r6040.sys:DRIVERS/R6040.SYS:$(REPOSITORY)/drivers/ethernet/R6040.asm \ + drivers/rhine.sys:DRIVERS/RHINE.SYS:$(REPOSITORY)/drivers/ethernet/rhine.asm \ + drivers/rtl8029.sys:DRIVERS/RTL8029.SYS:$(REPOSITORY)/drivers/ethernet/RTL8029.asm \ + drivers/sis900.sys:DRIVERS/SIS900.SYS:$(REPOSITORY)/drivers/ethernet/sis900.asm \ + drivers/uhci.sys:DRIVERS/UHCI.SYS:$(REPOSITORY)/drivers/usb/uhci.asm \ + drivers/ohci.sys:DRIVERS/OHCI.SYS:$(REPOSITORY)/drivers/usb/ohci.asm \ + drivers/ehci.sys:DRIVERS/EHCI.SYS:$(REPOSITORY)/drivers/usb/ehci.asm \ + drivers/rdc.sys:DRIVERS/RDC.SYS:$(REPOSITORY)/drivers/video/rdc.asm \ +# end of list # The list of all FASM programs with one main FASM file for CD image. # Format of an item is exactly the same as in the previous list. FASM_PROGRAMS_CD:=\ @@ -446,9 +449,15 @@ fimage=$(call respace,$(call imagepart,$(f))) fsource=$(call respace,$(call sourcepart,$(f))) fparam=$(call respace,$(call parampart,$(f))) +# Add stripped PE files produced by fasm to FASM_NOKPACK_PROGRAMS. +include Makefile.pestrip +FASM_NOKPACK_PROGRAMS:=$(FASM_NOKPACK_PROGRAMS) \ + $(foreach f,$(FASM_PROGRAMS_PESTRIP),$(fbinary).full:-:$(fsource)) +$(foreach f,$(FASM_PROGRAMS_PESTRIP),$(eval $(call pestrip_meta_rule,$(fbinary),$(fbinary).full))) + # Define targets for image file. # Join all the lists above. -targets_full:=$(COPY_FILES) $(FASM_PROGRAMS) $(NASM_PROGRAMS) $(OTHER_FILES) $(CMM_PROGRAMS) +targets_full:=$(COPY_FILES) $(FASM_PROGRAMS) $(FASM_PROGRAMS_PESTRIP) $(NASM_PROGRAMS) $(OTHER_FILES) $(CMM_PROGRAMS) # For each item in the united list call fbinary. targets:=$(foreach f,$(targets_full),$(fbinary)) diff --git a/data/et/Makefile.pestrip b/data/et/Makefile.pestrip new file mode 100644 index 0000000000..2cc74c7e15 --- /dev/null +++ b/data/et/Makefile.pestrip @@ -0,0 +1,11 @@ +# This is not a independent Makefile; it is auxiliary file +# included from main Makefile. + +# The arguments of macro pestrip_meta_rule: +# $(1) = name of stripped file, +# $(2) = name of input file +define pestrip_meta_rule +$(1): $(2) Makefile.pestrip + EXENAME="$$<" fasm ../common/pestrip.asm "$$@" + kpack --nologo "$$@" +endef diff --git a/data/it/Makefile b/data/it/Makefile index 86af7e2537..335b7ec04c 100644 --- a/data/it/Makefile +++ b/data/it/Makefile @@ -135,24 +135,10 @@ FASM_PROGRAMS:=\ drivers/usbhid.obj:DRIVERS/USBHID.OBJ:$(KERNEL)/drivers/usbhid/usbhid.asm \ drivers/usbstor.obj:DRIVERS/USBSTOR.OBJ:$(KERNEL)/drivers/usbstor.asm \ drivers/vt823x.obj:DRIVERS/VT823X.OBJ:$(KERNEL)/drivers/vt823x.asm \ - drivers/vidintel.obj:DRIVERS/VIDINTEL.OBJ:$(KERNEL)/drivers/vidintel.asm \ drivers/3c59x.obj:DRIVERS/3C59X.OBJ:$(REPOSITORY)/drivers/ethernet/3c59x.asm \ drivers/dec21x4x.obj:DRIVERS/DEC21X4X.OBJ:$(REPOSITORY)/drivers/ethernet/dec21x4x.asm \ - drivers/forcedeth.sys:DRIVERS/FORCEDETH.SYS:$(REPOSITORY)/drivers/ethernet/forcedeth.asm \ - drivers/i8254x.sys:DRIVERS/I8254X.SYS:$(REPOSITORY)/drivers/ethernet/i8254x.asm \ - drivers/i8255x.sys:DRIVERS/I8255X.SYS:$(REPOSITORY)/drivers/ethernet/i8255x.asm \ - drivers/mtd80x.sys:DRIVERS/MTD80X.SYS:$(REPOSITORY)/drivers/ethernet/mtd80x.asm \ - drivers/pcnet32.sys:DRIVERS/PCNET32.SYS:$(REPOSITORY)/drivers/ethernet/pcnet32.asm \ - drivers/r6040.sys:DRIVERS/R6040.SYS:$(REPOSITORY)/drivers/ethernet/R6040.asm \ - drivers/rhine.sys:DRIVERS/RHINE.SYS:$(REPOSITORY)/drivers/ethernet/rhine.asm \ - drivers/rtl8029.sys:DRIVERS/RTL8029.SYS:$(REPOSITORY)/drivers/ethernet/RTL8029.asm \ drivers/rtl8139.obj:DRIVERS/RTL8139.OBJ:$(REPOSITORY)/drivers/ethernet/RTL8139.asm \ drivers/rtl8169.obj:DRIVERS/RTL8169.OBJ:$(REPOSITORY)/drivers/ethernet/RTL8169.asm \ - drivers/sis900.sys:DRIVERS/SIS900.SYS:$(REPOSITORY)/drivers/ethernet/sis900.asm \ - drivers/uhci.sys:DRIVERS/UHCI.SYS:$(REPOSITORY)/drivers/usb/uhci.asm \ - drivers/ohci.sys:DRIVERS/OHCI.SYS:$(REPOSITORY)/drivers/usb/ohci.asm \ - drivers/ehci.sys:DRIVERS/EHCI.SYS:$(REPOSITORY)/drivers/usb/ehci.asm \ - drivers/rdc.sys:DRIVERS/RDC.SYS:$(REPOSITORY)/drivers/video/rdc.asm \ File|Managers/kfar:File|Managers/KFAR:$(PROGS)/fs/kfar/trunk/kfar.asm \ File|Managers/kfm:File|Managers/KFM:$(PROGS)/fs/kfm/trunk/kfm.asm \ File|Managers/opendial:File|Managers/OPENDIAL:$(PROGS)/fs/opendial/opendial.asm \ @@ -212,6 +198,23 @@ FASM_PROGRAMS:=\ network/ircc:NETWORK/IRCC:$(PROGS)/network/ircc/ircc.asm \ network/downloader:NETWORK/DOWNLOADER:$(PROGS)/network/downloader/downloader.asm \ # end of list +# Same as above with PE stripping as extra step. +FASM_PROGRAMS_PESTRIP:=\ + drivers/vidintel.sys:DRIVERS/VIDINTEL.SYS:$(REPOSITORY)/drivers/vidintel.asm \ + drivers/forcedeth.sys:DRIVERS/FORCEDETH.SYS:$(REPOSITORY)/drivers/ethernet/forcedeth.asm \ + drivers/i8254x.sys:DRIVERS/I8254X.SYS:$(REPOSITORY)/drivers/ethernet/i8254x.asm \ + drivers/i8255x.sys:DRIVERS/I8255X.SYS:$(REPOSITORY)/drivers/ethernet/i8255x.asm \ + drivers/mtd80x.sys:DRIVERS/MTD80X.SYS:$(REPOSITORY)/drivers/ethernet/mtd80x.asm \ + drivers/pcnet32.sys:DRIVERS/PCNET32.SYS:$(REPOSITORY)/drivers/ethernet/pcnet32.asm \ + drivers/r6040.sys:DRIVERS/R6040.SYS:$(REPOSITORY)/drivers/ethernet/R6040.asm \ + drivers/rhine.sys:DRIVERS/RHINE.SYS:$(REPOSITORY)/drivers/ethernet/rhine.asm \ + drivers/rtl8029.sys:DRIVERS/RTL8029.SYS:$(REPOSITORY)/drivers/ethernet/RTL8029.asm \ + drivers/sis900.sys:DRIVERS/SIS900.SYS:$(REPOSITORY)/drivers/ethernet/sis900.asm \ + drivers/uhci.sys:DRIVERS/UHCI.SYS:$(REPOSITORY)/drivers/usb/uhci.asm \ + drivers/ohci.sys:DRIVERS/OHCI.SYS:$(REPOSITORY)/drivers/usb/ohci.asm \ + drivers/ehci.sys:DRIVERS/EHCI.SYS:$(REPOSITORY)/drivers/usb/ehci.asm \ + drivers/rdc.sys:DRIVERS/RDC.SYS:$(REPOSITORY)/drivers/video/rdc.asm \ +# end of list # The list of all FASM programs with one main FASM file for CD image. # Format of an item is exactly the same as in the previous list. FASM_PROGRAMS_CD:=\ @@ -439,9 +442,16 @@ fimage=$(call respace,$(call imagepart,$(f))) fsource=$(call respace,$(call sourcepart,$(f))) fparam=$(call respace,$(call parampart,$(f))) + +# Add stripped PE files produced by fasm to FASM_NOKPACK_PROGRAMS. +include Makefile.pestrip +FASM_NOKPACK_PROGRAMS:=$(FASM_NOKPACK_PROGRAMS) \ + $(foreach f,$(FASM_PROGRAMS_PESTRIP),$(fbinary).full:-:$(fsource)) +$(foreach f,$(FASM_PROGRAMS_PESTRIP),$(eval $(call pestrip_meta_rule,$(fbinary),$(fbinary).full))) + # Define targets for image file. # Join all the lists above. -targets_full:=$(COPY_FILES) $(FASM_PROGRAMS) $(NASM_PROGRAMS) $(OTHER_FILES) $(CMM_PROGRAMS) +targets_full:=$(COPY_FILES) $(FASM_PROGRAMS) $(FASM_PROGRAMS_PESTRIP) $(NASM_PROGRAMS) $(OTHER_FILES) $(CMM_PROGRAMS) # For each item in the united list call fbinary. targets:=$(foreach f,$(targets_full),$(fbinary)) diff --git a/data/it/Makefile.pestrip b/data/it/Makefile.pestrip new file mode 100644 index 0000000000..2cc74c7e15 --- /dev/null +++ b/data/it/Makefile.pestrip @@ -0,0 +1,11 @@ +# This is not a independent Makefile; it is auxiliary file +# included from main Makefile. + +# The arguments of macro pestrip_meta_rule: +# $(1) = name of stripped file, +# $(2) = name of input file +define pestrip_meta_rule +$(1): $(2) Makefile.pestrip + EXENAME="$$<" fasm ../common/pestrip.asm "$$@" + kpack --nologo "$$@" +endef diff --git a/data/rus/Makefile b/data/rus/Makefile index 3a57bbabc6..879eb935c9 100644 --- a/data/rus/Makefile +++ b/data/rus/Makefile @@ -136,24 +136,10 @@ FASM_PROGRAMS:=\ drivers/usbhid.obj:DRIVERS/USBHID.OBJ:$(KERNEL)/drivers/usbhid/usbhid.asm \ drivers/usbstor.obj:DRIVERS/USBSTOR.OBJ:$(KERNEL)/drivers/usbstor.asm \ drivers/vt823x.obj:DRIVERS/VT823X.OBJ:$(KERNEL)/drivers/vt823x.asm \ - drivers/vidintel.obj:DRIVERS/VIDINTEL.OBJ:$(KERNEL)/drivers/vidintel.asm \ drivers/3c59x.obj:DRIVERS/3C59X.OBJ:$(REPOSITORY)/drivers/ethernet/3c59x.asm \ drivers/dec21x4x.obj:DRIVERS/DEC21X4X.OBJ:$(REPOSITORY)/drivers/ethernet/dec21x4x.asm \ - drivers/forcedeth.sys:DRIVERS/FORCEDETH.SYS:$(REPOSITORY)/drivers/ethernet/forcedeth.asm \ - drivers/i8254x.sys:DRIVERS/I8254X.SYS:$(REPOSITORY)/drivers/ethernet/i8254x.asm \ - drivers/i8255x.sys:DRIVERS/I8255X.SYS:$(REPOSITORY)/drivers/ethernet/i8255x.asm \ - drivers/mtd80x.sys:DRIVERS/MTD80X.SYS:$(REPOSITORY)/drivers/ethernet/mtd80x.asm \ - drivers/pcnet32.sys:DRIVERS/PCNET32.SYS:$(REPOSITORY)/drivers/ethernet/pcnet32.asm \ - drivers/r6040.sys:DRIVERS/R6040.SYS:$(REPOSITORY)/drivers/ethernet/R6040.asm \ - drivers/rhine.sys:DRIVERS/RHINE.SYS:$(REPOSITORY)/drivers/ethernet/rhine.asm \ - drivers/rtl8029.sys:DRIVERS/RTL8029.SYS:$(REPOSITORY)/drivers/ethernet/RTL8029.asm \ drivers/rtl8139.obj:DRIVERS/RTL8139.OBJ:$(REPOSITORY)/drivers/ethernet/RTL8139.asm \ drivers/rtl8169.obj:DRIVERS/RTL8169.OBJ:$(REPOSITORY)/drivers/ethernet/RTL8169.asm \ - drivers/sis900.sys:DRIVERS/SIS900.SYS:$(REPOSITORY)/drivers/ethernet/sis900.asm \ - drivers/uhci.sys:DRIVERS/UHCI.SYS:$(REPOSITORY)/drivers/usb/uhci.asm \ - drivers/ohci.sys:DRIVERS/OHCI.SYS:$(REPOSITORY)/drivers/usb/ohci.asm \ - drivers/ehci.sys:DRIVERS/EHCI.SYS:$(REPOSITORY)/drivers/usb/ehci.asm \ - drivers/rdc.sys:DRIVERS/RDC.SYS:$(REPOSITORY)/drivers/video/rdc.asm \ File|Managers/kfar:File|Managers/KFAR:$(PROGS)/fs/kfar/trunk/kfar.asm \ File|Managers/kfm:File|Managers/KFM:$(PROGS)/fs/kfm/trunk/kfm.asm \ File|Managers/opendial:File|Managers/OPENDIAL:$(PROGS)/fs/opendial/opendial.asm \ @@ -212,6 +198,23 @@ FASM_PROGRAMS:=\ network/ircc:NETWORK/IRCC:$(PROGS)/network/ircc/ircc.asm \ network/downloader:NETWORK/DOWNLOADER:$(PROGS)/network/downloader/downloader.asm \ # end of list +# Same as above with PE stripping as extra step. +FASM_PROGRAMS_PESTRIP:=\ + drivers/vidintel.sys:DRIVERS/VIDINTEL.SYS:$(REPOSITORY)/drivers/video/vidintel.asm \ + drivers/forcedeth.sys:DRIVERS/FORCEDETH.SYS:$(REPOSITORY)/drivers/ethernet/forcedeth.asm \ + drivers/i8254x.sys:DRIVERS/I8254X.SYS:$(REPOSITORY)/drivers/ethernet/i8254x.asm \ + drivers/i8255x.sys:DRIVERS/I8255X.SYS:$(REPOSITORY)/drivers/ethernet/i8255x.asm \ + drivers/mtd80x.sys:DRIVERS/MTD80X.SYS:$(REPOSITORY)/drivers/ethernet/mtd80x.asm \ + drivers/pcnet32.sys:DRIVERS/PCNET32.SYS:$(REPOSITORY)/drivers/ethernet/pcnet32.asm \ + drivers/r6040.sys:DRIVERS/R6040.SYS:$(REPOSITORY)/drivers/ethernet/R6040.asm \ + drivers/rhine.sys:DRIVERS/RHINE.SYS:$(REPOSITORY)/drivers/ethernet/rhine.asm \ + drivers/rtl8029.sys:DRIVERS/RTL8029.SYS:$(REPOSITORY)/drivers/ethernet/RTL8029.asm \ + drivers/sis900.sys:DRIVERS/SIS900.SYS:$(REPOSITORY)/drivers/ethernet/sis900.asm \ + drivers/uhci.sys:DRIVERS/UHCI.SYS:$(REPOSITORY)/drivers/usb/uhci.asm \ + drivers/ohci.sys:DRIVERS/OHCI.SYS:$(REPOSITORY)/drivers/usb/ohci.asm \ + drivers/ehci.sys:DRIVERS/EHCI.SYS:$(REPOSITORY)/drivers/usb/ehci.asm \ + drivers/rdc.sys:DRIVERS/RDC.SYS:$(REPOSITORY)/drivers/video/rdc.asm \ +# end of list # The list of all FASM programs with one main FASM file for CD image. # Format of an item is exactly the same as in the previous list. FASM_PROGRAMS_CD:=\ @@ -467,9 +470,15 @@ fimage=$(call respace,$(call imagepart,$(f))) fsource=$(call respace,$(call sourcepart,$(f))) fparam=$(call respace,$(call parampart,$(f))) +# Add stripped PE files produced by fasm to FASM_NOKPACK_PROGRAMS. +include Makefile.pestrip +FASM_NOKPACK_PROGRAMS:=$(FASM_NOKPACK_PROGRAMS) \ + $(foreach f,$(FASM_PROGRAMS_PESTRIP),$(fbinary).full:-:$(fsource)) +$(foreach f,$(FASM_PROGRAMS_PESTRIP),$(eval $(call pestrip_meta_rule,$(fbinary),$(fbinary).full))) + # Define targets for image file. # Join all the lists above. -targets_full:=$(COPY_FILES) $(FASM_PROGRAMS) $(NASM_PROGRAMS) $(OTHER_FILES) $(CMM_PROGRAMS) +targets_full:=$(COPY_FILES) $(FASM_PROGRAMS) $(FASM_PROGRAMS_PESTRIP) $(NASM_PROGRAMS) $(OTHER_FILES) $(CMM_PROGRAMS) # For each item in the united list call fbinary. targets:=$(foreach f,$(targets_full),$(fbinary)) diff --git a/data/rus/Makefile.pestrip b/data/rus/Makefile.pestrip new file mode 100644 index 0000000000..2cc74c7e15 --- /dev/null +++ b/data/rus/Makefile.pestrip @@ -0,0 +1,11 @@ +# This is not a independent Makefile; it is auxiliary file +# included from main Makefile. + +# The arguments of macro pestrip_meta_rule: +# $(1) = name of stripped file, +# $(2) = name of input file +define pestrip_meta_rule +$(1): $(2) Makefile.pestrip + EXENAME="$$<" fasm ../common/pestrip.asm "$$@" + kpack --nologo "$$@" +endef diff --git a/data/sp/Makefile b/data/sp/Makefile index d83ffb6dc3..6b56bd9509 100644 --- a/data/sp/Makefile +++ b/data/sp/Makefile @@ -135,24 +135,10 @@ FASM_PROGRAMS:=\ drivers/usbhid.obj:DRIVERS/USBHID.OBJ:$(KERNEL)/drivers/usbhid/usbhid.asm \ drivers/usbstor.obj:DRIVERS/USBSTOR.OBJ:$(KERNEL)/drivers/usbstor.asm \ drivers/vt823x.obj:DRIVERS/VT823X.OBJ:$(KERNEL)/drivers/vt823x.asm \ - drivers/vidintel.obj:DRIVERS/VIDINTEL.OBJ:$(KERNEL)/drivers/vidintel.asm \ drivers/3c59x.obj:DRIVERS/3C59X.OBJ:$(REPOSITORY)/drivers/ethernet/3c59x.asm \ drivers/dec21x4x.obj:DRIVERS/DEC21X4X.OBJ:$(REPOSITORY)/drivers/ethernet/dec21x4x.asm \ - drivers/forcedeth.sys:DRIVERS/FORCEDETH.SYS:$(REPOSITORY)/drivers/ethernet/forcedeth.asm \ - drivers/i8254x.sys:DRIVERS/I8254X.SYS:$(REPOSITORY)/drivers/ethernet/i8254x.asm \ - drivers/i8255x.sys:DRIVERS/I8255X.SYS:$(REPOSITORY)/drivers/ethernet/i8255x.asm \ - drivers/mtd80x.sys:DRIVERS/MTD80X.SYS:$(REPOSITORY)/drivers/ethernet/mtd80x.asm \ - drivers/pcnet32.sys:DRIVERS/PCNET32.SYS:$(REPOSITORY)/drivers/ethernet/pcnet32.asm \ - drivers/r6040.sys:DRIVERS/R6040.SYS:$(REPOSITORY)/drivers/ethernet/R6040.asm \ - drivers/rhine.sys:DRIVERS/RHINE.SYS:$(REPOSITORY)/drivers/ethernet/rhine.asm \ - drivers/rtl8029.sys:DRIVERS/RTL8029.SYS:$(REPOSITORY)/drivers/ethernet/RTL8029.asm \ drivers/rtl8139.obj:DRIVERS/RTL8139.OBJ:$(REPOSITORY)/drivers/ethernet/RTL8139.asm \ drivers/rtl8169.obj:DRIVERS/RTL8169.OBJ:$(REPOSITORY)/drivers/ethernet/RTL8169.asm \ - drivers/sis900.sys:DRIVERS/SIS900.SYS:$(REPOSITORY)/drivers/ethernet/sis900.asm \ - drivers/uhci.sys:DRIVERS/UHCI.SYS:$(REPOSITORY)/drivers/usb/uhci.asm \ - drivers/ohci.sys:DRIVERS/OHCI.SYS:$(REPOSITORY)/drivers/usb/ohci.asm \ - drivers/ehci.sys:DRIVERS/EHCI.SYS:$(REPOSITORY)/drivers/usb/ehci.asm \ - drivers/rdc.sys:DRIVERS/RDC.SYS:$(REPOSITORY)/drivers/video/rdc.asm \ File|Managers/kfar:File|Managers/KFAR:$(PROGS)/fs/kfar/trunk/kfar.asm \ File|Managers/kfm:File|Managers/KFM:$(PROGS)/fs/kfm/trunk/kfm.asm \ File|Managers/opendial:File|Managers/OPENDIAL:$(PROGS)/fs/opendial/opendial.asm \ @@ -212,6 +198,23 @@ FASM_PROGRAMS:=\ network/ircc:NETWORK/IRCC:$(PROGS)/network/ircc/ircc.asm \ network/downloader:NETWORK/DOWNLOADER:$(PROGS)/network/downloader/downloader.asm \ # end of list +# Same as above with PE stripping as extra step. +FASM_PROGRAMS_PESTRIP:=\ + drivers/vidintel.sys:DRIVERS/VIDINTEL.SYS:$(REPOSITORY)/drivers/vidintel.asm \ + drivers/forcedeth.sys:DRIVERS/FORCEDETH.SYS:$(REPOSITORY)/drivers/ethernet/forcedeth.asm \ + drivers/i8254x.sys:DRIVERS/I8254X.SYS:$(REPOSITORY)/drivers/ethernet/i8254x.asm \ + drivers/i8255x.sys:DRIVERS/I8255X.SYS:$(REPOSITORY)/drivers/ethernet/i8255x.asm \ + drivers/mtd80x.sys:DRIVERS/MTD80X.SYS:$(REPOSITORY)/drivers/ethernet/mtd80x.asm \ + drivers/pcnet32.sys:DRIVERS/PCNET32.SYS:$(REPOSITORY)/drivers/ethernet/pcnet32.asm \ + drivers/r6040.sys:DRIVERS/R6040.SYS:$(REPOSITORY)/drivers/ethernet/R6040.asm \ + drivers/rhine.sys:DRIVERS/RHINE.SYS:$(REPOSITORY)/drivers/ethernet/rhine.asm \ + drivers/rtl8029.sys:DRIVERS/RTL8029.SYS:$(REPOSITORY)/drivers/ethernet/RTL8029.asm \ + drivers/sis900.sys:DRIVERS/SIS900.SYS:$(REPOSITORY)/drivers/ethernet/sis900.asm \ + drivers/uhci.sys:DRIVERS/UHCI.SYS:$(REPOSITORY)/drivers/usb/uhci.asm \ + drivers/ohci.sys:DRIVERS/OHCI.SYS:$(REPOSITORY)/drivers/usb/ohci.asm \ + drivers/ehci.sys:DRIVERS/EHCI.SYS:$(REPOSITORY)/drivers/usb/ehci.asm \ + drivers/rdc.sys:DRIVERS/RDC.SYS:$(REPOSITORY)/drivers/video/rdc.asm \ +# end of list # The list of all FASM programs with one main FASM file for CD image. # Format of an item is exactly the same as in the previous list. FASM_PROGRAMS_CD:=\ @@ -445,9 +448,15 @@ fimage=$(call respace,$(call imagepart,$(f))) fsource=$(call respace,$(call sourcepart,$(f))) fparam=$(call respace,$(call parampart,$(f))) +# Add stripped PE files produced by fasm to FASM_NOKPACK_PROGRAMS. +include Makefile.pestrip +FASM_NOKPACK_PROGRAMS:=$(FASM_NOKPACK_PROGRAMS) \ + $(foreach f,$(FASM_PROGRAMS_PESTRIP),$(fbinary).full:-:$(fsource)) +$(foreach f,$(FASM_PROGRAMS_PESTRIP),$(eval $(call pestrip_meta_rule,$(fbinary),$(fbinary).full))) + # Define targets for image file. # Join all the lists above. -targets_full:=$(COPY_FILES) $(FASM_PROGRAMS) $(NASM_PROGRAMS) $(OTHER_FILES) $(CMM_PROGRAMS) +targets_full:=$(COPY_FILES) $(FASM_PROGRAMS) $(FASM_PROGRAMS_PESTRIP) $(NASM_PROGRAMS) $(OTHER_FILES) $(CMM_PROGRAMS) # For each item in the united list call fbinary. targets:=$(foreach f,$(targets_full),$(fbinary)) diff --git a/data/sp/Makefile.pestrip b/data/sp/Makefile.pestrip new file mode 100644 index 0000000000..2cc74c7e15 --- /dev/null +++ b/data/sp/Makefile.pestrip @@ -0,0 +1,11 @@ +# This is not a independent Makefile; it is auxiliary file +# included from main Makefile. + +# The arguments of macro pestrip_meta_rule: +# $(1) = name of stripped file, +# $(2) = name of input file +define pestrip_meta_rule +$(1): $(2) Makefile.pestrip + EXENAME="$$<" fasm ../common/pestrip.asm "$$@" + kpack --nologo "$$@" +endef diff --git a/drivers/video/vidintel.asm b/drivers/video/vidintel.asm new file mode 100644 index 0000000000..ebb57f8a5b --- /dev/null +++ b/drivers/video/vidintel.asm @@ -0,0 +1,467 @@ +; Stub of videodriver for Intel videocards. +; (c) CleverMouse + +; When the start procedure gots control, +; it tries to detect preferred resolution, +; sets the detected resolution assuming 32-bpp VESA mode and exits +; (without registering a service). +; Detection can be overloaded with compile-time settings +; use_predefined_mode/predefined_width/predefined_height. + +; set predefined resolution here +use_predefined_mode = 0;1 +predefined_width = 0;1366 +predefined_height = 0;768 + +; standard driver stuff; target OS version = 0.80 +format PE DLL native 0.80 +entry START +__DEBUG__ equ 1 +__DEBUG_LEVEL__ equ 1 +section '.flat' readable writable executable +include '../proc32.inc' +include '../struct.inc' +include '../macros.inc' +;include 'fdo.inc' + +DEBUG = 1 + +; the start procedure (see the description above) +START: +; 1. Detect device. Abort if not found. + push esi + call DetectDevice + test esi, esi + jz .return0 +; 2. Detect optimal mode unless the mode is given explicitly. Abort if failed. +if use_predefined_mode = 0 + call DetectMode +end if + cmp [width], 0 + jz .return0_cleanup +; 3. Set the detected mode. + call SetMode +; 4. Cleanup and return. +.return0_cleanup: + invoke FreeKernelSpace, esi +.return0: + pop esi + xor eax, eax + ret + +; check that there is Intel videocard +; if so, map MMIO registers and set internal variables +; esi points to MMIO block; NULL means no device +DetectDevice: +; 1. Sanity check: check that we are dealing with Intel videocard. +; Integrated video device for Intel is always at PCI:0:2:0. + xor esi, esi ; initialize return value to NULL +; 1a. Get PCI VendorID and DeviceID. + push esi + push 10h + push esi + invoke PciRead32 +; 1b. loword(eax) = ax = VendorID, hiword(eax) = DeviceID. +; Test whether we have Intel chipset. + cmp ax, 8086h + jnz .return +; 1c. Say hi including DeviceID. + shr eax, 10h + push edi + pusha + mov edi, pciid_text + call WriteWord + mov esi, hellomsg + invoke SysMsgBoardStr + popa +; 1d. Test whether we know this DeviceID. +; If this is the case, remember the position of the device in line of Intel cards; +; this knowledge will be useful later. +; Tested on devices with id: 8086:0046, partially 8086:2A02. + mov ecx, pciids_num + mov edi, pciids + repnz scasw + pop edi + jnz .return_unknown_pciid + sub ecx, pciids_num - 1 + neg ecx + mov [deviceType], ecx +; 1e. Continue saying hi with positive intonation. + pusha + mov esi, knownmsg + invoke SysMsgBoardStr + popa +; 2. Prepare MMIO region to control the card. +; 2a. Read MMIO physical address from PCI config space. + push 10h + cmp ecx, i9xx_start + jae @f + mov byte [esp], 14h +@@: + push 10h + push esi + invoke PciRead32 +; 2b. Mask out PCI region type, lower 4 bits. + and al, not 0xF +; 2c. Create virtual mapping of the physical memory. + push 1Bh + push 100000h + push eax + invoke MapIoMem +; 3. Return. + xchg esi, eax +.return: + ret +; 1f. If we do not know DeviceID, continue saying hi with negative intonation. +.return_unknown_pciid: + pusha + mov esi, unknownmsg + invoke SysMsgBoardStr + popa + ret + +; Convert word in ax to hexadecimal text in edi, advance edi. +WriteWord: +; 1. Convert high byte. + push eax + mov al, ah + call WriteByte + pop eax +; 2. Convert low byte. +; Fall through to WriteByte; ret from WriteByte is ret from WriteWord too. + +; Convert byte in al to hexadecimal text in edi, advance edi. +WriteByte: +; 1. Convert high nibble. + push eax + shr al, 4 + call WriteNibble + pop eax +; 2. Convert low nibble. + and al, 0xF +; Fall through to WriteNibble; ret from WriteNibble is ret from WriteByte too. + +; Convert nibble in al to hexadecimal text in edi, advance edi. +WriteNibble: +; Obvious, isn't it? + cmp al, 10 + sbb al, 69h + das + stosb + ret + +if use_predefined_mode = 0 +; detect resolution of the flat panel +DetectMode: + push esi edi +; 1. Get the location of block of GMBUS* registers. +; Starting with Ironlake, GMBUS* registers were moved. + add esi, 5100h + cmp [deviceType], ironlake_start + jb @f + add esi, 0xC0000 +@@: +; 2. Initialize GMBUS engine. + mov edi, edid + mov ecx, 0x10000 +@@: + test byte [esi+8+1], 80h + loopnz @b + jnz .fail + mov dword [esi], 3 + test byte [esi+8+1], 4 + jz .noreset + call ResetGMBus + jnz .fail +.noreset: +; 3. Send read command. + and dword [esi+20h], 0 + mov dword [esi+4], 4E8000A1h +; 4. Wait for data, writing to the buffer as data arrive. +.getdata: + mov ecx, 0x10000 +@@: + test byte [esi+8+1], 8 + loopz @b + test byte [esi+8+1], 4 + jz .dataok + call ResetGMBus + jmp .fail +.dataok: + mov eax, [esi+0Ch] + stosd + cmp edi, edid+80h + jb .getdata +; 5. Wait for bus idle. + mov ecx, 0x10000 +@@: + test byte [esi+8+1], 2 + loopnz @b +; 6. We got EDID; dump it if DEBUG. +if DEBUG + pusha + xor ecx, ecx + mov esi, edid + mov edi, edid_text +.dumploop: + lodsb + call WriteByte + mov al, ' ' + stosb + inc cl + test cl, 15 + jnz @f + mov byte [edi-1], 13 + mov al, 10 + stosb +@@: + test cl, cl + jns .dumploop + mov esi, edidmsg + invoke SysMsgBoardStr + popa +end if +; 7. Test whether EDID is good. +; 7a. Signature: 00 FF FF FF FF FF FF 00. + mov esi, edid + cmp dword [esi], 0xFFFFFF00 + jnz .fail + cmp dword [esi+4], 0x00FFFFFF + jnz .fail +; 7b. Checksum must be zero. + xor edx, edx + mov ecx, 80h +@@: + lodsb + add dl, al + loop @b + jnz .fail +; 8. Get width and height from EDID. + xor eax, eax + mov ah, [esi-80h+3Ah] + shr ah, 4 + mov al, [esi-80h+38h] + mov [width], eax + mov ah, [esi-80h+3Dh] + shr ah, 4 + mov al, [esi-80h+3Bh] + mov [height], eax +; 9. Return. +.fail: + pop edi esi + ret + +; reset bus, clear all errors +ResetGMBus: +; look into the PRM + mov dword [esi+4], 80000000h + mov dword [esi+4], 0 + mov ecx, 0x10000 +@@: + test byte [esi+8+1], 2 + loopnz @b + ret +end if + +; set resolution [width]*[height] +SetMode: +; 1. Program the registers of videocard. +; look into the PRM + cli +; or byte [esi+7000Ah], 0Ch ; PIPEACONF: disable Display+Cursor Planes +; or byte [esi+7100Ah], 0Ch ; PIPEBCONF: disable Display+Cursor Planes + xor eax, eax + xor edx, edx + cmp [deviceType], i965_start + jb @f + mov dl, 9Ch - 84h +@@: +; or byte [esi+71403h], 80h ; VGACNTRL: VGA Display Disable + and byte [esi+70080h], not 27h ; CURACNTR: disable cursor A + mov dword [esi+70084h], eax ; CURABASE: force write to CURA* regs + and byte [esi+700C0h], not 27h ; CURBCNTR: disable cursor B + mov dword [esi+700C4h], eax ; CURBBASE: force write to CURB* regs + and byte [esi+70183h], not 80h ; DSPACNTR: disable Primary A Plane + mov dword [esi+edx+70184h], eax ; DSPALINOFF/DSPASURF: force write to DSPA* regs + and byte [esi+71183h], not 80h ; DSPBCNTR: disable Primary B Plane + mov dword [esi+edx+71184h], eax ; DSPBLINOFF/DSPBSURF: force write to DSPB* regs +if 1 + cmp [deviceType], ironlake_start + jae .disable_pipes + mov edx, 10000h + or byte [esi+70024h], 2 ; PIPEASTAT: clear VBLANK status + or byte [esi+71024h], 2 ; PIPEBSTAT: clear VBLANK status +.wait_vblank_preironlake1: + mov ecx, 1000h + loop $ + test byte [esi+7000Bh], 80h ; PIPEACONF: pipe A active? + jz @f + test byte [esi+70024h], 2 ; PIPEASTAT: got VBLANK? + jz .wait_vblank_preironlake2 +@@: + test byte [esi+7100Bh], 80h ; PIPEBCONF: pipe B active? + jz .disable_pipes + test byte [esi+71024h], 2 ; PIPEBSTAT: got VBLANK? + jnz .disable_pipes +.wait_vblank_preironlake2: + dec edx + jnz .wait_vblank_preironlake1 + jmp .not_disabled +.disable_pipes: +end if + and byte [esi+7000Bh], not 80h ; PIPEACONF: disable pipe + and byte [esi+7100Bh], not 80h ; PIPEBCONF: disable pipe + cmp [deviceType], gen4_start + jb .wait_watching_scanline +; g45 and later: use special flag from PIPE*CONF + mov edx, 10000h +@@: + mov ecx, 1000h + loop $ + test byte [esi+7000Bh], 40h ; PIPEACONF: wait until pipe disabled + jz @f + dec edx + jnz @b + jmp .not_disabled +@@: + test byte [esi+7100Bh], 40h ; PIPEBCONF: wait until pipe disabled + jz .disabled + mov ecx, 1000h + loop $ + dec edx + jnz @b + jmp .not_disabled +; pineview and before: wait while scanline still changes +.wait_watching_scanline: + mov edx, 1000h +.dis1: + push dword [esi+71000h] + push dword [esi+70000h] + mov ecx, 10000h + loop $ + pop eax + xor eax, [esi+70000h] + and eax, 1FFFh + pop eax + jnz .notdis1 + xor eax, [esi+71000h] + and eax, 1FFFh + jz .disabled +.notdis1: + dec edx + jnz .dis1 +.not_disabled: + sti + jmp .return +.disabled: + lea eax, [esi+61183h] + cmp [deviceType], ironlake_start + jb @f + add eax, 0xE0000 - 0x60000 +@@: + lea edx, [esi+60000h] + test byte [eax], 40h + jz @f + add edx, 1000h +@@: + mov eax, [width] + dec eax + shl eax, 16 + mov ax, word [height] + dec eax + mov dword [edx+1Ch], eax ; PIPEASRC: set source image size + ror eax, 16 + mov dword [edx+10190h], eax ; for old cards + mov ecx, [width] + add ecx, 15 + and ecx, not 15 + shl ecx, 2 + mov dword [edx+10188h], ecx ; DSPASTRIDE: set scanline length + mov dword [edx+10184h], 0 ; DSPALINOFF: force write to DSPA* registers + and byte [esi+61233h], not 80h ; PFIT_CONTROL: disable panel fitting + or byte [edx+1000Bh], 80h ; PIPEACONF: enable pipe +; and byte [edx+1000Ah], not 0Ch ; PIPEACONF: enable Display+Cursor Planes + or byte [edx+10183h], 80h ; DSPACNTR: enable Display Plane A + sti +; 2. Notify the kernel that resolution has changed. + invoke GetDisplay + mov edx, [width] + mov dword [eax+8], edx + mov edx, [height] + mov dword [eax+0Ch], edx + mov [eax+18h], ecx + mov eax, [width] + dec eax + dec edx + invoke SetScreen +.return: + ret + +include '../peimport.inc' +data fixups +end data + +align 4 +hellomsg db 'Intel videocard detected, PciId=8086:' +pciid_text db '0000' + db ', which is ', 0 +knownmsg db 'known',13,10,0 +unknownmsg db 'unknown',13,10,0 + +if DEBUG +edidmsg db 'EDID successfully read:',13,10 +edid_text rb 8*(16*3+1) + db 0 +end if + +width dd predefined_width +height dd predefined_height + +pciids: + dw 0x3577 ; i830m + dw 0x2562 ; 845g + dw 0x3582 ; i855gm +i865_start = ($ - pciids) / 2 + dw 0x2572 ; i865g +i9xx_start = ($ - pciids) / 2 + dw 0x2582 ; i915g + dw 0x258a ; e7221g (i915g) + dw 0x2592 ; i915gm + dw 0x2772 ; i945g + dw 0x27a2 ; i945gm + dw 0x27ae ; i945gme +i965_start = ($ - pciids) / 2 + dw 0x2972 ; i946qz (i965g) + dw 0x2982 ; g35g (i965g) + dw 0x2992 ; i965q (i965g) + dw 0x29a2 ; i965g + dw 0x29b2 ; q35g + dw 0x29c2 ; g33g + dw 0x29d2 ; q33g + dw 0xa001 ; pineview + dw 0xa011 ; pineview +gen4_start = ($ - pciids) / 2 + dw 0x2a02 ; i965gm + dw 0x2a12 ; i965gm + dw 0x2a42 ; gm45 + dw 0x2e02 ; g45 + dw 0x2e12 ; g45 + dw 0x2e22 ; g45 + dw 0x2e32 ; g45 + dw 0x2e42 ; g45 + dw 0x2e92 ; g45 +ironlake_start = ($ - pciids) / 2 + dw 0x0042 ; ironlake_d + dw 0x0046 ; ironlake_m + dw 0x0102 ; sandybridge_d + dw 0x0112 ; sandybridge_d + dw 0x0122 ; sandybridge_d + dw 0x0106 ; sandybridge_m + dw 0x0116 ; sandybridge_m + dw 0x0126 ; sandybridge_m + dw 0x010A ; sandybridge_d +pciids_num = ($ - pciids) / 2 + +align 4 +deviceType dd ? +edid rb 0x80 diff --git a/kernel/trunk/const.inc b/kernel/trunk/const.inc index 2bdfc519ad..21cd3e0ea2 100644 --- a/kernel/trunk/const.inc +++ b/kernel/trunk/const.inc @@ -619,6 +619,28 @@ struct COFF_SYM NumAuxSymbols db ? ends +struct STRIPPED_PE_HEADER + Signature dw ? + Characteristics dw ? + AddressOfEntryPoint dd ? + ImageBase dd ? + SectionAlignmentLog db ? + FileAlignmentLog db ? + MajorOSVersion db ? + MinorOSVersion db ? + SizeOfImage dd ? + SizeOfStackReserve dd ? + SizeOfHeapReserve dd ? + SizeOfHeaders dd ? + Subsystem db ? + NumberOfRvaAndSizes db ? + NumberOfSections dw ? +ends +STRIPPED_PE_SIGNATURE = 0x4503 ; 'PE' xor 'S' +SPE_DIRECTORY_IMPORT = 0 +SPE_DIRECTORY_EXPORT = 1 +SPE_DIRECTORY_BASERELOC = 2 + struct IOCTL handle dd ? io_code dd ? diff --git a/kernel/trunk/core/dll.inc b/kernel/trunk/core/dll.inc index fc71e779b3..203df8abce 100644 --- a/kernel/trunk/core/dll.inc +++ b/kernel/trunk/core/dll.inc @@ -917,6 +917,8 @@ proc load_driver stdcall, driver_name:dword test eax, eax jz .exit + lea edx, [file_name] + DEBUGF 1,'K : driver %s is COFF, deprecated\n',edx mov [coff], eax movzx ecx, [eax+COFF_HEADER.nSections] diff --git a/kernel/trunk/core/peload.inc b/kernel/trunk/core/peload.inc index fa4fbcd4c2..66236e2c96 100644 --- a/kernel/trunk/core/peload.inc +++ b/kernel/trunk/core/peload.inc @@ -24,15 +24,30 @@ proc load_PE stdcall, file_name:dword mov [image], eax - mov edx, [eax+60] + mov edx, [eax+STRIPPED_PE_HEADER.SizeOfImage] +; mov cl, [eax+STRIPPED_PE_HEADER.Subsystem] + cmp word [eax], STRIPPED_PE_SIGNATURE + jz @f - stdcall kernel_alloc, [eax+80+edx] + mov edx, [eax+60] +; mov cl, [eax+5Ch+edx] + mov edx, [eax+80+edx] + +@@: + mov [entry], 0 +; cmp cl, 1 +; jnz .cleanup + stdcall kernel_alloc, edx test eax, eax jz .cleanup mov [base], eax - stdcall map_PE, eax, [image] + push ebx ebp + mov ebx, [image] + mov ebp, eax + call map_PE + pop ebp ebx mov [entry], eax test eax, eax @@ -48,199 +63,200 @@ proc load_PE stdcall, file_name:dword ret endp -DWORD equ dword -PTR equ - -align 4 -map_PE: ;stdcall base:dword, image:dword - cld - push ebp +map_PE: ;ebp=base:dword, ebx=image:dword push edi push esi - push ebx - sub esp, 60 - mov ebx, DWORD PTR [esp+84] - mov ebp, DWORD PTR [esp+80] - mov edx, ebx - mov esi, ebx - add edx, DWORD PTR [ebx+60] - mov edi, ebp - mov DWORD PTR [esp+32], edx - mov ecx, DWORD PTR [edx+84] + sub esp, .locals_size +virtual at esp +.numsections dd ? +.import_names dd ? +.import_targets dd ? +.peheader dd ? +.bad_import dd ? +.import_idx dd ? +.import_descr dd ? +.relocs_rva dd ? +.relocs_size dd ? +.section_header_size dd ? +.AddressOfEntryPoint dd ? +.ImageBase dd ? +.locals_size = $ - esp +end virtual + cmp word [ebx], STRIPPED_PE_SIGNATURE + jz .stripped + mov edx, ebx + add edx, [ebx+60] + movzx eax, word [edx+6] + mov [.numsections], eax + mov eax, [edx+40] + mov [.AddressOfEntryPoint], eax + mov eax, [edx+52] + mov [.ImageBase], eax + mov ecx, [edx+84] + mov [.section_header_size], 40 + mov eax, [edx+128] + mov [.import_descr], eax + mov eax, [edx+160] + mov [.relocs_rva], eax + mov eax, [edx+164] + mov [.relocs_size], eax + add edx, 256 + + jmp .common +.stripped: + mov eax, [ebx+STRIPPED_PE_HEADER.AddressOfEntryPoint] + mov [.AddressOfEntryPoint], eax + mov eax, [ebx+STRIPPED_PE_HEADER.ImageBase] + mov [.ImageBase], eax + movzx eax, [ebx+STRIPPED_PE_HEADER.NumberOfSections] + mov [.numsections], eax + movzx ecx, [ebx+STRIPPED_PE_HEADER.NumberOfRvaAndSizes] + xor eax, eax + mov [.relocs_rva], eax + mov [.relocs_size], eax + test ecx, ecx + jz @f + mov eax, [ebx+sizeof.STRIPPED_PE_HEADER+SPE_DIRECTORY_IMPORT*8] +@@: + mov [.import_descr], eax + cmp ecx, SPE_DIRECTORY_BASERELOC + jbe @f + mov eax, [ebx+sizeof.STRIPPED_PE_HEADER+SPE_DIRECTORY_BASERELOC*8] + mov [.relocs_rva], eax + mov eax, [ebx+sizeof.STRIPPED_PE_HEADER+SPE_DIRECTORY_BASERELOC*8+4] + mov [.relocs_size], eax +@@: + mov [.section_header_size], 28 + lea edx, [ebx+ecx*8+sizeof.STRIPPED_PE_HEADER+8] + mov ecx, [ebx+STRIPPED_PE_HEADER.SizeOfHeaders] + +.common: + mov esi, ebx + mov edi, ebp shr ecx, 2 rep movsd - movzx eax, WORD PTR [edx+6] - mov DWORD PTR [esp+36], 0 - mov DWORD PTR [esp+16], eax - jmp L2 -L3: - mov eax, DWORD PTR [edx+264] + cmp [.numsections], 0 + jz .nosections +.copy_sections: + mov eax, [edx+8] test eax, eax - je L4 + je .no_section_data mov esi, ebx mov edi, ebp - add esi, DWORD PTR [edx+268] + add esi, [edx+12] mov ecx, eax - add edi, DWORD PTR [edx+260] + add edi, [edx+4] add ecx, 3 shr ecx, 2 rep movsd -L4: - mov ecx, DWORD PTR [edx+256] +.no_section_data: + mov ecx, [edx] cmp ecx, eax - jbe L6 + jbe .no_section_fill sub ecx, eax - add eax, DWORD PTR [edx+260] + add eax, [edx+4] lea edi, [eax+ebp] xor eax, eax rep stosb -L6: - inc DWORD PTR [esp+36] - add edx, 40 -L2: - mov esi, DWORD PTR [esp+16] - cmp DWORD PTR [esp+36], esi - jne L3 - mov edi, DWORD PTR [esp+32] - cmp DWORD PTR [edi+164], 0 - je L9 - pushd [edi+164] +.no_section_fill: + add edx, [.section_header_size] + dec [.numsections] + jnz .copy_sections +.nosections: + cmp [.relocs_size], 0 + je .no_relocations mov esi, ebp mov ecx, ebp - sub esi, DWORD PTR [edi+52] - add ecx, DWORD PTR [edi+160] - mov eax, esi - shr eax, 16 - mov DWORD PTR [esp+16], eax -L12: - mov eax, [ecx+4] - sub [esp], eax - lea ebx, [eax-8] - xor edi, edi + sub esi, [.ImageBase] + add ecx, [.relocs_rva] +.relocs_block: + mov edi, [ecx] + add edi, ebp + mov ebx, [ecx+4] + add ecx, 8 + sub [.relocs_size], ebx + sub ebx, 8 shr ebx, 1 - jmp L13 -L14: - movzx eax, WORD PTR [ecx+8+edi*2] + jz .relocs_next_block +.one_reloc: + movzx eax, word [ecx] + add ecx, 2 mov edx, eax shr eax, 12 and edx, 4095 - add edx, DWORD PTR [ecx] - cmp ax, 2 - je L17 - cmp ax, 3 - je L18 - dec ax - jne L15 - mov eax, DWORD PTR [esp+16] - add WORD PTR [edx+ebp], ax -L17: - add WORD PTR [edx+ebp], si -L18: - add DWORD PTR [edx+ebp], esi -L15: - inc edi -L13: - cmp edi, ebx - jne L14 - add ecx, DWORD PTR [ecx+4] -L11: - cmp dword [esp], 0 - jg L12 - pop eax -L9: - mov edx, DWORD PTR [esp+32] - cmp DWORD PTR [edx+132], 0 - je L20 - mov eax, ebp - add eax, DWORD PTR [edx+128] - mov DWORD PTR [esp+40], 0 - add eax, 20 - mov DWORD PTR [esp+56], eax -L22: - mov ecx, DWORD PTR [esp+56] - cmp DWORD PTR [ecx-16], 0 - jne L23 - cmp DWORD PTR [ecx-8], 0 - je L25 -L23: - mov edi, DWORD PTR [__exports+32] - mov esi, DWORD PTR [__exports+28] - mov eax, DWORD PTR [esp+56] - mov DWORD PTR [esp+20], edi - add edi, OS_BASE - add esi, OS_BASE - mov DWORD PTR [esp+44], esi - mov ecx, DWORD PTR [eax-4] - mov DWORD PTR [esp+48], edi - mov edx, DWORD PTR [eax-20] + cmp eax, 3 + jne @f + add [edx+edi], esi +@@: + dec ebx + jnz .one_reloc +.relocs_next_block: + cmp [.relocs_size], 0 + jg .relocs_block +.no_relocations: + cmp [.import_descr], 0 + je .no_imports + add [.import_descr], ebp + mov [.bad_import], 0 +.import_block: + mov ecx, [.import_descr] + cmp dword [ecx+4], 0 + jne @f + cmp dword [ecx+12], 0 + je .done_imports +@@: + mov edx, dword [ecx] + mov ecx, dword [ecx+16] test edx, edx jnz @f mov edx, ecx @@: - mov DWORD PTR [esp+52], 0 + mov [.import_idx], 0 add ecx, ebp add edx, ebp - mov DWORD PTR [esp+24], edx - mov DWORD PTR [esp+28], ecx -L26: - mov esi, DWORD PTR [esp+52] - mov edi, DWORD PTR [esp+24] - mov eax, DWORD PTR [edi+esi*4] + mov [.import_names], edx + mov [.import_targets], ecx +.import_func: + mov esi, [.import_idx] + mov edi, [.import_names] + mov eax, [edi+esi*4] test eax, eax - je L27 - test eax, eax - js L27 + je .next_import_block + js .next_import_block lea edi, [ebp+eax] - mov eax, DWORD PTR [esp+28] - mov DWORD PTR [eax+esi*4], 0 + mov eax, [.import_targets] + mov dword [eax+esi*4], 0 lea esi, [edi+2] - push eax + movzx ebx, word [edi] push 32 - movzx eax, WORD PTR [edi] - mov edx, DWORD PTR [esp+56] - mov eax, DWORD PTR [edx+eax*4] + mov ecx, [__exports+32] + mov eax, [ecx+OS_BASE+ebx*4] add eax, OS_BASE push eax push esi call strncmp - pop ebx + test eax, eax + jz .import_func_found xor ebx, ebx - test eax, eax - jne L32 - jmp L30 -L33: - push ecx +.import_func_candidate: push 32 - mov ecx, DWORD PTR [esp+28] - mov eax, DWORD PTR [ecx+OS_BASE+ebx*4] + mov ecx, [__exports+32] + mov eax, [ecx+OS_BASE+ebx*4] add eax, OS_BASE push eax push esi call strncmp - pop edx test eax, eax - jne L34 - mov esi, DWORD PTR [esp+44] - mov edx, DWORD PTR [esp+52] - mov ecx, DWORD PTR [esp+28] - mov eax, DWORD PTR [esi+ebx*4] - add eax, OS_BASE - mov DWORD PTR [ecx+edx*4], eax - jmp L36 -L34: + je .import_func_found inc ebx -L32: - cmp ebx, DWORD PTR [__exports+24] - jb L33 -L36: - cmp ebx, DWORD PTR [__exports+24] - jne L37 + cmp ebx, [__exports+24] + jb .import_func_candidate mov esi, msg_unresolved call sys_msg_board_str @@ -249,34 +265,30 @@ L36: mov esi, msg_CR call sys_msg_board_str - mov DWORD PTR [esp+40], 1 - jmp L37 -L30: - movzx eax, WORD PTR [edi] - mov esi, DWORD PTR [esp+44] - mov edi, DWORD PTR [esp+52] - mov edx, DWORD PTR [esp+28] - mov eax, DWORD PTR [esi+eax*4] + mov [.bad_import], 1 + jmp .next_import_func +.import_func_found: + mov esi, [__exports+28] + mov edx, [.import_idx] + mov ecx, [.import_targets] + mov eax, [esi+OS_BASE+ebx*4] add eax, OS_BASE - mov DWORD PTR [edx+edi*4], eax -L37: - inc DWORD PTR [esp+52] - jmp L26 -L27: - add DWORD PTR [esp+56], 20 - jmp L22 -L25: + mov [ecx+edx*4], eax +.next_import_func: + inc [.import_idx] + jmp .import_func +.next_import_block: + add [.import_descr], 20 + jmp .import_block +.done_imports: xor eax, eax - cmp DWORD PTR [esp+40], 0 - jne L40 -L20: - mov ecx, DWORD PTR [esp+32] + cmp [.bad_import], 0 + jne @f +.no_imports: mov eax, ebp - add eax, DWORD PTR [ecx+40] -L40: - add esp, 60 - pop ebx + add eax, [.AddressOfEntryPoint] +@@: + add esp, .locals_size pop esi pop edi - pop ebp - ret 8 + ret diff --git a/kernel/trunk/data32.inc b/kernel/trunk/data32.inc index a309e9072f..cf1ac24cba 100644 --- a/kernel/trunk/data32.inc +++ b/kernel/trunk/data32.inc @@ -150,7 +150,7 @@ msg_CR db 13,10,0 szHwMouse db 'ATI2D',0 szPS2MDriver db 'PS2MOUSE',0 ;szCOM_MDriver db 'COM_MOUSE',0 -szVidintel db 'vidintel',0 +szVidintel db '/rd/1/drivers/vidintel.sys',0 szUSB db 'USB',0 szAtiHW db '/rd/1/drivers/ati2d.drv',0 diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 7de1ea3052..4a88ed5f9d 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -918,7 +918,7 @@ end if include "detect/vortex86.inc" ; Vortex86 SoC detection code - stdcall load_driver, szVidintel + stdcall load_pe_driver, szVidintel, 0 call usb_init