
#include <stdio.h>
#include "mt.h"

struct frame {
  unsigned long flags;
  unsigned long ebp;
  unsigned long edi;
  unsigned long esi;
  unsigned long edx;
  unsigned long ecx;
  unsigned long ebx;
  unsigned long eax;
  unsigned long retaddr;
  unsigned long retaddr2;
  unsigned long data;
};

/*--------------------------------------------------------------------------*/
void
mtarch_init(void)
{
  
}
/*--------------------------------------------------------------------------*/
void
mtarch_start(struct mtarch_thread *t,
	     void (*function)(void *), void *data)
{
  struct frame *f = (struct frame *)&t->stack[MTARCH_STACKSIZE - sizeof(struct frame)/4];
  memset(f, 0, sizeof(struct frame));
  f->retaddr = (unsigned long)function;
  f->data    = (unsigned long)data;
  t->sp      = (unsigned long)&f->flags;
  f->ebp     = (unsigned long)&f->eax;
}
/*--------------------------------------------------------------------------*/
static unsigned long spsave, sptmp;
static struct mtarch_thread *running_thread;

static void
sw(void)
{
  
  asm("pushl %eax");
  asm("pushl %ebx");
  asm("pushl %ecx");
  asm("pushl %edx");
  asm("pushl %esi");
  asm("pushl %edi");
  asm("pushl %ebp");
  asm("pushl %ebp"); /* XXX: should push FPU flags here. */
  asm("movl %esp, spsave");

  sptmp = running_thread->sp;
  running_thread->sp = spsave;

  asm("movl sptmp, %esp");
  asm("popl %ebp"); /* XXX: should pop FPU flags here. */
  asm("popl %ebp");  
  asm("popl %edi");
  asm("popl %esi");
  asm("popl %edx");
  asm("popl %ecx");
  asm("popl %ebx");
  asm("popl %eax");
}

/*--------------------------------------------------------------------------*/
void
mtarch_exec(struct mtarch_thread *t)
{
  running_thread = t;
  sw();
  running_thread = NULL;
}
/*--------------------------------------------------------------------------*/
void
mtarch_remove(void)
{

}
/*--------------------------------------------------------------------------*/
void
mtarch_yield(void)
{
  sw();
}
/*--------------------------------------------------------------------------*/
void
mtarch_pstop(void)
{
  
}
/*--------------------------------------------------------------------------*/
void
mtarch_pstart(void)
{
  
}
/*--------------------------------------------------------------------------*/
