Changeset View
Changeset View
Standalone View
Standalone View
stand/kboot/main.c
Show First 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | |||||
extern int command_fdt_internal(int argc, char *argv[]); | extern int command_fdt_internal(int argc, char *argv[]); | ||||
#define PA_INVAL (vm_offset_t)-1 | #define PA_INVAL (vm_offset_t)-1 | ||||
static vm_offset_t pa_start = PA_INVAL; | static vm_offset_t pa_start = PA_INVAL; | ||||
static vm_offset_t padding; | static vm_offset_t padding; | ||||
static vm_offset_t offset; | static vm_offset_t offset; | ||||
uint64_t commit_limit; | |||||
uint64_t committed_as; | |||||
uint64_t mem_avail; | |||||
static void | |||||
memory_limits(void) | |||||
{ | |||||
int fd; | |||||
char buf[128]; | |||||
/* | /* | ||||
* To properly size the slabs, we need to find how much memory we can | |||||
* commit to using. commit_limit is the max, while commited_as is the | |||||
* current total. We can use these later to allocate the largetst amount | |||||
* of memory possible so we can support larger ram disks than we could | |||||
* by using fixed segment sizes. We also grab the memory available so | |||||
* we don't use more than 49% of that. | |||||
*/ | |||||
fd = open("host:/proc/meminfo", O_RDONLY); | |||||
if (fd != -1) { | |||||
while (fgetstr(buf, sizeof(buf), fd) > 0) { | |||||
if (strncmp(buf, "MemAvailable:", 13) == 0) { | |||||
mem_avail = strtoll(buf + 13, NULL, 0); | |||||
mem_avail <<= 10; /* Units are kB */ | |||||
} else if (strncmp(buf, "CommitLimit:", 12) == 0) { | |||||
commit_limit = strtoll(buf + 13, NULL, 0); | |||||
commit_limit <<= 10; /* Units are kB */ | |||||
} else if (strncmp(buf, "Committed_AS:", 13) == 0) { | |||||
committed_as = strtoll(buf + 14, NULL, 0); | |||||
committed_as <<= 10; /* Units are kB */ | |||||
} | |||||
} | |||||
} | |||||
printf("Commit limit: %lld Committed bytes %lld Available %lld\n", | |||||
(long long)commit_limit, (long long)committed_as, | |||||
(long long)mem_avail); | |||||
close(fd); | |||||
} | |||||
/* | |||||
* NB: getdev should likely be identical to this most places, except maybe | * NB: getdev should likely be identical to this most places, except maybe | ||||
* we should move to storing the length of the platform devdesc. | * we should move to storing the length of the platform devdesc. | ||||
*/ | */ | ||||
int | int | ||||
kboot_getdev(void **vdev, const char *devspec, const char **path) | kboot_getdev(void **vdev, const char *devspec, const char **path) | ||||
{ | { | ||||
struct devdesc **dev = (struct devdesc **)vdev; | struct devdesc **dev = (struct devdesc **)vdev; | ||||
int rv; | int rv; | ||||
▲ Show 20 Lines • Show All 147 Lines • ▼ Show 20 Lines | #endif | ||||
} | } | ||||
printf("Boot device: %s with hostfs_root %s\n", bootdev, hostfs_root); | printf("Boot device: %s with hostfs_root %s\n", bootdev, hostfs_root); | ||||
printf("\n%s", bootprog_info); | printf("\n%s", bootprog_info); | ||||
setenv("LINES", "24", 1); | setenv("LINES", "24", 1); | ||||
memory_limits(); | |||||
enumerate_memory_arch(); | enumerate_memory_arch(); | ||||
/* | /* | ||||
* Find acpi, if it exists | * Find acpi, if it exists | ||||
*/ | */ | ||||
find_acpi(); | find_acpi(); | ||||
interact(); /* doesn't return */ | interact(); /* doesn't return */ | ||||
▲ Show 20 Lines • Show All 214 Lines • Show Last 20 Lines |