diff options
author | Volker Ruppert <info@vruppert.de> | 2004-07-07 16:08:13 +0000 |
---|---|---|
committer | Volker Ruppert <info@vruppert.de> | 2004-07-07 16:08:13 +0000 |
commit | cb9942ae45ef262cd3f235c6a1ce54dfae2f2ba2 (patch) | |
tree | 2a3af5467d2b5ca328f6a2c0f4d39b4c1e0b1242 | |
parent | 31636b4178cd38528fe648a171222f7f686d7c39 (diff) | |
download | vgabios-cb9942ae45ef262cd3f235c6a1ce54dfae2f2ba2.tar.gz |
- biossums utility for the Bochs BIOS adapted for the LGPL'd VGABIOS
- VESA3 PMINFO checksum calculated in the source
- 24 bpp mode entries fixed (patch from Fabrice Bellard)
-rw-r--r-- | Makefile | 11 | ||||
-rw-r--r-- | biossums.c | 200 | ||||
-rw-r--r-- | clext.c | 13 |
3 files changed, 216 insertions, 8 deletions
@@ -13,12 +13,12 @@ VGABIOS_DATE = "-DVGABIOS_DATE=\"$(RELDATE)\"" all: bios cirrus-bios -bios: vgabios.bin vgabios.debug.bin +bios: biossums vgabios.bin vgabios.debug.bin cirrus-bios: vgabios-cirrus.bin vgabios-cirrus.debug.bin clean: - /bin/rm -f *.o *.s *.ld86 \ + /bin/rm -f biossums *.o *.s *.ld86 \ temp.awk.* vgabios*.orig _vgabios_* _vgabios-debug_* core vgabios*.bin vgabios*.txt $(RELEASE).bin *.bak dist-clean: clean @@ -38,6 +38,7 @@ vgabios.bin: vgabios.c vgabios.h vgafonts.h vgatables.h vbe.h vbe.c vbetables.h as86 _vgabios_.s -b vgabios.bin -u -w- -g -0 -j -O -l vgabios.txt rm -f _vgabios_.s _vgabios_.c vgabios.s mv vgabios.bin VGABIOS-lgpl-latest.bin + ./biossums VGABIOS-lgpl-latest.bin ls -l VGABIOS-lgpl-latest.bin vgabios.debug.bin: vgabios.c vgabios.h vgafonts.h vgatables.h vbe.h vbe.c vbetables.h @@ -47,6 +48,7 @@ vgabios.debug.bin: vgabios.c vgabios.h vgafonts.h vgatables.h vbe.h vbe.c vbetab as86 _vgabios-debug_.s -b vgabios.debug.bin -u -w- -g -0 -j -O -l vgabios.debug.txt rm -f _vgabios-debug_.s _vgabios-debug_.c vgabios-debug.s mv vgabios.debug.bin VGABIOS-lgpl-latest.debug.bin + ./biossums VGABIOS-lgpl-latest.debug.bin ls -l VGABIOS-lgpl-latest.debug.bin vgabios-cirrus.bin: vgabios.c vgabios.h vgafonts.h vgatables.h clext.c @@ -56,6 +58,7 @@ vgabios-cirrus.bin: vgabios.c vgabios.h vgafonts.h vgatables.h clext.c as86 _vgabios-cirrus_.s -b vgabios-cirrus.bin -u -w- -g -0 -j -O -l vgabios.cirrus.txt rm -f _vgabios-cirrus_.s _vgabios-cirrus_.c vgabios-cirrus.s mv vgabios-cirrus.bin VGABIOS-lgpl-latest.cirrus.bin + ./biossums VGABIOS-lgpl-latest.cirrus.bin ls -l VGABIOS-lgpl-latest.cirrus.bin vgabios-cirrus.debug.bin: vgabios.c vgabios.h vgafonts.h vgatables.h clext.c @@ -65,4 +68,8 @@ vgabios-cirrus.debug.bin: vgabios.c vgabios.h vgafonts.h vgatables.h clext.c as86 _vgabios-cirrus-debug_.s -b vgabios.cirrus.debug.bin -u -w- -g -0 -j -O -l vgabios.cirrus.debug.txt rm -f _vgabios-cirrus-debug_.s _vgabios-cirrus-debug_.c vgabios-cirrus-debug.s mv vgabios.cirrus.debug.bin VGABIOS-lgpl-latest.cirrus.debug.bin + ./biossums VGABIOS-lgpl-latest.cirrus.debug.bin ls -l VGABIOS-lgpl-latest.cirrus.debug.bin + +biossums: biossums.c + gcc -o biossums biossums.c diff --git a/biossums.c b/biossums.c new file mode 100644 index 0000000..bb1d0ad --- /dev/null +++ b/biossums.c @@ -0,0 +1,200 @@ +/* biossums.c --- written by Eike W. for the Bochs BIOS */ +/* adapted for the LGPL'd VGABIOS by vruppert */ + +#include <stdlib.h> +#include <stdio.h> + +typedef unsigned char byte; + +void check( int value, char* message ); + +#define LEN_BIOS_DATA 0x8000 +#define MAX_OFFSET (LEN_BIOS_DATA - 1) + + +#define BIOS_OFFSET 0x7FFF + +long chksum_bios_get_offset( byte* data, long offset ); +byte chksum_bios_calc_value( byte* data, long offset ); +byte chksum_bios_get_value( byte* data, long offset ); +void chksum_bios_set_value( byte* data, long offset, byte value ); + + +#define PMID_LEN 20 +#define PMID_CHKSUM 19 + +long chksum_pmid_get_offset( byte* data, long offset ); +byte chksum_pmid_calc_value( byte* data, long offset ); +byte chksum_pmid_get_value( byte* data, long offset ); +void chksum_pmid_set_value( byte* data, long offset, byte value ); + + +byte bios_data[LEN_BIOS_DATA]; + + +int main( int argc, char* argv[] ) { + + FILE* stream; + long offset, tmp_offset; + byte cur_val = 0, new_val = 0; + int hits; + + + if( argc != 2 ) { + printf( "Error. Need a file-name as an argument.\n" ); + exit( EXIT_FAILURE ); + } + + if(( stream = fopen( argv[1], "rb" )) == NULL ) { + printf( "Error opening %s for reading.\n", argv[1] ); + exit( EXIT_FAILURE ); + } + if( fread( bios_data, 1, LEN_BIOS_DATA, stream ) >= LEN_BIOS_DATA ) { + printf( "Error reading max. 32767 Bytes from %s.\n", argv[1] ); + fclose( stream ); + exit( EXIT_FAILURE ); + } + fclose( stream ); + + hits = 0; + offset = 0L; + while( (tmp_offset = chksum_pmid_get_offset( bios_data, offset )) != -1L ) { + offset = tmp_offset; + cur_val = chksum_pmid_get_value( bios_data, offset ); + new_val = chksum_pmid_calc_value( bios_data, offset ); + printf( "\nPMID entry at: 0x%4lX\n", offset ); + printf( "Current checksum: 0x%02X\n", cur_val ); + printf( "Calculated checksum: 0x%02X ", new_val ); + hits++; + } + if( hits == 1 && cur_val != new_val ) { + printf( "Setting checksum." ); + chksum_pmid_set_value( bios_data, offset, new_val ); + } + if( hits >= 2 ) { + printf( "Multiple PMID entries! No checksum set." ); + } + if( hits ) { + printf( "\n" ); + } + + + offset = 0L; + offset = chksum_bios_get_offset( bios_data, offset ); + cur_val = chksum_bios_get_value( bios_data, offset ); + new_val = chksum_bios_calc_value( bios_data, offset ); + printf( "\nBios checksum at: 0x%4lX\n", offset ); + printf( "Current checksum: 0x%02X\n", cur_val ); + printf( "Calculated checksum: 0x%02X ", new_val ); + if( cur_val != new_val ) { + printf( "Setting checksum." ); + chksum_bios_set_value( bios_data, offset, new_val ); + } + printf( "\n" ); + + + if(( stream = fopen( argv[1], "wb" )) == NULL ) { + printf( "Error opening %s for writing.\n", argv[1] ); + exit( EXIT_FAILURE ); + } + if( fwrite( bios_data, 1, LEN_BIOS_DATA, stream ) < LEN_BIOS_DATA ) { + printf( "Error writing 32KBytes to %s.\n", argv[1] ); + fclose( stream ); + exit( EXIT_FAILURE ); + } + fclose( stream ); + + return( EXIT_SUCCESS ); +} + + +void check( int okay, char* message ) { + + if( !okay ) { + printf( "\n\nError. %s.\n", message ); + exit( EXIT_FAILURE ); + } +} + + +long chksum_bios_get_offset( byte* data, long offset ) { + + return( BIOS_OFFSET ); +} + + +byte chksum_bios_calc_value( byte* data, long offset ) { + + int i; + byte sum; + + sum = 0; + for( i = 0; i < MAX_OFFSET; i++ ) { + sum = sum + *( data + i ); + } + sum = -sum; /* iso ensures -s + s == 0 on unsigned types */ + return( sum ); +} + + +byte chksum_bios_get_value( byte* data, long offset ) { + + return( *( data + BIOS_OFFSET ) ); +} + + +void chksum_bios_set_value( byte* data, long offset, byte value ) { + + *( data + BIOS_OFFSET ) = value; +} + + +byte chksum_pmid_calc_value( byte* data, long offset ) { + + int i; + int len; + byte sum; + + len = PMID_LEN; + check( offset + len <= MAX_OFFSET, "PMID entry length out of bounds" ); + sum = 0; + for( i = 0; i < len; i++ ) { + if( i != PMID_CHKSUM ) { + sum = sum + *( data + offset + i ); + } + } + sum = -sum; + return( sum ); +} + + +long chksum_pmid_get_offset( byte* data, long offset ) { + + long result = -1L; + + while( offset + PMID_LEN < MAX_OFFSET ) { + offset = offset + 1; + if( *( data + offset + 0 ) == 'P' && \ + *( data + offset + 1 ) == 'M' && \ + *( data + offset + 2 ) == 'I' && \ + *( data + offset + 3 ) == 'D' ) { + result = offset; + break; + } + } + return( result ); +} + + +byte chksum_pmid_get_value( byte* data, long offset ) { + + check( offset + PMID_CHKSUM <= MAX_OFFSET, "PMID checksum out of bounds" ); + return( *( data + offset + PMID_CHKSUM ) ); +} + + +void chksum_pmid_set_value( byte* data, long offset, byte value ) { + + check( offset + PMID_CHKSUM <= MAX_OFFSET, "PMID checksum out of bounds" ); + *( data + offset + PMID_CHKSUM ) = value; +} @@ -244,10 +244,10 @@ cirrus_mode_t cirrus_modes[] = cseq_1024x768x16,cgraph_svgacolor,ccrtc_1024x768x16,16, 6,5,10,5,5,5,0,1,15}, - {0xe0,800,600,24,0xe5, + {0x78,800,600,24,0xe5, cseq_800x600x24,cgraph_svgacolor,ccrtc_800x600x24,24, 6,8,16,8,8,8,0,0,0}, - {0xe1,1024,768,24,0xe5, + {0x79,1024,768,24,0xe5, cseq_1024x768x24,cgraph_svgacolor,ccrtc_1024x768x24,24, 6,8,16,8,8,8,0,0,0}, @@ -283,7 +283,7 @@ unsigned short cirrus_vesa_modelist[] = { // 800x600x16 0x114, 0x65, // 800x600x24 - 0x115, 0xe0, + 0x115, 0x78, // 1024x768x8 0x105, 0x60, // 1024x768x15 @@ -291,7 +291,7 @@ unsigned short cirrus_vesa_modelist[] = { // 1024x768x16 0x117, 0x74, // 1024x768x24 -//0x118, 0xe1, +//0x118, 0x79, // invalid 0xffff,0xffff }; @@ -1517,8 +1517,9 @@ cirrus_vesa_selB800_data: cirrus_vesa_selC000_data: dw 0xC000 ;; sel_C0000 cirrus_vesa_is_protected_mode: - db 0x00 ;; is_protected_mode - db 0x00 ;; check_sum + ;; protected mode flag and checksum + dw (~((0xf2 + (cirrus_vesa_pmbios_entry >> 8) + (cirrus_vesa_pmbios_entry) \ + + (cirrus_vesa_pmbios_init >> 8) + (cirrus_vesa_pmbios_init)) & 0xff) << 8) + 0x01 ASM_END #endif // CIRRUS_VESA3_PMINFO |