mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-27 23:22:37 +02:00
Implement libpayload support and improve life for DOS based flashrom, too
Corresponding to flashrom svn r1181. Change the physmap* behaviour to use (void*)-1 as error code instead of NULL. That way, 1:1 mapped memory can be supported properly because (void*)0 is not a magic pointer anymore. (void*)-1 on the other hand is a rather unlikely memory offset, so that should be safe. Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de> Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
This commit is contained in:
parent
0a6f9ca171
commit
ed7a964786
@ -212,7 +212,7 @@ int coreboot_init(void)
|
|||||||
start = 0x0;
|
start = 0x0;
|
||||||
#endif
|
#endif
|
||||||
table_area = physmap_try_ro("low megabyte", start, BYTES_TO_MAP - start);
|
table_area = physmap_try_ro("low megabyte", start, BYTES_TO_MAP - start);
|
||||||
if (!table_area) {
|
if (ERROR_PTR == table_area) {
|
||||||
msg_perr("Failed getting access to coreboot low tables.\n");
|
msg_perr("Failed getting access to coreboot low tables.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -228,7 +228,7 @@ int coreboot_init(void)
|
|||||||
start &= ~(getpagesize() - 1);
|
start &= ~(getpagesize() - 1);
|
||||||
physunmap(table_area, BYTES_TO_MAP);
|
physunmap(table_area, BYTES_TO_MAP);
|
||||||
table_area = physmap_try_ro("high tables", start, BYTES_TO_MAP);
|
table_area = physmap_try_ro("high tables", start, BYTES_TO_MAP);
|
||||||
if (!table_area) {
|
if (ERROR_PTR == table_area) {
|
||||||
msg_perr("Failed getting access to coreboot "
|
msg_perr("Failed getting access to coreboot "
|
||||||
"high tables.\n");
|
"high tables.\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
2
flash.h
2
flash.h
@ -33,6 +33,8 @@
|
|||||||
#undef max
|
#undef max
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define ERROR_PTR ((void*)-1)
|
||||||
|
|
||||||
typedef unsigned long chipaddr;
|
typedef unsigned long chipaddr;
|
||||||
|
|
||||||
int register_shutdown(void (*function) (void *data), void *data);
|
int register_shutdown(void (*function) (void *data), void *data);
|
||||||
|
23
physmap.c
23
physmap.c
@ -52,11 +52,11 @@ static void *map_first_meg(unsigned long phys_addr, size_t len)
|
|||||||
realmem_map = valloc(1024 * 1024);
|
realmem_map = valloc(1024 * 1024);
|
||||||
|
|
||||||
if (!realmem_map) {
|
if (!realmem_map) {
|
||||||
return NULL;
|
return ERROR_PTR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (__djgpp_map_physical_memory(realmem_map, (1024 * 1024), 0)) {
|
if (__djgpp_map_physical_memory(realmem_map, (1024 * 1024), 0)) {
|
||||||
return NULL;
|
return ERROR_PTR;
|
||||||
}
|
}
|
||||||
|
|
||||||
return realmem_map + phys_addr;
|
return realmem_map + phys_addr;
|
||||||
@ -69,7 +69,7 @@ static void *sys_physmap(unsigned long phys_addr, size_t len)
|
|||||||
|
|
||||||
/* enable 4GB limit on DS descriptor */
|
/* enable 4GB limit on DS descriptor */
|
||||||
if (!__djgpp_nearptr_enable()) {
|
if (!__djgpp_nearptr_enable()) {
|
||||||
return NULL;
|
return ERROR_PTR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((phys_addr + len - 1) < (1024 * 1024)) {
|
if ((phys_addr + len - 1) < (1024 * 1024)) {
|
||||||
@ -82,7 +82,7 @@ static void *sys_physmap(unsigned long phys_addr, size_t len)
|
|||||||
ret = __dpmi_physical_address_mapping (&mi);
|
ret = __dpmi_physical_address_mapping (&mi);
|
||||||
|
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
return NULL;
|
return ERROR_PTR;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (void *) mi.address + __djgpp_conventional_base;
|
return (void *) mi.address + __djgpp_conventional_base;
|
||||||
@ -112,7 +112,12 @@ void physunmap(void *virt_addr, size_t len)
|
|||||||
|
|
||||||
static void *sys_physmap(unsigned long phys_addr, size_t len)
|
static void *sys_physmap(unsigned long phys_addr, size_t len)
|
||||||
{
|
{
|
||||||
return map_physical(phys_addr, len);
|
/* The short form of ?: is a GNU extension.
|
||||||
|
* FIXME: map_physical returns NULL both for errors and for success
|
||||||
|
* if the region is mapped at virtual address zero. If in doubt, report
|
||||||
|
* an error until a better interface exists.
|
||||||
|
*/
|
||||||
|
return map_physical(phys_addr, len) ? : ERROR_PTR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The OS X driver does not differentiate between mapping types. */
|
/* The OS X driver does not differentiate between mapping types. */
|
||||||
@ -151,7 +156,7 @@ static void *sys_physmap_rw_uncached(unsigned long phys_addr, size_t len)
|
|||||||
|
|
||||||
virt_addr = mmap(0, len, PROT_WRITE | PROT_READ, MAP_SHARED,
|
virt_addr = mmap(0, len, PROT_WRITE | PROT_READ, MAP_SHARED,
|
||||||
fd_mem, (off_t)phys_addr);
|
fd_mem, (off_t)phys_addr);
|
||||||
return MAP_FAILED == virt_addr ? NULL : virt_addr;
|
return MAP_FAILED == virt_addr ? ERROR_PTR : virt_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For reading DMI/coreboot/whatever tables. We should never write, and we
|
/* For reading DMI/coreboot/whatever tables. We should never write, and we
|
||||||
@ -171,7 +176,7 @@ static void *sys_physmap_ro_cached(unsigned long phys_addr, size_t len)
|
|||||||
|
|
||||||
virt_addr = mmap(0, len, PROT_READ, MAP_SHARED,
|
virt_addr = mmap(0, len, PROT_READ, MAP_SHARED,
|
||||||
fd_mem_cached, (off_t)phys_addr);
|
fd_mem_cached, (off_t)phys_addr);
|
||||||
return MAP_FAILED == virt_addr ? NULL : virt_addr;
|
return MAP_FAILED == virt_addr ? ERROR_PTR : virt_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void physunmap(void *virt_addr, size_t len)
|
void physunmap(void *virt_addr, size_t len)
|
||||||
@ -197,7 +202,7 @@ static void *physmap_common(const char *descr, unsigned long phys_addr, size_t l
|
|||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
msg_pspew("Not mapping %s, zero size at 0x%08lx.\n",
|
msg_pspew("Not mapping %s, zero size at 0x%08lx.\n",
|
||||||
descr, phys_addr);
|
descr, phys_addr);
|
||||||
return NULL;
|
return ERROR_PTR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((getpagesize() - 1) & len) {
|
if ((getpagesize() - 1) & len) {
|
||||||
@ -216,7 +221,7 @@ static void *physmap_common(const char *descr, unsigned long phys_addr, size_t l
|
|||||||
virt_addr = sys_physmap_rw_uncached(phys_addr, len);
|
virt_addr = sys_physmap_rw_uncached(phys_addr, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL == virt_addr) {
|
if (ERROR_PTR == virt_addr) {
|
||||||
if (NULL == descr)
|
if (NULL == descr)
|
||||||
descr = "memory";
|
descr = "memory";
|
||||||
msg_perr("Error accessing %s, 0x%lx bytes at 0x%08lx\n", descr, (unsigned long)len, phys_addr);
|
msg_perr("Error accessing %s, 0x%lx bytes at 0x%08lx\n", descr, (unsigned long)len, phys_addr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user