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
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.