diff options
author | nsdahya1 <nsdahya1> | 1999-07-21 15:35:30 +0000 |
---|---|---|
committer | nsdahya1 <nsdahya1> | 1999-07-21 15:35:30 +0000 |
commit | 060b6f0b7aa5aca1df5d083ca0948c9ef05378e1 (patch) | |
tree | 98591fa5caa12ebcf4478dd9b9929db3b5c1e175 /ddcprobe | |
parent | 498e41d697d7c915f28fdb9fb1d18145a665ade9 (diff) | |
download | anaconda-060b6f0b7aa5aca1df5d083ca0948c9ef05378e1.tar.gz anaconda-060b6f0b7aa5aca1df5d083ca0948c9ef05378e1.tar.xz anaconda-060b6f0b7aa5aca1df5d083ca0948c9ef05378e1.zip |
update
Diffstat (limited to 'ddcprobe')
-rw-r--r-- | ddcprobe/vbe.c | 113 |
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(®s, 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, ®s, ram); + if((regs.eax & 0xff) != 0x4f) { + fprintf(stderr, "Get SuperVGA Video State not supported.\n"); + dump_regs(®s); + vm86_ram_free(ram); + return NULL; + } + if((regs.eax & 0xffff) != 0x004f) { + fprintf(stderr, "Get SuperVGA Video State Info failed.\n"); + dump_regs(®s); + vm86_ram_free(ram); + return NULL; + } + + block_size = 64 * (regs.ebx & 0xffff); + memset(®s, 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, ®s, ram); + if((regs.eax & 0xffff) != 0x004f) { + fprintf(stderr, "Get SuperVGA Video State Save failed.\n"); + dump_regs(®s); + 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(®s, 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, ®s, ram); + if((regs.eax & 0xff) != 0x4f) { + fprintf(stderr, "Get SuperVGA Video State not supported.\n"); + dump_regs(®s); + vm86_ram_free(ram); + return; + } + if((regs.eax & 0xffff) != 0x004f) { + fprintf(stderr, "Get SuperVGA Video State Info failed.\n"); + dump_regs(®s); + vm86_ram_free(ram); + return; + } + + block_size = 64 * (regs.ebx & 0xffff); + memset(®s, 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, ®s, ram); + if((regs.eax & 0xffff) != 0x004f) { + fprintf(stderr, "Get SuperVGA Video State Restore failed.\n"); + dump_regs(®s); + vm86_ram_free(ram); + return; + } +} |