void printprocstks() { struct procent *p; create(myProgA(1,2), 1024, 20, "Process1", 2); create(myfuncA('d'), 1024, 20, "Process2", 1); int i; pid32 pid; for(i = 0; i < NPROC; i++) { if(((p = &proctab[i])->prstate)!=PR_FREE) { kprintf("Proc[%s].Pid = %d\n", p->prname,i); kprintf("Stack: Base = %x\n\t", p->prstkbase); kprintf("Len = %x\n\t", p->prstklen); kprintf("Limit = %x\n\t",(p->prstkbase-p->prstklen)); if(((p=&proctab[i])->prstate)!=PR_CURR) { kprintf("StkPtr = %x\n", p->prstkptr); } else { register int sp asm("sp"); kprintf("StkPtr = %x\n", sp); } } }
void myprogA() { kprintf("\r\nmyprogA\r\n"); kprintf("Run-Time Stack Address: %x\r\n", &proctab[currpid].prstkptr); int x; for(x=1;x<10000;x++){ x = x+0; } x = myfuncA(1, 2); }
int myprogA(){ kprintf("\n\nmyprogA\n"); register int *esp asm("sp"); kprintf("Runtime stack inside myprogA.\n"); kprintf("Runtime stack [address]=data.\n"); int j = -12; for(;j < 13; j++){ kprintf("%02d: [0x%08x]=0x%08x\n",j ,(esp+j), *(esp+j)); } myfuncA('c'); return 0; }
int myappA(int x, int main_pid){ unsigned long * topsp; int res; struct procent * proc = &proctab[main_pid]; kprintf("\ncurrpid : %d\n", currpid); kprintf("\n main's pid : %d\n", main_pid); kprintf("\n main's esp(prstkptr) : 0x%x\n", (unsigned long *)proc->prstkptr); asm("movl %esp, esp"); topsp = esp; kprintf("\nBefore myfuncA is called\n"); kprintf("run-time stack top : address = 0x%x, content = 0x%x\n", topsp, (unsigned long *) *topsp); res = myfuncA(x); asm("movl %esp, esp"); topsp = esp; kprintf("\nAfter myfuncA has returned\n"); kprintf("run-time stack top : address = 0x%x, content = 0x%x\n", topsp, (unsigned long *) *topsp); return res; }