/**linux/init/main.c**Copyright(C)1991,1992LinusTorvalds**GK2/5/95-Changedtosupportmountingrootfsvia
NFS*Addedinitrd&change_root:WernerAlmesberger&HansLermen,Feb'96*Moanearlyifgccisold,avoidingbogusker
nels-PaulGortmaker,May'96*Simplifiedstartingofinit:MichaelA.Griffith<grif@acm.org>*/#define__KERNEL_
SYSCALLS__#include<linux/config.h>#include<linux/proc_fs.h>#include<linux/unistd.h>#include/ct
ype.h>#includeinux/delay.h>#include<linux/utsname.h>#include<linux/ioport.h>#include<linux/init.h>
#include<linux/smp_lock.h>#include<linux/blk.h>#include<linux/hdreg.h>#includesm/io.h>#include<asm
/bugs.h>#ifdefCONFIG_PCI#include<linux/pci.h>#endif#ifdefCONFIG_DIO#includeinux/dio.h>#endif#ifdef
CONFIG_ZORRO#include<linux/zorro.h>#endif#ifdefCONFIG_MTRR#include<asm/mtrr.h>#endif#ifdefCONFIG_APM
#include<linux/apm_bios.h>#endif/**Versionsofgccolderthanthatlistedbelowmayactuallycompile*andlinkok
ay,buttheendproductcanhavesubtleruntimebugs.*Toavoidassociatedbogusbugreports,weflatlyrefusetocompil
e*withagccthatisknowntobetoooldfromtheverybeginning.*/#if__GNUC__<2||(__GNUC__==2&&__GNUC_MINOR__<6)
#errorsorry,yourGCCistooold.Itbuildsincorrectkernels.#endifexternchar_stext,_etext;externchar*linux_
banner;externintconsole_loglevel;staticintinit(void*);externintbdflush(void*);externintkswapd(void*)
;externvoidkswapd_setup(void);externvoidinit_IRQ(void);externvoidinit_modules(void);externlongconsol
e_init(long,long);externvoidsock_init(void);externvoiduidcache_init(void);externvoidmca_init(void);e
xternvoidsbus_init(void);externvoidpowermac_init(void);externvoidsysctl_init(void);externvoidfilesca
che_init(void);externvoidsignals_init(void);externvoiddevice_setup(void);externvoidbinfmt_setup(void
);externvoidfree_initmem(void);externvoidfilesystem_setup(void);#ifdefCONFIG_ARCH_ACORNexternvoideca
rd_init(void);#endifexternvoidsmp_setup(char*str,int*ints);#ifdef__i386__externvoidioapic_pirq_setup
(char*str,int*ints);externvoidioapic_setup(char*str,int*ints);#endifexternvoidno_scroll(char*str,int
*ints);externvoidkbd_reset_setup(char*str,int*ints);externvoidpanic_setup(char*str,int*ints);externv
oidbmouse_setup(char*str,int*ints);externvoidmsmouse_setup(char*str,int*ints);externvoidconsole_setu
p(char*str,int*ints);#ifdefCONFIG_PRINTERexternvoidlp_setup(char*str,int*ints);#endif#ifdefCONFIG_JO
Y_AMIGAexternvoidjs_am_setup(char*str,int*ints);#endif#ifdefCONFIG_JOY_ANALOGexternvoidjs_an_setup(c
har*str,int*ints);#endif#ifdefCONFIG_JOY_ASSASINexternvoidjs_as_setup(char*str,int*ints);#endif#ifde
fCONFIG_JOY_CONSOLEexternvoidjs_console_setup(char*str,int*ints);#endif#ifdefCONFIG_JOY_DB9externvoi
djs_db9_setup(char*str,int*ints);#endif#ifdefCONFIG_JOY_TURBOGRAFXexternvoidjs_tg_setup(char*str,int
*ints);#endif#ifdefCONFIG_JOY_LIGHTNINGexternvoidjs_l4_setup(char*str,int*ints);#endifexternvoideth_
setup(char*str,int*ints);#ifdefCONFIG_ARCNET_COM20020externvoidcom20020_setup(char*str,int*ints);#en
dif#ifdefCONFIG_ARCNET_RIM_Iexternvoidarcrimi_setup(char*str,int*ints);#endif#ifdefCONFIG_ARCNET_COM
90xxIOexternvoidcom90io_setup(char*str,int*ints);#endif#ifdefCONFIG_ARCNET_COM90xxexternvoidcom90xx_
setup(char*str,int*ints);#endif#ifdefCONFIG_DECNETexternvoiddecnet_setup(char*str,int*ints);#endif#i
fdefCONFIG_BLK_DEV_XDexternvoidxd_setup(char*str,int*ints);externvoidxd_manual_geo_init(char*str,int
*ints);#endif#ifdefCONFIG_BLK_DEV_IDEexternvoidide_setup(char*);#endif#ifdefCONFIG_PARIDE_PDexternvo
idpd_setup(char*str,int*ints);#endif#ifdefCONFIG_PARIDE_PFexternvoidpf_setup(char*str,int*ints);#end
if#ifdefCONFIG_PARIDE_PTexternvoidpt_setup(char*str,int*ints);#endif#ifdefCONFIG_PARIDE_PGexternvoid
pg_setup(char*str,int*ints);#endif#ifdefCONFIG_PARIDE_PCDexternvoidpcd_setup(char*str,int*ints);#end
ifexternvoidfloppy_setup(char*str,int*ints);externvoidst_setup(char*str,int*ints);externvoidst0x_set
up(char*str,int*ints);externvoidadvansys_setup(char*str,int*ints);externvoidtmc8xx_setup(char*str,in
t*ints);externvoidt128_setup(char*str,int*ints);externvoidpas16_setup(char*str,int*ints);externvoidg
eneric_NCR5380_setup(char*str,int*intr);externvoidgeneric_NCR53C400_setup(char*str,int*intr);externv
oidgeneric_NCR53C400A_setup(char*str,int*intr);externvoidgeneric_DTC3181E_setup(char*str,int*intr);e
xternvoidaha152x_setup(char*str,int*ints);externvoidaha1542_setup(char*str,int*ints);externvoidgdth_
setup(char*str,int*ints);externvoidaic7xxx_setup(char*str,int*ints);externvoidAM53C974_setup(char*st
r,int*ints);externvoidBusLogic_Setup(char*str,int*ints);externvoidncr53c8xx_setup(char*str,int*ints)
;externvoideata2x_setup(char*str,int*ints);externvoidu14_34f_setup(char*str,int*ints);externvoidfdom
ain_setup(char*str,int*ints);externvoidibmmca_scsi_setup(char*str,int*ints);externvoidin2000_setup(c
har*str,int*ints);externvoidNCR53c406a_setup(char*str,int*ints);externvoidwd7000_setup(char*str,int*
ints);externvoiddc390_setup(char*str,int*ints);externvoidscsi_luns_setup(char*str,int*ints);externvo
idscsi_logging_setup(char*str,int*ints);externvoidsound_setup(char*str,int*ints);externvoidreboot_se
tup(char*str,int*ints);externvoidvideo_setup(char*str,int*ints);#ifdefCONFIG_CDU31Aexternvoidcdu31a_
setup(char*str,int*ints);#endifCONFIG_CDU31A#ifdefCONFIG_BLK_DEV_PS2externvoided_setup(char*str,int*
ints);externvoidtp720_setup(char*str,int*ints);#endifCONFIG_BLK_DEV_PS2#ifdefCONFIG_MCDexternvoidmcd
_setup(char*str,int*ints);#endifCONFIG_MCD#ifdefCONFIG_MCDXexternvoidmcdx_setup(char*str,int*ints);#
endifCONFIG_MCDX#ifdefCONFIG_SBPCDexternvoidsbpcd_setup(char*str,int*ints);#endifCONFIG_SBPCD#ifdefC
ONFIG_AZTCDexternvoidaztcd_setup(char*str,int*ints);#endifCONFIG_AZTCD#ifdefCONFIG_CDU535externvoids
onycd535_setup(char*str,int*ints);#endifCONFIG_CDU535#ifdefCONFIG_GSCDexternvoidgscd_setup(char*str,
int*ints);#endifCONFIG_GSCD#ifdefCONFIG_CM206externvoidcm206_setup(char*str,int*ints);#endifCONFIG_C
M206#ifdefCONFIG_OPTCDexternvoidoptcd_setup(char*str,int*ints);#endifCONFIG_OPTCD#ifdefCONFIG_SJCDex
ternvoidsjcd_setup(char*str,int*ints);#endifCONFIG_SJCD#ifdefCONFIG_ISP16_CDIexternvoidisp16_setup(c
har*str,int*ints);#endifCONFIG_ISP16_CDI#ifdefCONFIG_BLK_DEV_RAMstaticvoidramdisk_start_setup(char*s
tr,int*ints);staticvoidload_ramdisk(char*str,int*ints);staticvoidprompt_ramdisk(char*str,int*ints);s
taticvoidramdisk_size(char*str,int*ints);#ifdefCONFIG_BLK_DEV_INITRDstaticvoidno_initrd(char*s,int*i
nts);#endif#endifCONFIG_BLK_DEV_RAM#ifdefCONFIG_ISDN_DRV_ICNexternvoidicn_setup(char*str,int*ints);#
endif#ifdefCONFIG_ISDN_DRV_HISAXexternvoidHiSax_setup(char*str,int*ints);#endif#ifdefCONFIG_DIGIEPCA
externvoidepca_setup(char*str,int*ints);#endif#ifdefCONFIG_ISDN_DRV_PCBITexternvoidpcbit_setup(char*
str,int*ints);#endif#ifdefCONFIG_ATARIMOUSEexternvoidatari_mouse_setup(char*str,int*ints);#endif#ifd
efCONFIG_DMASOUNDexternvoiddmasound_setup(char*str,int*ints);#endif#ifdefCONFIG_ATARI_SCSIexternvoid
atari_scsi_setup(char*str,int*ints);#endifexternvoidstram_swap_setup(char*str,int*ints);externvoidwd
33c93_setup(char*str,int*ints);externvoidgvp11_setup(char*str,int*ints);externvoidncr53c7xx_setup(ch
ar*str,int*ints);#ifdefCONFIG_MAC_SCSIexternvoidmac_scsi_setup(char*str,int*ints);#endif#ifdefCONFIG
_CYCLADESexternvoidcy_setup(char*str,int*ints);#endif#ifdefCONFIG_DIGIexternvoidpcxx_setup(char*str,
int*ints);#endif#ifdefCONFIG_RISCOM8externvoidriscom8_setup(char*str,int*ints);#endif#ifdefCONFIG_SP
ECIALIXexternvoidspecialix_setup(char*str,int*ints);#endif#ifdefCONFIG_DMASCCexternvoiddmascc_setup(
char*str,int*ints);#endif#ifdefCONFIG_BAYCOM_PARexternvoidbaycom_par_setup(char*str,int*ints);#endif
#ifdefCONFIG_BAYCOM_SER_FDXexternvoidbaycom_ser_fdx_setup(char*str,int*ints);#endif#ifdefCONFIG_BAYC
OM_SER_HDXexternvoidbaycom_ser_hdx_setup(char*str,int*ints);#endif#ifdefCONFIG_SOUNDMODEMexternvoids
m_setup(char*str,int*ints);#endif#ifdefCONFIG_ADBMOUSEexternvoidadb_mouse_setup(char*str,int*ints);#
endif#ifdefCONFIG_WDTexternvoidwdt_setup(char*str,int*ints);#endif#ifdefCONFIG_PARPORTexternvoidparp
ort_setup(char*str,int*ints);#endif#ifdefCONFIG_PLIPexternvoidplip_setup(char*str,int*ints);#endif#i
fdefCONFIG_HFMODEMexternvoidhfmodem_setup(char*str,int*ints);#endif#ifdefCONFIG_IP_PNPexternvoidip_a
uto_config_setup(char*str,int*ints);#endif#ifdefCONFIG_ROOT_NFSexternvoidnfs_root_setup(char*str,int
*ints);#endif#ifdefCONFIG_FTAPEexternvoidftape_setup(char*str,int*ints);#endif#ifdefCONFIG_MDA_CONSO
LEexternvoidmdacon_setup(char*str,int*ints);#endif#ifdefCONFIG_LTPCexternvoidltpc_setup(char*str,int
*ints);#endif#ifdefined(CONFIG_SYSVIPC)externvoidipc_init(void);#endif#ifdefined(CONFIG_QUOTA)extern
voiddquot_init_hash(void);#endif#ifdefCONFIG_MD_BOOTexternvoidmd_setup(char*str,int*ints)__init;#end
if/**Bootcommand-linearguments*/#defineMAX_INIT_ARGS8#defineMAX_INIT_ENVS8externvoidtime_init(void);
staticunsignedlongmemory_start=0;staticunsignedlongmemory_end=0;introws,cols;#ifdefCONFIG_BLK_DEV_RA
Mexternintrd_doload;/*1=loadramdisk,0=don'tload*/externintrd_prompt;/*1=promptforramdisk,0=don'tprom
pt*/externintrd_size;/*Sizeoftheramdisk(s)*/externintrd_image_start;/*startingblock#ofimage*/#ifdefC
ONFIG_BLK_DEV_INITRDkdev_treal_root_dev;#endif#endifintroot_mountflags=MS_RDONLY;char*execute_comman
d=NULL;staticchar*argv_init[MAX_INIT_ARGS+2]={"init",NULL,};staticchar*envp_init[MAX_INIT_ENVS+2]={"
HOME=/","TERM=linux",NULL,};char*get_options(char*str,int*ints){char*cur=str;inti=1;while(cur&&(*cur
=='-'||isdigit(*cur))&&i<=10){ints[i++]=simple_strtol(cur,NULL,0);if((cur=strchr(cur,','))!=NULL)cur
++;}ints[0]=i-1;return(cur);}staticvoid__initprofile_setup(char*str,int*ints){if(ints[0]>0)prof_shif
t=(unsignedlong)ints[1];elseprof_shift=2;}staticstructdev_name_struct{constchar*name;constintnum;}ro
ot_dev_names[]__initdata={#ifdefCONFIG_ROOT_NFS{"nfs",0x00ff},#endif#ifdefCONFIG_BLK_DEV_IDE{"hda",0
x0300},{"hdb",0x0340},{"hdc",0x1600},{"hdd",0x1640},{"hde",0x2100},{"hdf",0x2140},{"hdg",0x2200},{"h
dh",0x2240},{"hdi",0x3800},{"hdj",0x3840},{"hdk",0x3900},{"hdl",0x3940},#endif#ifdefCONFIG_BLK_DEV_S
D{"sda",0x0800},{"sdb",0x0810},{"sdc",0x0820},{"sdd",0x0830},{"sde",0x0840},{"sdf",0x0850},{"sdg",0x
e-mail: marcin.jakubas@o2.pl
gg: 1274626