MCPcopy Create free account
hub / github.com/coreboot/coreboot / cbmem_devmem_init

Function cbmem_devmem_init

util/cbmem/devmem_drv.c:354–430  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

352#endif /* defined(__arm__) || defined(__aarch64__) */
353
354bool cbmem_devmem_init(bool writeable)
355{
356 mem_fd = open("/dev/mem", writeable ? O_RDWR : O_RDONLY, 0);
357 if (mem_fd < 0) {
358 fprintf(stderr, "Failed to gain memory access: %s\n", strerror(errno));
359 return false;
360 }
361
362#if defined(__arm__) || defined(__aarch64__)
363 int addr_cells, size_cells;
364 char *coreboot_node =
365 dt_find_compat("/proc/device-tree", "coreboot", &addr_cells, &size_cells);
366
367 if (!coreboot_node) {
368 fprintf(stderr, "Could not find 'coreboot' compatible node!\n");
369 return false;
370 }
371
372 if (addr_cells < 0) {
373 fprintf(stderr, "Warning: no #address-cells node in tree!\n");
374 addr_cells = 1;
375 }
376
377 int nlen = strlen(coreboot_node);
378 char *reg = alloca(nlen + sizeof("/reg"));
379
380 strcpy(reg, coreboot_node);
381 strcpy(reg + nlen, "/reg");
382 free(coreboot_node);
383
384 int fd = open(reg, O_RDONLY);
385 if (fd < 0) {
386 perror(reg);
387 return false;
388 }
389
390 int i;
391 size_t size_to_read = addr_cells * 4 + size_cells * 4;
392 uint8_t *dtbuffer = alloca(size_to_read);
393 if (read(fd, dtbuffer, size_to_read) < 0) {
394 perror(reg);
395 return false;
396 }
397 close(fd);
398
399 /* No variable-length byte swap function anywhere in C... how sad. */
400 uint64_t baseaddr = 0;
401 for (i = 0; i < addr_cells * 4; i++) {
402 baseaddr <<= 8;
403 baseaddr |= *dtbuffer;
404 dtbuffer++;
405 }
406 uint64_t cb_table_size = 0;
407 for (i = 0; i < size_cells * 4; i++) {
408 cb_table_size <<= 8;
409 cb_table_size |= *dtbuffer;
410 dtbuffer++;
411 }

Callers 1

init_specific_backendFunction · 0.85

Calls 10

fprintfFunction · 0.85
strerrorFunction · 0.85
strlenFunction · 0.85
perrorFunction · 0.85
readFunction · 0.85
parse_cbtableFunction · 0.85
mapping_virtFunction · 0.85
dt_find_compatFunction · 0.70
strcpyFunction · 0.50
freeFunction · 0.50

Tested by

no test coverage detected