summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTiago Vignatti <tiago.vignatti@nokia.com>2010-01-07 21:01:56 +0200
committerTiago Vignatti <tiago.vignatti@nokia.com>2010-01-07 21:01:56 +0200
commit8eeb20448be970a52dd689b6c8b0b89a334053d9 (patch)
treef5a7195dff48cf734b11a72fab10a1d6c0f55a79
parent9e86fc16c05f13d71656313e04897765e6ddced3 (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.c24
-rw-r--r--src/lrmi/backend-x86emu.c35
-rw-r--r--src/lrmi/common_helper.c41
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);
+}
+