/* Get base memory ranges */ static int get_base_ranges(void) { int local_memory_ranges = 0; char device_tree[256] = "/proc/device-tree/"; char fname[256]; char buf[MAXBYTES]; DIR *dir, *dmem; FILE *file; struct dirent *dentry, *mentry; int n; if ((dir = opendir(device_tree)) == NULL) { perror(device_tree); return -1; } while ((dentry = readdir(dir)) != NULL) { if (strncmp(dentry->d_name, "memory@", 7) && strcmp(dentry->d_name, "memory")) continue; strcpy(fname, device_tree); strcat(fname, dentry->d_name); if ((dmem = opendir(fname)) == NULL) { perror(fname); closedir(dir); return -1; } while ((mentry = readdir(dmem)) != NULL) { if (strcmp(mentry->d_name, "reg")) continue; strcat(fname, "/reg"); if ((file = fopen(fname, "r")) == NULL) { perror(fname); closedir(dmem); closedir(dir); return -1; } if ((n = fread(buf, 1, MAXBYTES, file)) < 0) { perror(fname); fclose(file); closedir(dmem); closedir(dir); return -1; } if (local_memory_ranges >= max_memory_ranges) { fclose(file); break; } base_memory_range[local_memory_ranges].start = ((uint64_t *)buf)[0]; base_memory_range[local_memory_ranges].end = base_memory_range[local_memory_ranges].start + ((uint64_t *)buf)[1]; base_memory_range[local_memory_ranges].type = RANGE_RAM; local_memory_ranges++; dbgprintf("%016llx-%016llx : %x\n", base_memory_range[local_memory_ranges-1].start, base_memory_range[local_memory_ranges-1].end, base_memory_range[local_memory_ranges-1].type); fclose(file); } closedir(dmem); } closedir(dir); nr_memory_ranges = local_memory_ranges; sort_base_ranges(); memory_max = base_memory_range[nr_memory_ranges - 1].end; #ifdef DEBUG fprintf(stderr, "get base memory ranges:%d\n", nr_memory_ranges); #endif return 0; }
/* Get base memory ranges */ static int get_base_ranges(void) { uint64_t start, end; char device_tree[256] = "/proc/device-tree/"; char fname[256]; char buf[MAXBYTES]; DIR *dir, *dmem; FILE *file; struct dirent *dentry, *mentry; int n; if ((dir = opendir(device_tree)) == NULL) { perror(device_tree); return -1; } while ((dentry = readdir(dir)) != NULL) { if (!strncmp(dentry->d_name, "ibm,dynamic-reconfiguration-memory", 35)) { get_dyn_reconf_base_ranges(); continue; } if (strncmp(dentry->d_name, "memory@", 7) && strcmp(dentry->d_name, "memory")) continue; strcpy(fname, device_tree); strcat(fname, dentry->d_name); if ((dmem = opendir(fname)) == NULL) { perror(fname); closedir(dir); return -1; } while ((mentry = readdir(dmem)) != NULL) { if (strcmp(mentry->d_name, "reg")) continue; strcat(fname, "/reg"); if ((file = fopen(fname, "r")) == NULL) { perror(fname); closedir(dmem); closedir(dir); return -1; } if ((n = fread(buf, 1, MAXBYTES, file)) < 0) { perror(fname); fclose(file); closedir(dmem); closedir(dir); return -1; } if (nr_memory_ranges >= max_memory_ranges) { if (realloc_memory_ranges() < 0) break; } start = be64_to_cpu(((uint64_t *)buf)[0]); end = start + be64_to_cpu(((uint64_t *)buf)[1]); add_base_memory_range(start, end); fclose(file); } closedir(dmem); } closedir(dir); sort_base_ranges(); memory_max = base_memory_range[nr_memory_ranges - 1].end; dbgprintf("get base memory ranges:%d\n", nr_memory_ranges); return 0; }
/* Get base memory ranges */ static int get_base_ranges(void) { int local_memory_ranges = 0; char device_tree[256] = "/proc/device-tree/"; char fname[256]; char buf[MAXBYTES]; DIR *dir, *dmem; struct dirent *dentry, *mentry; int n, fd; if ((dir = opendir(device_tree)) == NULL) { perror(device_tree); return -1; } while ((dentry = readdir(dir)) != NULL) { if (strncmp(dentry->d_name, "memory@", 7) && strcmp(dentry->d_name, "memory")) continue; strcpy(fname, device_tree); strcat(fname, dentry->d_name); if ((dmem = opendir(fname)) == NULL) { perror(fname); closedir(dir); return -1; } while ((mentry = readdir(dmem)) != NULL) { unsigned long long start, end; if (strcmp(mentry->d_name, "reg")) continue; strcat(fname, "/reg"); if ((fd = open(fname, O_RDONLY)) < 0) { perror(fname); closedir(dmem); closedir(dir); return -1; } if (read_memory_region_limits(fd, &start, &end) != 0) { close(fd); closedir(dmem); closedir(dir); return -1; } if (local_memory_ranges >= max_memory_ranges) { if (realloc_memory_ranges() < 0) { close(fd); break; } } base_memory_range[local_memory_ranges].start = start; base_memory_range[local_memory_ranges].end = end; base_memory_range[local_memory_ranges].type = RANGE_RAM; local_memory_ranges++; dbgprintf("%016llx-%016llx : %x\n", base_memory_range[local_memory_ranges-1].start, base_memory_range[local_memory_ranges-1].end, base_memory_range[local_memory_ranges-1].type); close(fd); } closedir(dmem); } closedir(dir); nr_memory_ranges = local_memory_ranges; sort_base_ranges(); memory_max = base_memory_range[nr_memory_ranges - 1].end; #ifdef DEBUG fprintf(stderr, "get base memory ranges:%d\n", nr_memory_ranges); #endif return 0; }