aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Ruppert <info@vruppert.de>2004-07-07 16:08:13 +0000
committerVolker Ruppert <info@vruppert.de>2004-07-07 16:08:13 +0000
commitcb9942ae45ef262cd3f235c6a1ce54dfae2f2ba2 (patch)
tree2a3af5467d2b5ca328f6a2c0f4d39b4c1e0b1242
parent31636b4178cd38528fe648a171222f7f686d7c39 (diff)
downloadvgabios-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--Makefile11
-rw-r--r--biossums.c200
-rw-r--r--clext.c13
3 files changed, 216 insertions, 8 deletions
diff --git a/Makefile b/Makefile
index 7e6633f..9138c55 100644
--- a/Makefile
+++ b/Makefile
@@ -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;
+}
diff --git a/clext.c b/clext.c
index d842add..e0ff9ac 100644
--- a/clext.c
+++ b/clext.c
@@ -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