diff options
author | Tiago Vignatti <tiago.vignatti@nokia.com> | 2010-01-07 21:01:56 +0200 |
---|---|---|
committer | Tiago Vignatti <tiago.vignatti@nokia.com> | 2010-01-07 21:01:56 +0200 |
commit | 8eeb20448be970a52dd689b6c8b0b89a334053d9 (patch) | |
tree | f5a7195dff48cf734b11a72fab10a1d6c0f55a79 | |
parent | 9e86fc16c05f13d71656313e04897765e6ddced3 (diff) |
lrmi: fix vm86 and move read bios routine to common code
Signed-off-by: Tiago Vignatti <tiago.vignatti@nokia.com>
-rw-r--r-- | src/lrmi/backend-vm86.c | 24 | ||||
-rw-r--r-- | src/lrmi/backend-x86emu.c | 35 | ||||
-rw-r--r-- | src/lrmi/common_helper.c | 41 |
3 files changed, 64 insertions, 36 deletions
diff --git a/src/lrmi/backend-vm86.c b/src/lrmi/backend-vm86.c index d4539f5..da2383d 100644 --- a/src/lrmi/backend-vm86.c +++ b/src/lrmi/backend-vm86.c @@ -206,7 +206,7 @@ MapCurrentInt10(xf86Int10InfoPtr pInt) void LRMI_init(xf86Int10InfoPtr pInt) { - int fd; + int fd, err; static void* vidMem = NULL; static void* sysMem = NULL; void* vMem = NULL; @@ -316,6 +316,28 @@ LRMI_init(xf86Int10InfoPtr pInt) Int10Current = pInt; + if (read_bios(0, 0, (unsigned char *)0, LOW_PAGE_SIZE) < 0) { + fprintf(stderr, "Cannot read int vect\n"); + } + + LRMI_set_exit_condition(pInt); + + /* + * Allocate a segment for the stack + */ + LRMI_alloc_real(pInt, 1, &pInt->stackseg); + + if (pci_device_is_boot_vga(pInt->dev)) + return; + + err = pci_device_read_rom(pInt->dev, (unsigned char *)(V_BIOS)); + if (err) { + fprintf(stderr,"Cannot read V_BIOS (%s)\n", + strerror(err)); + } + + pInt->BIOSseg = V_BIOS >> 4; + return; error3: diff --git a/src/lrmi/backend-x86emu.c b/src/lrmi/backend-x86emu.c index fa90df0..9896946 100644 --- a/src/lrmi/backend-x86emu.c +++ b/src/lrmi/backend-x86emu.c @@ -230,41 +230,6 @@ void x_outl(uint16_t port, uint32_t val); void x_outb(uint16_t port, uint8_t val); void x_outw(uint16_t port, uint16_t val); -/* Stolen from Xorg code */ -int -read_bios(unsigned long Base, unsigned long Offset, unsigned char *Buf, - int Len) -{ - int fd; - unsigned char *ptr; - int psize; - int mlen; - - if ((fd = open(DEV_MEM, O_RDONLY)) < 0) - { - fprintf(stderr, "xf86ReadBIOS: Failed to open %s\n", - DEV_MEM); - return(-1); - } - psize = getpagesize(); - Offset += Base & (psize - 1); - Base &= ~(psize - 1); - mlen = (Offset + Len + psize - 1) & ~(psize - 1); - ptr = (unsigned char *)mmap((caddr_t)0, mlen, PROT_READ, - MAP_SHARED, fd, (off_t)Base); - if (ptr == MAP_FAILED) - { - fprintf(stderr, "xf86ReadBIOS: %s mmap failed\n", - DEV_MEM); - close(fd); - return(-1); - } - (void)memcpy(Buf, (void *)(ptr + Offset), Len); - (void)munmap((caddr_t)ptr, mlen); - (void)close(fd); - return(Len); -} - void LRMI_init(xf86Int10InfoPtr pInt) { diff --git a/src/lrmi/common_helper.c b/src/lrmi/common_helper.c index 8de7d14..0a47dba 100644 --- a/src/lrmi/common_helper.c +++ b/src/lrmi/common_helper.c @@ -1,10 +1,16 @@ #include <stdio.h> +#include <string.h> #include <inttypes.h> #include <pciaccess.h> #include "libx86.h" #include "common_helper.h" +#define DEV_MEM "/dev/mem" +#include <sys/stat.h> +#include <fcntl.h> +#include <sys/mman.h> + xf86Int10InfoPtr Int10Current = NULL; void @@ -100,3 +106,38 @@ int_handler(xf86Int10InfoPtr pInt) return ret; } +/* Stolen from Xorg code. TODO: do portable enough */ +int +read_bios(unsigned long Base, unsigned long Offset, unsigned char *Buf, + int Len) +{ + int fd; + unsigned char *ptr; + int psize; + int mlen; + + if ((fd = open(DEV_MEM, O_RDONLY)) < 0) + { + fprintf(stderr, "xf86ReadBIOS: Failed to open %s\n", + DEV_MEM); + return(-1); + } + psize = getpagesize(); + Offset += Base & (psize - 1); + Base &= ~(psize - 1); + mlen = (Offset + Len + psize - 1) & ~(psize - 1); + ptr = (unsigned char *)mmap((caddr_t)0, mlen, PROT_READ, + MAP_SHARED, fd, (off_t)Base); + if (ptr == MAP_FAILED) + { + fprintf(stderr, "xf86ReadBIOS: %s mmap failed\n", + DEV_MEM); + close(fd); + return(-1); + } + memcpy(Buf, (void *)(ptr + Offset), Len); + munmap((caddr_t)ptr, mlen); + close(fd); + return(Len); +} + |