void vcore_entry(void) { uint32_t vcoreid; static int first_time = 1; // used by vcore2 vcoreid = vcore_id(); printf("Hello from vcore_entry in vcore %d\n", vcoreid); if ((vcoreid == 2) && first_time) { first_time = 0; switch (test) { case TEST_INCREMENTAL_CHANGES: // Testing asking for less than we already have udelay(1000000); printf("Asking for too few:\n"); vcore_request_more(2); // Testing getting more while running printf("Asking for more while running:\n"); udelay(1000000); vcore_request_more(5); break; case TEST_YIELD_OUT_OF_ORDER: printf("Core %d yielding\n", vcoreid); sys_yield(0); break; case TEST_YIELD_0_OUT_OF_ORDER: udelay(7500000); printf("Core 0 should have yielded, asking for another\n"); vcore_request_more(5); } } global_tests(vcoreid); printf("Vcore %d Done!\n", vcoreid); }
int main(int argc, char** argv) { uint32_t vcoreid; int retval; vcore_init(); if ((vcoreid = vcore_id())) { printf("Should never see me! (from vcore %d)\n", vcoreid); } else { // core 0 printf("Hello from else vcore 0\n"); printf("Multi-Goodbye, world, from PID: %d!\n", sys_getpid()); switch (test) { case TEST_MMAP: printf("Testing MMAP\n"); void *addr; addr = sys_mmap((void*)USTACKTOP - 20*PGSIZE, 8*PGSIZE, 3, MAP_FIXED | MAP_ANONYMOUS, -1, 0); printf("got addr = 0x%08x\n", addr); *(int*)addr = 0xdeadbeef; *(int*)(addr + 3*PGSIZE) = 0xcafebabe; // these should work printf("reading addr: 0x%08x\n", *(int*)addr); printf("reading addr+3pg: 0x%08x\n", *(int*)(addr + 3*PGSIZE)); // this should fault printf("Should page fault and die now.\n"); *(int*)(addr - 3*PGSIZE) = 0xdeadbeef; printf("Should not see me!!!!!!!!!!!!!!!!!!\n"); while(1); case TEST_ONE_CORE: retval = vcore_request(1); printf("One core test's core0's retval: %d\n", retval); printf("Check to see it's on a worker core.\n"); while(1); case TEST_ASK_FOR_TOO_MANY_CORES: retval = vcore_request(12); printf("Asked for too many, retval: %d\n", retval); return 0; case TEST_INCREMENTAL_CHANGES: retval = vcore_request(4); break; default: retval = vcore_request(5); } if (retval) panic("failed to allocate cores!"); printf("Should see me if you want to relocate core0's context " "when moving from RUNNING_S\n"); } // vcore0 only below here switch (test) { case TEST_YIELD_OUT_OF_ORDER: udelay(10000000); printf("Core 2 should have yielded, asking for another\n"); retval = vcore_request(5); break; case TEST_YIELD_0_OUT_OF_ORDER: udelay(5000000); printf("Core %d yielding\n", vcoreid); sys_yield(0); printf("Core 0 came back where it left off in RUNNING_M!!!\n"); break; } global_tests(vcoreid); printf("Vcore %d Done!\n", vcoreid); while (1); return 0; }