/* 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;
}
示例#2
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;
}
示例#3
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;
}