Skip to content

Commit

Permalink
Focusing microkernel
Browse files Browse the repository at this point in the history
  • Loading branch information
ckirsch committed Sep 5, 2023
1 parent 29b6459 commit bdb3b45
Showing 1 changed file with 93 additions and 108 deletions.
201 changes: 93 additions & 108 deletions selfie.c
Original file line number Diff line number Diff line change
Expand Up @@ -1508,6 +1508,14 @@ void store_cached_virtual_memory(uint64_t* table, uint64_t vaddr, uint64_t d

uint64_t load_cached_instruction_word(uint64_t* table, uint64_t vaddr);

uint64_t is_code_address(uint64_t* context, uint64_t vaddr);
uint64_t is_data_address(uint64_t* context, uint64_t vaddr);
uint64_t is_stack_address(uint64_t* context, uint64_t vaddr);
uint64_t is_heap_address(uint64_t* context, uint64_t vaddr);

uint64_t is_address_between_stack_and_heap(uint64_t* context, uint64_t vaddr);
uint64_t is_data_stack_heap_address(uint64_t* context, uint64_t vaddr);

// ------------------------ GLOBAL CONSTANTS -----------------------

uint64_t debug_tlb = 0;
Expand Down Expand Up @@ -1906,7 +1914,8 @@ void print_register_hexadecimal(uint64_t reg);
void print_register_octal(uint64_t reg);
void print_register_value(uint64_t reg);

uint64_t is_uncaught_exception(uint64_t exception);
uint64_t is_valid_segment_read(uint64_t vaddr);
uint64_t is_valid_segment_write(uint64_t vaddr);

void print_exception(uint64_t exception, uint64_t fault);
void throw_exception(uint64_t exception, uint64_t fault);
Expand Down Expand Up @@ -2343,17 +2352,6 @@ void cache_page_table(uint64_t* context, uint64_t* table, uint64_t* parent_table

void restore_context(uint64_t* context);

uint64_t is_code_address(uint64_t* context, uint64_t vaddr);
uint64_t is_data_address(uint64_t* context, uint64_t vaddr);
uint64_t is_stack_address(uint64_t* context, uint64_t vaddr);
uint64_t is_heap_address(uint64_t* context, uint64_t vaddr);

uint64_t is_address_between_stack_and_heap(uint64_t* context, uint64_t vaddr);
uint64_t is_data_stack_heap_address(uint64_t* context, uint64_t vaddr);

uint64_t is_valid_segment_read(uint64_t vaddr);
uint64_t is_valid_segment_write(uint64_t vaddr);

// ------------------------ GLOBAL CONSTANTS -----------------------

uint64_t debug_create = 0;
Expand Down Expand Up @@ -8613,6 +8611,62 @@ uint64_t load_cached_instruction_word(uint64_t* table, uint64_t vaddr) {
return load_virtual_memory(table, vaddr);
}

uint64_t is_code_address(uint64_t* context, uint64_t vaddr) {
// is address in code segment?
if (vaddr >= get_code_seg_start(context))
if (vaddr < get_code_seg_start(context) + get_code_seg_size(context))
return 1;

return 0;
}

uint64_t is_data_address(uint64_t* context, uint64_t vaddr) {
// is address in data segment?
if (vaddr >= get_data_seg_start(context))
if (vaddr < get_data_seg_start(context) + get_data_seg_size(context))
return 1;

return 0;
}

uint64_t is_stack_address(uint64_t* context, uint64_t vaddr) {
// is address in stack segment?
if (vaddr >= *(get_regs(context) + REG_SP))
if (vaddr <= HIGHESTVIRTUALADDRESS)
return 1;

return 0;
}

uint64_t is_heap_address(uint64_t* context, uint64_t vaddr) {
// is address in heap segment?
if (vaddr >= get_heap_seg_start(context))
if (vaddr < get_program_break(context))
return 1;

return 0;
}

uint64_t is_address_between_stack_and_heap(uint64_t* context, uint64_t vaddr) {
// is address between heap and stack segments?
if (vaddr >= get_program_break(context))
if (vaddr < *(get_regs(context) + REG_SP))
return 1;

return 0;
}

uint64_t is_data_stack_heap_address(uint64_t* context, uint64_t vaddr) {
if (is_data_address(context, vaddr))
return 1;
else if (is_stack_address(context, vaddr))
return 1;
else if (is_heap_address(context, vaddr))
return 1;
else
return 0;
}

// -----------------------------------------------------------------
// ---------------------- GARBAGE COLLECTOR ------------------------
// -----------------------------------------------------------------
Expand Down Expand Up @@ -10194,16 +10248,37 @@ void print_register_value(uint64_t reg) {
printf("%s==%ld(0x%lX)", get_register_name(reg), *(registers + reg), *(registers + reg));
}

uint64_t is_uncaught_exception(uint64_t exception) {
if (exception == EXCEPTION_SEGMENTATIONFAULT)
uint64_t is_valid_segment_read(uint64_t vaddr) {
if (is_data_address(current_context, vaddr)) {
data_reads = data_reads + 1;

return 1;
else if (exception == EXCEPTION_INVALIDADDRESS)
} else if (is_stack_address(current_context, vaddr)) {
stack_reads = stack_reads + 1;

return 1;
else if (exception == EXCEPTION_UNKNOWNINSTRUCTION)
} else if (is_heap_address(current_context, vaddr)) {
heap_reads = heap_reads + 1;

return 1;
else if (exception == EXCEPTION_UNINITIALIZEDREGISTER)
} else
return 0;
}

uint64_t is_valid_segment_write(uint64_t vaddr) {
if (is_data_address(current_context, vaddr)) {
data_writes = data_writes + 1;

return 1;
else
} else if (is_stack_address(current_context, vaddr)) {
stack_writes = stack_writes + 1;

return 1;
} else if (is_heap_address(current_context, vaddr)) {
heap_writes = heap_writes + 1;

return 1;
} else
return 0;
}

Expand Down Expand Up @@ -11218,96 +11293,6 @@ void restore_context(uint64_t* context) {
set_ic_all(context, get_total_number_of_instructions() - get_ic_all(context));
}

uint64_t is_code_address(uint64_t* context, uint64_t vaddr) {
// is address in code segment?
if (vaddr >= get_code_seg_start(context))
if (vaddr < get_code_seg_start(context) + get_code_seg_size(context))
return 1;

return 0;
}

uint64_t is_data_address(uint64_t* context, uint64_t vaddr) {
// is address in data segment?
if (vaddr >= get_data_seg_start(context))
if (vaddr < get_data_seg_start(context) + get_data_seg_size(context))
return 1;

return 0;
}

uint64_t is_stack_address(uint64_t* context, uint64_t vaddr) {
// is address in stack segment?
if (vaddr >= *(get_regs(context) + REG_SP))
if (vaddr <= HIGHESTVIRTUALADDRESS)
return 1;

return 0;
}

uint64_t is_heap_address(uint64_t* context, uint64_t vaddr) {
// is address in heap segment?
if (vaddr >= get_heap_seg_start(context))
if (vaddr < get_program_break(context))
return 1;

return 0;
}

uint64_t is_address_between_stack_and_heap(uint64_t* context, uint64_t vaddr) {
// is address between heap and stack segments?
if (vaddr >= get_program_break(context))
if (vaddr < *(get_regs(context) + REG_SP))
return 1;

return 0;
}

uint64_t is_data_stack_heap_address(uint64_t* context, uint64_t vaddr) {
if (is_data_address(context, vaddr))
return 1;
else if (is_stack_address(context, vaddr))
return 1;
else if (is_heap_address(context, vaddr))
return 1;
else
return 0;
}

uint64_t is_valid_segment_read(uint64_t vaddr) {
if (is_data_address(current_context, vaddr)) {
data_reads = data_reads + 1;

return 1;
} else if (is_stack_address(current_context, vaddr)) {
stack_reads = stack_reads + 1;

return 1;
} else if (is_heap_address(current_context, vaddr)) {
heap_reads = heap_reads + 1;

return 1;
} else
return 0;
}

uint64_t is_valid_segment_write(uint64_t vaddr) {
if (is_data_address(current_context, vaddr)) {
data_writes = data_writes + 1;

return 1;
} else if (is_stack_address(current_context, vaddr)) {
stack_writes = stack_writes + 1;

return 1;
} else if (is_heap_address(current_context, vaddr)) {
heap_writes = heap_writes + 1;

return 1;
} else
return 0;
}

// -----------------------------------------------------------------
// ---------------------------- KERNEL -----------------------------
// -----------------------------------------------------------------
Expand Down

0 comments on commit bdb3b45

Please sign in to comment.