Beispiel #1
0
static struct vm_object *
new_exception(struct vm_class *vmc, const char *message)
{
	struct vm_object *message_str;
	struct vm_method *vmm;
	struct vm_object *obj;

	obj = vm_object_alloc(vmc);
	if (!obj)
		return rethrow_exception();

	if (message == NULL)
		message_str = NULL;
	else {
		message_str = vm_object_alloc_string_from_c(message);
		if (!message_str)
			return rethrow_exception();
	}

	vmm = vm_class_get_method(vmc, "<init>", "(Ljava/lang/String;)V");
	if (vmm) {
		vm_call_method(vmm, obj, message_str);

		return obj;
	}

	vmm = vm_class_get_method(vmc, "<init>", "()V");
	if (!vmm)
		error("constructor not found for %s", vmc->name);

	vm_call_method(vmm, obj);

	return obj;
}
Beispiel #2
0
static int paging_on_demand_and_memory_protection_demo(void) {
  vm_map_t *orig = get_user_vm_map();
  vm_map_activate(vm_map_new());

  vm_map_t *kmap = get_kernel_vm_map();
  vm_map_t *umap = get_user_vm_map();

  klog("Kernel physical map : %08lx-%08lx", kmap->pmap->start, kmap->pmap->end);
  klog("User physical map   : %08lx-%08lx", umap->pmap->start, umap->pmap->end);

  vm_addr_t start = 0x1001000;
  vm_addr_t end = 0x1001000 + 2 * PAGESIZE;

  vm_map_entry_t *redzone0 =
    vm_map_add_entry(umap, start - PAGESIZE, start, VM_PROT_NONE);
  vm_map_entry_t *redzone1 =
    vm_map_add_entry(umap, end, end + PAGESIZE, VM_PROT_NONE);
  vm_map_entry_t *data =
    vm_map_add_entry(umap, start, end, VM_PROT_READ | VM_PROT_WRITE);

  redzone0->object = vm_object_alloc();
  redzone1->object = vm_object_alloc();
  data->object = default_pager->pgr_alloc();

  vm_map_dump(umap);
  vm_map_dump(kmap);

  /* Start in paged on demand range, but end outside, to cause fault */
  for (int *ptr = (int *)start; ptr != (int *)end; ptr += 256) {
    klog("%p", ptr);
    *ptr = 0xfeedbabe;
  }

  vm_map_dump(umap);
  vm_map_dump(kmap);

  /* Restore original vm_map */
  vm_map_activate(orig);

  vm_map_delete(umap);

  klog("Test passed.");
  return KTEST_SUCCESS;
}