asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int turn_on);
asmlinkage int sys_iopl(long ebx,long ecx,long edx,
long esi, long edi, long ebp, long eax, long ds,
long es, long fs, long gs, long orig_eax,
long eip,long cs,long eflags,long esp,long ss);
asmlinkage int sys_modify_ldt(int func, void *ptr, unsigned long bytecount);
asmlinkage int sys_fork(struct pt_regs regs);
asmlinkage int sys_clone(struct pt_regs regs);
asmlinkage int sys_execvesys_execve(struct pt_regs regs);
asmlinkage int sys_idle(void);
asmlinkage int sys_ptrace(long request, long pid, long addr, long data);
asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask,
unsigned long set);
asmlinkage int sys_sigreturn(unsigned long __unused);
asmlinkage int sys_pipe(unsigned long * fildes);
asmlinkage int sys_vm86(struct vm86_struct * v86);
The i386 support must implement these system calls. See the Linux man pages for a description.
XXX 3.2 proc Filesystem Support
int get_irq_list(char *buf);
Print a description of IRQs to buf.
int get_cpuinfo(char *buf);
Print CPU information to buf.
#ifdef __SMP_PROF__ int get_smp_prof_list(char *buf); #endif
Print SMP profiling information to buf. 3.3 init/main.c Support
void setup_arch(char **cmdline_p, unsigned long *memory_start_p,
unsigned long *memory_end_p);
setup_arch (linuxarch/i386/kernel/setup.c/)initializes some global structures containing information about the configuration of the machine linux is running on. It expects the information at a well defined address (empty_zero_page), where it is put by code sequences in setup.S.
If we remove all unnessecary things, setup_arch initializes at least the following structures:
/*
* These are set up by the setup-routine at boot-time:
*/
struct screen_info {
unsigned char orig_x;
unsigned char orig_y;
unsigned char unused1[2];
unsigned short orig_video_page;
unsigned char orig_video_mode;
unsigned char orig_video_cols;
unsigned short unused2;
unsigned short orig_video_ega_bx;
unsigned short unused3;
unsigned char orig_video_lines;
unsigned char orig_video_isVGA;
unsigned short orig_video_points;
};
set by setup.S, ps_mouse detected or not
ROOT_DEV = to_kdev_t(ORIG_ROOT_DEV);
drive_info = DRIVE_INFO;
screen_info = SCREEN_INFO;
#ifdef CONFIG_APM
apm_bios_info = APM_BIOS_INFO;
#endif
aux_device_present = AUX_DEVICE_INFO;
memory_end = (1<<20) + (EXT_MEM_K<<10);
memory_end &= PAGE_MASK;
#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
#ifdef CONFIG_MAX_16M
if (memory_end > 16*1024*1024)
memory_end = 16*1024*1024;
#endif
if (!MOUNT_ROOT_RDONLY)
root_mountflags &= ~MS_RDONLY;
memory_start = (unsigned long) &_end;
init_task.mm->start_code = TASK_SIZE;
init_task.mm->end_code = TASK_SIZE + (unsigned long) &_etext;
init_task.mm->end_data = TASK_SIZE + (unsigned long) &_edata;
init_task.mm->brk = TASK_SIZE + (unsigned long) &_end;
/* Save unparsed command line copy for /proc/cmdline */
memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
void init_IRQ(void); void trap_init(void); void arch_syms_export(void);
XXX
unsigned long paging_init(unsigned long start_mem, unsigned long end_mem);
Set up the page tables: map real memory into the kernel's user space, fix up start_mem accordingly. Also unmap the page at virtual kernel address 0, so that we can trap those pesky NULL-reference errors in the kernel. Then call free_area_init(start_mem, end_mem); (not declared anywhere).
void mem_init(unsigned long start_mem, unsigned long end_mem);
Setup the mem_map[] array. For each available page, call free_page() (declared in <linux/mm.h>).
int dump_fpu (struct user_i387_struct* fpu);
Dump FPU state.
void hard_reset_now(void);
Reset the CPU and reboot.