~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/arch/um/kernel/um_arch.c

Version: ~ [ 0.6-2.3.46 ] ~
Architecture: ~ [ um ] ~

** Warning: Cannot open xref database.

1 #include "linux/sched.h" 2 #include "linux/mm.h" 3 #include "linux/types.h" 4 #include "linux/tty.h" 5 #include "linux/init.h" 6 #include "linux/bootmem.h" 7 #include "linux/spinlock.h" 8 #include "asm/page.h" 9 #include "asm/pgtable.h" 10 #include "asm/ptrace.h" 11 #include "asm/elf.h" 12 #include "asm/user.h" 13 #include "asm/fhd_user.h" 14 #include "asm/current.h" 15 #include "proc_arch.h" 16 #include "user_util.h" 17 #include "kern_util.h" 18 #include "kern.h" 19 #include "mprot.h" 20 21 unsigned long _stext; 22 23 #define COMMAND_LINE_SIZE 256 24 #define DEFAULT_COMMAND_LINE "root=/dev/fhd0" 25 26 char saved_command_line[COMMAND_LINE_SIZE]; 27 28 unsigned long thread_saved_pc(struct thread_struct *thread) 29 { 30 KERN_UNTESTED(); 31 return(0); 32 } 33 34 int get_cpuinfo(char * buffer){ 35 sprintf(buffer, "processor: user-mode\n"); 36 return(strlen(buffer)); 37 } 38 39 40 UNDEFINED(get_irq_list) 41 42 pte_t * __bad_pagetable(void) 43 { 44 KERN_UNTESTED(); 45 return(NULL); 46 } 47 48 extern void start_kernel(void); 49 50 static int start_kernel_proc(void *unused) 51 { 52 int pid; 53 54 pid = getpid(); 55 set_extern_pid(0, pid); 56 add_signal_handler(SIGSEGV, kern_segv_handler); 57 signal_init(); 58 printk("idle thread pid = %d\n", pid); 59 block_signals(NULL); 60 #ifdef __SMP__ 61 cpu_tasks[0].pid = pid; 62 cpu_tasks[0].task = current; 63 smp_num_cpus = 1; 64 #else 65 current_task = &init_task_union.task; 66 #endif 67 start_kernel(); 68 return(0); 69 } 70 71 int physmem_fd = -1; 72 73 extern unsigned long high_physmem; 74 extern void *high_memory; 75 76 unsigned long physmem; 77 unsigned long start_vm; 78 unsigned long end_vm; 79 int physmem_inode; 80 81 int ncpus = 1; 82 83 static unsigned long __init memparse(char *ptr) 84 { 85 char *retptr; 86 unsigned long ret; 87 88 ret = simple_strtoul(ptr, &retptr, 0); 89 90 if (*retptr == 'K' || *retptr == 'k') { 91 ret <<= 10; 92 } 93 else if (*retptr == 'M' || *retptr == 'm') { 94 ret <<= 20; 95 } 96 return ret; 97 } /* memparse */ 98 99 static void add_arg(char *cmd_line, char *arg) 100 { 101 if (strlen(cmd_line) + strlen(arg) + 1 > COMMAND_LINE_SIZE) { 102 printf("add_arg: Too much command line!\n"); 103 exit(1); 104 } 105 if(strlen(cmd_line) > 0) strcat(cmd_line, " "); 106 strcat(cmd_line, arg); 107 } 108 109 #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) 110 #define PFN_DOWN(x) ((x) >> PAGE_SHIFT) 111 #define PFN_PHYS(x) ((x) << PAGE_SHIFT) 112 113 static char *argv1_begin = NULL; 114 static char *argv1_end = NULL; 115 116 void set_cmdline(char *cmd) 117 { 118 strcpy(argv1_begin, "["); 119 strncat(argv1_begin, cmd, argv1_end - argv1_begin - strlen("[]")); 120 strcat(argv1_begin, "]"); 121 memset(argv1_begin + strlen(argv1_begin), '\0', 122 argv1_end - argv1_begin - strlen(argv1_begin)); 123 } 124 125 int linux_main(int argc, char **argv) 126 { 127 unsigned long start_pfn, end_pfn, bootmap_size, signal_stack; 128 unsigned long physmem_size, virtmem_size; 129 struct init_thread init_info; 130 unsigned int i, have_root; 131 132 remap_data("rw-"); 133 remap_data("rwx"); 134 block_shlib_mem(); 135 register_pid(getpid(), 1); 136 137 /* Create fake command line from argv[]. */ 138 have_root = 0; 139 physmem_size = 16 * 1024 * 1024; 140 virtmem_size = physmem_size; 141 for (i = 1; i < argc; i++){ 142 if((i == argc - 1) && (argv[i][0] == ' ')) break; 143 add_arg(saved_command_line, argv[i]); 144 if(!strncmp(argv[i], "root=", strlen("root="))) have_root = 1; 145 else if(!strncmp(argv[i], "mem=", strlen("mem="))) 146 physmem_size = memparse(argv[i] + strlen("mem=")); 147 #ifdef __SMP__ 148 else if(!strncmp(argv[i], "ncpus=", strlen("ncpus="))) 149 ncpus = strtoul(argv[i] + strlen("ncpus="), NULL, 10); 150 #endif 151 } 152 if(have_root == 0) add_arg(saved_command_line, DEFAULT_COMMAND_LINE); 153 argv1_begin = argv[1]; 154 argv1_end = &argv[argc - 1][strlen(argv[argc - 1])]; 155 156 unblock_shlib_mem(); 157 physmem = setup_memory(physmem_size + VMALLOC_OFFSET + virtmem_size, 158 physmem_size, &physmem_fd, &physmem_inode); 159 high_memory = (void *) (physmem + physmem_size); 160 high_physmem = (unsigned long) high_memory; 161 start_vm = physmem + physmem_size + VMALLOC_OFFSET; 162 end_vm = start_vm + virtmem_size; 163 164 start_pfn = PFN_UP(__pa(physmem)); 165 end_pfn = PFN_DOWN(__pa(high_physmem)); 166 bootmap_size = init_bootmem(start_pfn, end_pfn - start_pfn); 167 free_bootmem(__pa(physmem) + bootmap_size, 168 high_physmem - physmem - bootmap_size); 169 170 /* 171 init_task_ptr = alloc_bootmem_low_pages(2 * PAGE_SIZE); 172 *((struct task_struct *) init_task_ptr) = 173 ((struct task_struct) INIT_TASK(init_task_u.task)); 174 */ 175 init_task.thread.kernel_stack = (unsigned long) &init_task; 176 #ifndef __SMP__ 177 current = &init_task; 178 #endif 179 stack_protections(init_task.thread.kernel_stack, 2 * PAGE_SIZE); 180 signal_stack = (unsigned long) alloc_bootmem_low_pages(PAGE_SIZE); 181 stack_protections(signal_stack, PAGE_SIZE); 182 init_info.proc = start_kernel_proc; 183 init_info.sp = (void *) init_task.thread.kernel_stack + 2 * PAGE_SIZE - 184 sizeof(unsigned long); 185 clone(signals, (void *) signal_stack + PAGE_SIZE - sizeof(unsigned long), 186 CLONE_FILES | SIGCHLD, &init_info); 187 set_cmdline("(input thread)"); 188 return(input_loop()); 189 } 190 191 static struct mm_struct init_real_mm = EMPTY_MM; 192 193 void setup_arch(char **cmdline_p) 194 { 195 *cmdline_p = saved_command_line; 196 current->thread.real_mm = &init_real_mm; 197 } 198 199 void init_IRQ(void) 200 { 201 return; 202 } 203 204 void check_bugs(void) 205 { 206 return; 207 } 208 209 spinlock_t pid_lock = SPIN_LOCK_UNLOCKED; 210 211 void lock_pid(void) 212 { 213 spin_lock(&pid_lock); 214 } 215 216 void unlock_pid(void) 217 { 218 spin_unlock(&pid_lock); 219 } 220 221

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.