summaryrefslogtreecommitdiffstats
path: root/linux
diff options
context:
space:
mode:
authornick <nick@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-10-18 15:48:51 +0000
committernick <nick@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-10-18 15:48:51 +0000
commita1856898dc460783a4e257896b29f6b8df1289ec (patch)
treeda7753237059a583337a762c47bfd118cd344c0b /linux
parent11001c41647eb13fc738657fe1d2f18adf72d1f9 (diff)
downloadmpv-a1856898dc460783a4e257896b29f6b8df1289ec.tar.bz2
mpv-a1856898dc460783a4e257896b29f6b8df1289ec.tar.xz
Fixed bug of 32-bit mode interface detection and save-restore mechanism
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2255 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'linux')
-rw-r--r--linux/vbelib.c23
-rw-r--r--linux/vbelib.h14
2 files changed, 22 insertions, 15 deletions
diff --git a/linux/vbelib.c b/linux/vbelib.c
index 1eca190ad5..77d6838c13 100644
--- a/linux/vbelib.c
+++ b/linux/vbelib.c
@@ -153,7 +153,7 @@ int vbeSaveState(void **data)
r.edx = 0x01;
r.ecx = 0x0f;
r.es = VirtToPhysSeg(rm_space);
- r.edi = VirtToPhysOff(rm_space);
+ r.ebx = VirtToPhysOff(rm_space);
if(!LRMI_int(0x10,&r))
{
LRMI_free_real(rm_space);
@@ -179,7 +179,7 @@ int vbeRestoreState(void *data)
r.edx = 0x02;
r.ecx = 0x0f;
r.es = VirtToPhysSeg(data);
- r.edi = VirtToPhysOff(data);
+ r.ebx = VirtToPhysOff(data);
retval = LRMI_int(0x10,&r);
LRMI_free_real(data);
if(!retval) return VBE_VM86_FAIL;
@@ -208,7 +208,6 @@ int vbeGetWindow(unsigned *win_num)
int vbeSetWindow(unsigned win_num,unsigned win_gran)
{
int retval;
-#if 0
if(vbe_pm_info.SetWindowCall)
{
/* 32-bit function call is much better of int 10h */
@@ -217,10 +216,10 @@ int vbeSetWindow(unsigned win_num,unsigned win_gran)
"movl %1, %%ebx\n"
::"a"(0x4f05),"S"(win_num & 0x0f),"d"(win_gran):"memory");
(*vbe_pm_info.SetWindowCall)();
- __asm __volatile("popl %%ebx":"=a"(retval)::"memory");
+ __asm __volatile("popl %%ebx":::"memory");
+ retval = VBE_OK;
}
else
-#endif
{
struct LRMI_regs r;
memset(&r,0,sizeof(struct LRMI_regs));
@@ -229,8 +228,8 @@ int vbeSetWindow(unsigned win_num,unsigned win_gran)
r.edx = win_gran;
if(!LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
retval = r.eax & 0xffff;
+ if(retval == 0x4f) retval = VBE_OK;
}
- if(retval == 0x4f) retval = VBE_OK;
return retval;
}
@@ -246,6 +245,7 @@ int vbeGetProtModeInfo(struct VesaProtModeInterface *pm_info)
{
struct LRMI_regs r;
int retval;
+ unsigned info_offset;
struct realVesaProtModeInterface *rm_info;
memset(&r,0,sizeof(struct LRMI_regs));
r.eax = 0x4f0a;
@@ -254,11 +254,12 @@ int vbeGetProtModeInfo(struct VesaProtModeInterface *pm_info)
retval = r.eax & 0xffff;
if(retval == 0x4f)
{
- rm_info = PhysToVirtSO(r.es,r.edi&0xffff);
- pm_info->SetWindowCall = PhysToVirtSO(r.es,rm_info->SetWindowCall);
- pm_info->SetDisplayStart = PhysToVirtSO(r.es,rm_info->SetDisplayStart);
- pm_info->SetPaletteData = PhysToVirtSO(r.es,rm_info->SetPaletteData);
- pm_info->iopl_ports = PhysToVirtSO(r.es,rm_info->iopl_ports);
+ info_offset = r.edi&0xffff;
+ rm_info = PhysToVirtSO(r.es,info_offset);
+ pm_info->SetWindowCall = PhysToVirtSO(r.es,info_offset+rm_info->SetWindowCall);
+ pm_info->SetDisplayStart = PhysToVirtSO(r.es,info_offset+rm_info->SetDisplayStart);
+ pm_info->SetPaletteData = PhysToVirtSO(r.es,info_offset+rm_info->SetPaletteData);
+ pm_info->iopl_ports = PhysToVirtSO(r.es,info_offset+rm_info->iopl_ports);
retval = VBE_OK;
}
return retval;
diff --git a/linux/vbelib.h b/linux/vbelib.h
index ba65c1e470..c3504aa3c9 100644
--- a/linux/vbelib.h
+++ b/linux/vbelib.h
@@ -16,6 +16,12 @@ typedef struct tagFarPtr
unsigned short seg;
}FarPtr;
+#define VBE_DAC_8BIT (1 << 0)
+#define VBE_NONVGA_CRTC (1 << 1)
+#define VBE_SNOWED_RAMDAC (1 << 2)
+#define VBE_STEREOSCOPIC (1 << 3)
+#define VBE_STEREO_EVC (1 << 4)
+
struct VbeInfoBlock {
char VESASignature[4]; /* 'VESA' 4 byte signature */
short VESAVersion; /* VBE version number */
@@ -23,7 +29,7 @@ struct VbeInfoBlock {
long Capabilities; /* Capabilities of video card */
unsigned short* VideoModePtr; /* Pointer to supported modes */
short TotalMemory; /* Number of 64kb memory blocks */
- /* VBE 3.0 and above */
+ /* VBE 2.0 and above */
short OemSoftwareRev;
char * OemVendorNamePtr;
char * OemProductNamePtr;
@@ -170,7 +176,7 @@ struct VesaProtModeInterface
void (*SetDisplayStart)(void);
void (*SetPaletteData)(void);
unsigned short * iopl_ports;
-}__attribute__ ((packed));
+};
/*
All functions below return:
@@ -183,8 +189,8 @@ struct VesaProtModeInterface
#define VBE_VM86_FAIL -1
#define VBE_OUT_OF_DOS_MEM -2
#define VBE_OUT_OF_MEM -3
-#define VBE_VESA_ERROR_MASK 0x4f00
-#define VBE_VESA_ERRCODE_MASK 0xff
+#define VBE_VESA_ERROR_MASK 0x004f
+#define VBE_VESA_ERRCODE_MASK 0xff00
extern int vbeInit( void );
extern int vbeDetroy( void );