push
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/cervus.h>
|
||||
#include <cervus_util.h>
|
||||
|
||||
static const char *logo[] = {
|
||||
" L ",
|
||||
" 'k.i , ",
|
||||
" \";\"+U., ",
|
||||
" \\_' -. ",
|
||||
" .f ,_.;.",
|
||||
" I ,f ",
|
||||
" ' ",
|
||||
NULL
|
||||
};
|
||||
|
||||
static void cpuid_leaf(uint32_t leaf, uint32_t *a, uint32_t *b,
|
||||
uint32_t *c, uint32_t *d)
|
||||
{
|
||||
asm volatile ("cpuid"
|
||||
: "=a"(*a), "=b"(*b), "=c"(*c), "=d"(*d)
|
||||
: "0"(leaf), "2"(0));
|
||||
}
|
||||
|
||||
static void print_uptime(void)
|
||||
{
|
||||
uint64_t ns = cervus_uptime_ns();
|
||||
uint64_t total_s = ns / 1000000000ULL;
|
||||
uint64_t ms = (ns / 1000000ULL) % 1000ULL;
|
||||
uint64_t secs = total_s % 60;
|
||||
uint64_t mins = (total_s / 60) % 60;
|
||||
uint64_t hours = (total_s / 3600) % 24;
|
||||
uint64_t days = total_s / 86400;
|
||||
fputs("uptime: ", stdout);
|
||||
if (days > 0) printf("%lud, ", (unsigned long)days);
|
||||
printf("%02lu:%02lu:%02lu (%lus %lums)",
|
||||
(unsigned long)hours, (unsigned long)mins, (unsigned long)secs,
|
||||
(unsigned long)total_s, (unsigned long)ms);
|
||||
}
|
||||
|
||||
static void print_cpu(void)
|
||||
{
|
||||
uint32_t a, b, c, d;
|
||||
cpuid_leaf(0x80000000, &a, &b, &c, &d);
|
||||
if (a >= 0x80000004) {
|
||||
char brand[49];
|
||||
uint32_t *p = (uint32_t *)brand;
|
||||
cpuid_leaf(0x80000002, &p[0], &p[1], &p[2], &p[3]);
|
||||
cpuid_leaf(0x80000003, &p[4], &p[5], &p[6], &p[7]);
|
||||
cpuid_leaf(0x80000004, &p[8], &p[9], &p[10], &p[11]);
|
||||
brand[48] = '\0';
|
||||
const char *br = brand;
|
||||
while (*br == ' ') br++;
|
||||
printf("cpu: %s", br);
|
||||
}
|
||||
}
|
||||
|
||||
static void print_mem(void)
|
||||
{
|
||||
cervus_meminfo_t mi;
|
||||
if (cervus_meminfo(&mi) != 0) return;
|
||||
uint64_t used = mi.used_bytes;
|
||||
uint64_t total = mi.total_bytes;
|
||||
const uint64_t MiB = 1024ULL * 1024;
|
||||
const uint64_t GiB = 1024ULL * 1024 * 1024;
|
||||
fputs("mem: ", stdout);
|
||||
if (total >= GiB)
|
||||
printf("%lu.%02lu / %lu.%02lu GiB",
|
||||
(unsigned long)(used / GiB), (unsigned long)((used % GiB) * 100 / GiB),
|
||||
(unsigned long)(total / GiB), (unsigned long)((total % GiB) * 100 / GiB));
|
||||
else
|
||||
printf("%lu / %lu MiB",
|
||||
(unsigned long)(used / MiB), (unsigned long)(total / MiB));
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
(void)argc; (void)argv;
|
||||
putchar('\n');
|
||||
for (int i = 0; logo[i]; i++) {
|
||||
printf(" %s ", logo[i]);
|
||||
switch (i) {
|
||||
case 1: fputs("os: Cervus OS", stdout); break;
|
||||
case 2: print_uptime(); break;
|
||||
case 3: print_cpu(); break;
|
||||
case 4: fputs(C_RESET "shell: CSH", stdout); break;
|
||||
case 5: print_mem(); break;
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
putchar('\n');
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user