134 lines
3.6 KiB
C
134 lines
3.6 KiB
C
/*
|
|
* Since RAZZLE doesn't have disk support yet, all code for test processes are
|
|
* included in this file.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "./scheduler.c"
|
|
#include "./spin_lock.c"
|
|
#include "./syscall.c"
|
|
#include "./scheduler.c"
|
|
|
|
uint32_t lock2 = 0;
|
|
|
|
uint32_t counter;
|
|
|
|
void test_razzle() {
|
|
sl_acquire(&lock2);
|
|
counter = 0;
|
|
sl_release(&lock2);
|
|
for (;;) {
|
|
sl_acquire(&lock2);
|
|
counter++;
|
|
//row = 1;
|
|
//col = 0;
|
|
//printf("%s (pid %d): %u \n", process_table[current_pid].process_name,
|
|
// current_pid, i);
|
|
sl_release(&lock2);
|
|
yield();
|
|
}
|
|
}
|
|
|
|
void sh_cpuid() {
|
|
char model[13];
|
|
uint32_t res[3];
|
|
__asm__ volatile ("mov $0, %%eax; cpuid; mov %%ebx, %0; mov %%edx, %1; mov %%ecx, %2;" : "=r" (res[0]), "=r" (res[1]), "=r" (res[2]) ::"ebx", "ecx", "edx");
|
|
for(uint32_t i = 0; i < 3; i++) {
|
|
model[(i*4) + 0] = (res[i] >> 0) & 0xFF;
|
|
model[(i*4) + 1] = (res[i] >> 8) & 0xFF;
|
|
model[(i*4) + 2] = (res[i] >> 16) & 0xFF;
|
|
model[(i*4) + 3] = (res[i] >> 24) & 0xFF;
|
|
}
|
|
model[12] = '\0';
|
|
printf("%s\n", model);
|
|
}
|
|
|
|
void sh_lspci() {
|
|
struct pci_device devlist[7];
|
|
int devices = lspci(&devlist[0], 7);
|
|
for(int j = 0; j < devices; ++j) {
|
|
printf("%s %s (%d %d)\n", devlist[j].vendor_name, devlist[j].device_name, devlist[j].class_code, devlist[j].subclass_code);
|
|
printf("Device ID: %x\n", devlist[j].device_id);
|
|
printf("Vendor ID: %x\n", devlist[j].vendor_id);
|
|
printf("Bar 5 : %x %u\n\n", devlist[j].bar[5], devlist[j].bar[5]);
|
|
}
|
|
}
|
|
|
|
void sh_lsproc() {
|
|
struct task_struct proclist[7];
|
|
int procs = lsproc(&proclist[0], 7);
|
|
for(int j = 0; j < procs; ++j) {
|
|
switch (proclist[j].state) {
|
|
case TASKSTATE_ready:
|
|
printf("R");
|
|
break;
|
|
case TASKSTATE_blocked:
|
|
printf("B");
|
|
break;
|
|
default:
|
|
printf("?");
|
|
break;
|
|
}
|
|
printf(" %d: %s", proclist[j].pid, proclist[j].process_name);
|
|
printf("\n");
|
|
}
|
|
}
|
|
|
|
void test_dazzle() {
|
|
char prompt[] = "you@razzle ~$ ";
|
|
char command[2048];
|
|
|
|
printf("%s", prompt);
|
|
uint32_t i = 0;
|
|
|
|
for (;;) {
|
|
char c = getc();
|
|
sl_acquire(&lock2);
|
|
|
|
switch(c) {
|
|
case '\b':
|
|
command[i--] = '\0';
|
|
printf("\b \b");
|
|
break;
|
|
|
|
case '\n':
|
|
command[i] = '\0';
|
|
i = 0;
|
|
|
|
printf("\n");
|
|
|
|
if (streq(command, "lspci")) {
|
|
sh_lspci();
|
|
} else if (streq(command, "cpuid")) {
|
|
sh_cpuid();
|
|
} else if (streq(command, "help")) {
|
|
printf("dazzle, the shell for RAZZLE\n");
|
|
printf("--------------------------------------------------------\n");
|
|
printf("help : print this menu\n");
|
|
printf("cpuid : print CPU vendor id string\n");
|
|
printf("lspci : print list of PCI devices\n");
|
|
printf("lsproc : print list of running processes\n");
|
|
printf("counter : print counter maintained by background process\n");
|
|
} else if (streq(command, "counter")) {
|
|
printf("%d\n", counter);
|
|
} else if (streq(command, "lsproc")) {
|
|
sh_lsproc();
|
|
} else {
|
|
printf("Unknown command\n");
|
|
}
|
|
|
|
printf("%s", prompt);
|
|
break;
|
|
|
|
default:
|
|
printf("%c", c);
|
|
command[i++] = c;
|
|
break;
|
|
}
|
|
|
|
sl_release(&lock2);
|
|
yield();
|
|
}
|
|
}
|