Esempio n. 1
0
void check_preload_task0(scheduler_t *sched, table_t *tbl, table_preload_t preload) {
  ophtask_t *task = scheduler_get(sched, 0);
  assert(task->kind == preload_one);

  ophload_t *load = task->data;
  assert(load->tbl == tbl);
  assert(load->preload == preload);
  
  ophtask_free(task);
  scheduler_done(sched, 0);
}
Esempio n. 2
0
void check_unload_task(scheduler_t *sched, table_t *tbl) {
  assert(sched->ntasks > 0);

  ophtask_t *task = scheduler_get(sched, 0);
  assert(task->kind == unload);

  ophload_t *load = task->data;
  assert(load->tbl == tbl);

  ophtask_free(task);
  scheduler_done(sched, 0);
}
Esempio n. 3
0
void kernel_runloop() {
	volatile TaskDescriptor* td;
	int** sp_pointer;
  idleTimeStart = 0;
  totalIdleTime = 0;
  lastReportTime = 0;
  latestIdle = 999;

	while (LIKELY((td = scheduler_get()) != (TaskDescriptor *)NULL && notQuit)) {
    if (idleTid == td->id) idleTimeStart = GET_TIMER4();

		sp_pointer = (int**)&(td->sp);
    scheduler_set_running(td);
		int is_interrupt = asm_switch_to_usermode(sp_pointer);

    unsigned int current = GET_TIMER4();
    if (idleTid == td->id) {
      totalIdleTime += current - idleTimeStart;
    }

    if ((current - lastReportTime) > 200000) {
      latestIdle = totalIdleTime*10000 / (current - lastReportTime);
      lastReportTime = current;
      totalIdleTime = 0;
    }

    if (is_interrupt) {
      scheduler_move2ready();
      kernel_handle_interrupt();
    } else {
      int *arg0 = *sp_pointer;
      int request = *arg0 & MASK_LOWER;

      ASSERT(request >= 0 && request < LAST_SYSCALL, "System call not in range.");
      (*syscall_handler[request])(*sp_pointer,
                                  (*sp_pointer)[1],
                                  (*sp_pointer)[2],
                                  (*sp_pointer)[3]);

      if (request <= SYSCALL_REPLY) {
        scheduler_move2ready();
      }

    }
	} // End kernel loop;

  kernel_close();
}
Esempio n. 4
0
void test_ophcrack_preload_all4() {
  table_t *tables[] = {
    // xp free fast (lmalphanum5k)
    table_alloc(0x0fa2031c, ".", 0),
    table_alloc(0x0fa2031c, ".", 1),
    table_alloc(0x0fa2031c, ".", 2),
    table_alloc(0x0fa2031c, ".", 3)
  };

  int ntables = sizeof(tables) / sizeof(table_t*);
  ophcrack_t *crack = create_crack_4test(tables, ntables);

  // Assume a specific amount of RAM is availble

  uint64_t preload_size =
    table_preload_size(tables[0], preload_full) +
    table_preload_size(tables[1], preload_full) +
    table_preload_size(tables[2], preload_full) +
    table_preload_size(tables[3], preload_full);

  crack->freeram = preload_size;

  for (int s=0; s<2; ++s) {
    // Perform preload

    if (s == 0) {
      assert(crack->enabled->size == ntables);
      preload_4test(crack, tables, ntables);

      assert(crack->active->size == ntables);
      assert(crack->remaining->size == 0);
    }
    else {
      for (int i=0; i<ntables; ++i)
	tables[i]->enabled = 0;

      list_clear(crack->enabled);

      assert(crack->enabled->size == 0);
      preload_4test(crack, tables, 0);

      assert(crack->active->size == 0);
      assert(crack->remaining->size == 0);
    }

    assert(crack->remaining->size == crack->enabled->size - crack->active->size);

    // Check the tasks

    if (s == 0) {
      assert(crack->sched->ntasks == 1 + 4*4 + 1);

      while (crack->sched->ntasks > 0) {
	ophtask_t *task = scheduler_get(crack->sched, 0);
	ophtask_free(task);
	scheduler_done(crack->sched, 0);
      }
    }
    else {
      assert(crack->sched->ntasks == 1);
      check_preload_task(crack->sched, NULL, preload_none);
    }

    assert(crack->sched->ntasks == 0);

    // Check the messages

    if (s == 0)
      check_preload_message(NULL, ntables, 0, preload_size);
    else
      check_preload_message(NULL, 0, 0, 0);

    message_t *msg = message_tryget();
    assert(msg == NULL);
  }

  // Free memory

  free_crack_4test(crack);
}