/* * 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(); } }