/* * Copyright 2010 Stefan Lankes, Chair for Operating Systems, * RWTH Aachen University * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * This file is part of MetalSVM. */ #include #include #include #include #include #include #include #include #include #ifdef CONFIG_PCI #include #endif #ifdef CONFIG_LWIP #include #include #include #include #include #include #include //#include #endif extern int test_init(void); extern const void kernel_start; extern const void kernel_end; #ifdef CONFIG_LWIP int STDCALL lwip_task(void* arg) { struct netif netif; struct ip_addr ipaddr; struct ip_addr netmask; struct ip_addr gw; err_t err; sleep(10); kputs("LWIP task is started\n"); stats_init(); /* Clears the structure where runtime statistics are gathered */ sys_init(); mem_init(); /* Initializes the dynamic memory heap defined by MEM_SIZE. */ memp_init(); /* Initializes the memory pools defined by MEMP_NUM_x */ pbuf_init(); /* Initializes the pbuf memory pool defined by PBUF_POOL_SIZE. */ etharp_init(); /* Initializes the ARP table and queue. */ ip_init(); udp_init(); /* Clears the UDP PCB list */ tcp_init(); /* Clears the TCP PCB list and clears some internal TCP timers. */ /* Bring up the network interface */ //if (!netif_add(&netif, &ipaddr, &netmask, &gw, NULL, pcnetif_init, ethernet_input)) { // kputs("Unable to add network interface\n"); // return NULL; //} /* This will bring the interface up and set its IP address when it can acquire one. */ //err = dhcp_start(&netif); //if (err != ERR_OK) { // kprintf("Unable to get IP via DHCP: %s\n", lwip_strerr(err)); // return NULL; //} //if (netif_is_up(&netif)) { // kputs("Network interface is not up\n"); // return NULL; //} //while(1) { //} return 0; } #endif int main(void) { #ifdef CONFIG_LWIP tid_t lwip_id; #endif kprintf("Here is MetalSVM %s\n", METALSVM_VERSION); system_init(); irq_init(); timer_init(); #ifdef CONFIG_KEYBOARD keyboard_init(); #endif mmu_init(); multitasking_init(); koutput_init(); irq_enable(); kprintf("Kernel starts at %p and ends at %p\n", &kernel_start, &kernel_end); detect_cpu_frequency(); kprintf("Processor frequency: %d MHz\n", get_cpu_frequency()/1000000); kprintf("Total memory: %u MBytes\n", atomic_int32_read(&total_pages)/((1024*1024)/PAGE_SIZE)); kprintf("Current allocated memory: %u KBytes\n", atomic_int32_read(&total_allocated_pages)*(PAGE_SIZE/1024)); kprintf("Current available memory: %u MBytes\n", atomic_int32_read(&total_available_pages)/((1024*1024)/PAGE_SIZE)); #ifdef CONFIG_PCI print_pci_adapters(); #endif timer_set_frequency(TIMER_FREQ); sleep(5); test_init(); #ifdef CONFIG_LWIP //create_kernel_task(&lwip_id, lwip_task, NULL); #endif current_task->status = TASK_IDLE; reschedule(); while(1) { NOP8; } return 0; }