void get_mmap() { multiboot_info_t* multiboot_info = (multiboot_info_t*) (intptr_t) mboot_info; mmap_size = 0; //to check that mmap_length and mmap_addr are correct //we need them to be present if(!mmaps_present(multiboot_info->flags)) { println("No mmap present!"); return; } println("\nInitial mmap:"); uint64_t end = (uint64_t) multiboot_info->mmap_addr + (uint64_t) multiboot_info->mmap_length; uint16_t in_kernel = 0; uint64_t i = 0; for(mboot_mmap_entry* mmap_ptr = (mboot_mmap_entry*) (uint64_t) multiboot_info->mmap_addr; (uint64_t) mmap_ptr < end; mmap_ptr = (mboot_mmap_entry*) ((uint64_t) mmap_ptr + mmap_ptr->size + sizeof (mmap_ptr->size))) { mboot_mmap[i] = *mmap_ptr; //information and debug print_mboot_mmap_entry(mboot_mmap + i); //we think about kernel <3 process_mmap(mboot_mmap + i, &in_kernel); ++i; } correct_mmap(); }
static void process_event (Collector *collector, counter_t *counter, counter_event_t *event) { char *name; switch (event->header.type) { case PERF_RECORD_MMAP: name = "mmap"; break; case PERF_RECORD_LOST: name = "lost"; break; case PERF_RECORD_COMM: name = "comm"; break; case PERF_RECORD_EXIT: name = "exit"; break; case PERF_RECORD_THROTTLE: name = "throttle"; break; case PERF_RECORD_UNTHROTTLE: name = "unthrottle"; break; case PERF_RECORD_FORK: name = "fork"; break; case PERF_RECORD_READ: name = "read"; break; case PERF_RECORD_SAMPLE: name = "samp"; break; default: name = "unknown"; break; } d_print ("cpu %d :: %s :: ", counter->cpu, name); switch (event->header.type) { case PERF_RECORD_MMAP: process_mmap (collector, &event->mmap); break; case PERF_RECORD_LOST: g_print ("lost event\n"); break; case PERF_RECORD_COMM: process_comm (collector, &event->comm); break; case PERF_RECORD_EXIT: process_exit (collector, &event->exit); break; case PERF_RECORD_THROTTLE: g_print ("throttle\n"); break; case PERF_RECORD_UNTHROTTLE: g_print ("unthrottle\n"); break; case PERF_RECORD_FORK: process_fork (collector, &event->fork); break; case PERF_RECORD_READ: break; case PERF_RECORD_SAMPLE: process_sample (collector, &event->sample); break; default: g_warning ("unknown event: %d (%d)\n", event->header.type, event->header.size); break; } d_print ("\n"); }