Do not map full 0-1MB legacy range
If we're mapping something in the "legacy range" (0-1Mb), we shouldn't expand the requested range to the entire 0-1Mb range. Typically this is for mapping the VGA frame buffer, and some platforms support mmap of the frame buffer but not the entire 0-1Mb range. For example, HP sx1000 and sx2000 ia64 platforms can have memory from 0-0x9ffff, VGA frame buffer from 0xa0000-0xbffff, and memory from 0xc0000-0xfffff. On these platforms, we can't map the entire 0-1Mb range with the same attribute because the memory only supports WB, while the frame buffer supports only UC. But an mmap of just the frame buffer should work fine.
This commit is contained in:
parent
c1828a8ff5
commit
bd0c829654
|
@ -627,7 +627,6 @@ linuxMapPci(int ScreenNum, int Flags, PCITAG Tag,
|
|||
|
||||
#define MAX_DOMAINS 257
|
||||
static pointer DomainMmappedIO[MAX_DOMAINS];
|
||||
static pointer DomainMmappedMem[MAX_DOMAINS];
|
||||
|
||||
static int
|
||||
linuxOpenLegacy(PCITAG Tag, char *name)
|
||||
|
@ -685,6 +684,7 @@ xf86MapDomainMemory(int ScreenNum, int Flags, PCITAG Tag,
|
|||
{
|
||||
int domain = xf86GetPciDomain(Tag);
|
||||
int fd;
|
||||
pointer addr;
|
||||
|
||||
/*
|
||||
* We use /proc/bus/pci on non-legacy addresses or if the Linux sysfs
|
||||
|
@ -698,20 +698,14 @@ xf86MapDomainMemory(int ScreenNum, int Flags, PCITAG Tag,
|
|||
return linuxMapPci(ScreenNum, Flags, Tag, Base, Size,
|
||||
PCIIOC_MMAP_IS_MEM);
|
||||
|
||||
|
||||
/* If we haven't already mapped this legacy space, try to. */
|
||||
if (!DomainMmappedMem[domain]) {
|
||||
DomainMmappedMem[domain] = mmap(NULL, 1024*1024, PROT_READ|PROT_WRITE,
|
||||
MAP_SHARED, fd, 0);
|
||||
if (DomainMmappedMem[domain] == MAP_FAILED) {
|
||||
close(fd);
|
||||
perror("mmap failure");
|
||||
FatalError("xf86MapDomainMem(): mmap() failure\n");
|
||||
}
|
||||
addr = mmap(NULL, Size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, Base);
|
||||
if (addr == MAP_FAILED) {
|
||||
close (fd);
|
||||
perror("mmap failure");
|
||||
FatalError("xf86MapDomainMem(): mmap() failure\n");
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return (pointer)((char *)DomainMmappedMem[domain] + Base);
|
||||
return addr;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue
Block a user