void memory_hierarchy_init(unsigned long memory_kernel) { uint32_t start,length,i; /**************************/ /* Init Memory Hierarchy */ /**************************/ hardware_get_memory(&start,&length); memory_total=length; /* Init memory subsystem */ memory_init(memory_total,memory_kernel); /* Setup Memory Hierarchy */ if ((hardware_get_type()==RPI_MODEL_2B) || (hardware_get_type()==RPI_MODEL_3B) || (hardware_get_type()==RPI_MODEL_3BPLUS)) { /* Enable MMU plus caches */ printk("Enabling MMU with 1:1 Virt/Phys page mapping\n"); printk("Enabling I/D caches\n"); setup_pagetable(0,memory_total,RESERVED_KERNEL); enable_mmu(1); /* Mark the multicore stacks as reserved */ for(i=0xff4000;i<0x1000000;i+=CHUNK_SIZE) { memory_mark_used(i/CHUNK_SIZE); } } else { /* Enable L1 i-cache */ printk("Enabling L1 icache\n"); enable_l1_icache(); /* Enable branch predictor */ printk("Enabling branch predictor\n"); enable_branch_predictor(); /* Enable L1 d-cache */ printk("Enabling MMU with 1:1 Virt/Phys page mapping\n"); setup_pagetable(0,memory_total,RESERVED_KERNEL); enable_mmu(1); printk("Enabling L1 dcache\n"); enable_l1_dcache(); } }
asmlinkage void start_secondary(void) { unsigned int cpu = smp_processor_id(); struct mm_struct *mm = &init_mm; enable_mmu(); atomic_inc(&mm->mm_count); atomic_inc(&mm->mm_users); current->active_mm = mm; enter_lazy_tlb(mm, current); local_flush_tlb_all(); per_cpu_trap_init(); preempt_disable(); notify_cpu_starting(cpu); local_irq_enable(); /* Enable local timers */ local_timer_setup(cpu); calibrate_delay(); smp_store_cpu_info(cpu); set_cpu_online(cpu, true); per_cpu(cpu_state, cpu) = CPU_ONLINE; cpu_startup_entry(CPUHP_ONLINE); }
asmlinkage void start_secondary(void) { unsigned int cpu = smp_processor_id(); struct mm_struct *mm = &init_mm; enable_mmu(); mmgrab(mm); mmget(mm); current->active_mm = mm; #ifdef CONFIG_MMU enter_lazy_tlb(mm, current); local_flush_tlb_all(); #endif per_cpu_trap_init(); preempt_disable(); notify_cpu_starting(cpu); local_irq_enable(); calibrate_delay(); smp_store_cpu_info(cpu); set_cpu_online(cpu, true); per_cpu(cpu_state, cpu) = CPU_ONLINE; cpu_startup_entry(CPUHP_AP_ONLINE_IDLE); }
int jpeg_decode(void) { enable_mmu(); dcache_enable(); printf("mmu_enable\n"); LoadJpegFile((void *)VIDEO_DATA_BASE); dcache_disable(); stop_mmu(); return 0; }
void mmu_setup(void) { setup_mmu_state(); setup_direct_map(); invalidate_tlb(); install_pt_address(); printk("Installed page table address\n"); set_domain_permissions(); printk("Set domain permissions\n"); flush_caches(); enable_mmu(); printk("MMU setup complete.\n"); }
void init_system() { uint8_t cpuid = smp_processor_id(); setup_vector(); setup_httbr((uint32_t) &__HYP_PGTABLE); setup_mem_attr(); if (cpuid == 0) { // TODO(wonseok) console init will be moved dev_init(). console_init(); libc_init(); } irq_init(); //enable_traps(); if (cpuid == 0) { paging_create((addr_t) &__HYP_PGTABLE); platform_init(); dev_init(); /* we don't have */ vdev_init(); /* Already we have */ timer_hw_init(NS_PL2_PTIMER_IRQ); setup_vm_mmap(); #ifdef CONFIG_SMP printf("wake up...other CPUs\n"); secondary_smp_pen = 1; #endif } printf("%s[%d]: CPU[%d]\n", __func__, __LINE__, cpuid); enable_mmu(); start_hypervisor(); }
void memory_init(void) { ttb_init(); set_page_tables(); enable_mmu(); }
void __init setup_arch(char **cmdline_p) { enable_mmu(); ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); #ifdef CONFIG_BLK_DEV_RAM rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK; rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); #endif if (!MOUNT_ROOT_RDONLY) root_mountflags &= ~MS_RDONLY; init_mm.start_code = (unsigned long) _text; init_mm.end_code = (unsigned long) _etext; init_mm.end_data = (unsigned long) _edata; init_mm.brk = (unsigned long) _end; code_resource.start = virt_to_phys(_text); code_resource.end = virt_to_phys(_etext)-1; data_resource.start = virt_to_phys(_etext); data_resource.end = virt_to_phys(_edata)-1; memory_start = (unsigned long)PAGE_OFFSET+__MEMORY_START; memory_end = memory_start + __MEMORY_SIZE; #ifdef CONFIG_CMDLINE_BOOL strlcpy(command_line, CONFIG_CMDLINE, sizeof(command_line)); #else strlcpy(command_line, COMMAND_LINE, sizeof(command_line)); #endif /* Save unparsed command line copy for /proc/cmdline */ memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE); *cmdline_p = command_line; parse_early_param(); sh_mv_setup(); /* * Find the highest page frame number we have available */ max_pfn = PFN_DOWN(__pa(memory_end)); /* * Determine low and high memory ranges: */ max_low_pfn = max_pfn; min_low_pfn = __MEMORY_START >> PAGE_SHIFT; nodes_clear(node_online_map); /* Setup bootmem with available RAM */ setup_memory(); sparse_init(); #ifdef CONFIG_DUMMY_CONSOLE conswitchp = &dummy_con; #endif /* Perform the machine specific initialisation */ if (likely(sh_mv.mv_setup)) sh_mv.mv_setup(cmdline_p); paging_init(); }
void kernel_main(uint32_t r0, uint32_t r1, uint32_t *atags, uint32_t memory_kernel) { unsigned int memory_total; int init_process,idle_process; struct atag_info_t atag_info; uint32_t framebuffer_width=800,framebuffer_height=600; uint32_t temperature; (void) r0; /* Ignore boot method */ /* Initialize Software Structures */ processes_init(); /* Detect Hardware */ atags_detect(atags,&atag_info); hardware_type=atag_info.hardware_type; /* Initialize Hardware */ /* Serial console is most important so do that first */ uart_init(); /* Enable HW random number generator */ bcm2835_rng_init(); /* Enable Interrupts */ enable_interrupts(); /************************/ /* Boot message! */ /************************/ printk("\nBooting VMWos...\n"); /**************************/ /* Device Drivers */ /**************************/ /* Set up ACT LED */ led_init(); /* Set up timer */ timer_init(); /* Set up keyboard */ ps2_keyboard_init(); /* Enable the Framebuffer */ if (atag_info.framebuffer_x!=0) { framebuffer_width=atag_info.framebuffer_x; } if (atag_info.framebuffer_y!=0) { framebuffer_height=atag_info.framebuffer_y; } framebuffer_init(framebuffer_width,framebuffer_height,24); framebuffer_console_init(); /* Delay to allow time for serial port to settle */ /* So we can actually see the output on the terminal */ delay(0x3f0000); printk("\nWaiting for serial port to be ready (press any key)\n"); uart_getc(); uart_enable_interrupts(); /* Clear screen */ printk("\n\033[2J\n\n"); /* Print boot message */ printk("\033[0;41m \033[42m \033[44m \033[42m \033[44m \033[0m VMW OS\n"); printk(" \033[0;41m \033[42m \033[44m \033[42m \033[44m \033[0m Version 0.%d\n\n",VERSION); /* Print hardware version */ printk("Hardware version: %x ",r1); if (r1==0xc42) printk("(Raspberry Pi)"); else printk("(Unknown Hardware)"); printk("\n"); printk("Detected Model "); switch(hardware_type) { case RPI_MODEL_A: printk("A"); break; case RPI_MODEL_APLUS: printk("A+"); break; case RPI_MODEL_B: printk("B"); break; case RPI_MODEL_BPLUS: printk("B+"); break; case RPI_MODEL_B2: printk("B2"); break; case RPI_COMPUTE_NODE: printk("Compute Node"); break; default: printk("Unknown %x",hardware_type); break; } printk("\n"); /* Check temperature */ temperature=thermal_read(); printk("CPU Temperature: %dC, %dF\n", temperature/1000, ((temperature*9)/5000)+32); /* Print ATAGS */ atags_dump(atags); printk("\n"); /* Get amount of RAM from ATAGs */ memory_total=atag_info.ramsize; /* Init memory subsystem */ memory_init(memory_total,memory_kernel); /* Start HW Perf Counters */ arm1176_init_pmu(); #if 0 asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); // printk("Heisenbug!\n"); #endif /* Setup Memory Hierarchy */ #if 1 memset_benchmark(memory_total); #else /* Enable L1 i-cache */ printk("Enabling L1 icache\n"); enable_l1_dcache(); /* Enable branch predictor */ printk("Enabling branch predictor\n"); /* Enable L1 d-cache */ printk("Enabling MMU with 1:1 Virt/Phys page mapping\n"); enable_mmu(0,memory_total); printk("Enabling L1 dcache\n"); enable_l1_dcache(); #endif /* Init the file descriptor table */ fd_table_init(); /* Initialize the ramdisk */ ramdisk_init(initrd_image,sizeof(initrd_image)); /* Mount the ramdisk */ mount("/dev/ramdisk","/","romfs",0,NULL); /* Load the idle thread */ idle_process=load_process("idle",PROCESS_FROM_RAM, (char *)&idle_task,8,4096); init_process=load_process("shell",PROCESS_FROM_DISK, NULL,0,8192); load_process("printa",PROCESS_FROM_DISK, NULL,0,8192); load_process("printb",PROCESS_FROM_DISK, NULL,0,8192); /* Enter our "init" process*/ printk("\nEntering userspace by starting process %d!\n", init_process); process[idle_process].ready=1; process[init_process].ready=1; userspace_started=1; /* run init and restore stack as we won't return */ run_process(init_process,0x8000); /* we should never get here */ while(1) { /* Loop Forever */ /* Should probably execute a wfi instruction */ } }