summaryrefslogtreecommitdiffstats
path: root/ddcprobe
diff options
context:
space:
mode:
authornsdahya1 <nsdahya1>1999-07-21 15:35:30 +0000
committernsdahya1 <nsdahya1>1999-07-21 15:35:30 +0000
commit060b6f0b7aa5aca1df5d083ca0948c9ef05378e1 (patch)
tree98591fa5caa12ebcf4478dd9b9929db3b5c1e175 /ddcprobe
parent498e41d697d7c915f28fdb9fb1d18145a665ade9 (diff)
downloadanaconda-060b6f0b7aa5aca1df5d083ca0948c9ef05378e1.tar.gz
anaconda-060b6f0b7aa5aca1df5d083ca0948c9ef05378e1.tar.xz
anaconda-060b6f0b7aa5aca1df5d083ca0948c9ef05378e1.zip
update
Diffstat (limited to 'ddcprobe')
-rw-r--r--ddcprobe/vbe.c113
1 files changed, 112 insertions, 1 deletions
diff --git a/ddcprobe/vbe.c b/ddcprobe/vbe.c
index 23bec4fd8..30beb7089 100644
--- a/ddcprobe/vbe.c
+++ b/ddcprobe/vbe.c
@@ -235,7 +235,7 @@ int32_t vbe_get_mode()
/* Save the returned value. */
if((regs.eax & 0xffff) == 0x004f) {
- ret = regs.ebx && 0xffff;
+ ret = regs.ebx & 0xffff;
} else {
ret = -1;
}
@@ -504,3 +504,114 @@ struct vbe_modeline *vbe_get_edid_modelines()
return ret;
}
+
+const void *vbe_save_svga_state()
+{
+ struct vm86_regs regs;
+ unsigned char *ram;
+ u_int16_t block_size;
+ void *data;
+
+ memset(&regs, 0, sizeof(regs));
+ regs.eax = 0x4f04;
+ regs.ecx = 0xffff;
+ regs.edx = 0;
+
+ /* Get memory for the bios call. */
+ ram = vm86_ram_alloc();
+ if(ram == MAP_FAILED) {
+ return NULL;
+ }
+
+ /* Find out how much memory we need. */
+ bioscall(0x10, &regs, ram);
+ if((regs.eax & 0xff) != 0x4f) {
+ fprintf(stderr, "Get SuperVGA Video State not supported.\n");
+ dump_regs(&regs);
+ vm86_ram_free(ram);
+ return NULL;
+ }
+ if((regs.eax & 0xffff) != 0x004f) {
+ fprintf(stderr, "Get SuperVGA Video State Info failed.\n");
+ dump_regs(&regs);
+ vm86_ram_free(ram);
+ return NULL;
+ }
+
+ block_size = 64 * (regs.ebx & 0xffff);
+ memset(&regs, 0, sizeof(regs));
+ regs.eax = 0x4f04;
+ regs.ecx = 0x000f;
+ regs.edx = 0x0001;
+ regs.es = 0x2000;
+ regs.ebx = 0x0000;
+ memset(&ram[regs.es * 16 + regs.ebx], 0, block_size);
+ bioscall(0x10, &regs, ram);
+ if((regs.eax & 0xffff) != 0x004f) {
+ fprintf(stderr, "Get SuperVGA Video State Save failed.\n");
+ dump_regs(&regs);
+ vm86_ram_free(ram);
+ return NULL;
+ }
+
+ data = malloc(block_size);
+ if(data == NULL) {
+ vm86_ram_free(ram);
+ return NULL;
+ }
+
+ memcpy(data, &ram[regs.es * 16 + regs.ebx], block_size);
+
+ /* Clean up and return. */
+ vm86_ram_free(ram);
+ return data;
+}
+
+void vbe_restore_svga_state(const void *state)
+{
+ struct vm86_regs regs;
+ unsigned char *ram;
+ u_int16_t block_size;
+
+ memset(&regs, 0, sizeof(regs));
+ regs.eax = 0x4f04;
+ regs.ecx = 0x000f;
+ regs.edx = 0;
+
+ /* Get memory for the bios call. */
+ ram = vm86_ram_alloc();
+ if(ram == MAP_FAILED) {
+ return;
+ }
+
+ /* Find out how much memory we need. */
+ bioscall(0x10, &regs, ram);
+ if((regs.eax & 0xff) != 0x4f) {
+ fprintf(stderr, "Get SuperVGA Video State not supported.\n");
+ dump_regs(&regs);
+ vm86_ram_free(ram);
+ return;
+ }
+ if((regs.eax & 0xffff) != 0x004f) {
+ fprintf(stderr, "Get SuperVGA Video State Info failed.\n");
+ dump_regs(&regs);
+ vm86_ram_free(ram);
+ return;
+ }
+
+ block_size = 64 * (regs.ebx & 0xffff);
+ memset(&regs, 0, sizeof(regs));
+ regs.eax = 0x4f04;
+ regs.ecx = 0x000f;
+ regs.edx = 0x0002;
+ regs.es = 0x2000;
+ regs.ebx = 0x0000;
+ memcpy(&ram[regs.es * 16 + regs.ebx], state, block_size);
+ bioscall(0x10, &regs, ram);
+ if((regs.eax & 0xffff) != 0x004f) {
+ fprintf(stderr, "Get SuperVGA Video State Restore failed.\n");
+ dump_regs(&regs);
+ vm86_ram_free(ram);
+ return;
+ }
+}