diff options
Diffstat (limited to 'ANDROID_3.4.5/init')
-rw-r--r-- | ANDROID_3.4.5/init/Kconfig | 1445 | ||||
-rw-r--r-- | ANDROID_3.4.5/init/Makefile | 32 | ||||
-rw-r--r-- | ANDROID_3.4.5/init/calibrate.c | 301 | ||||
-rw-r--r-- | ANDROID_3.4.5/init/do_mounts.c | 560 | ||||
-rw-r--r-- | ANDROID_3.4.5/init/do_mounts.h | 76 | ||||
-rw-r--r-- | ANDROID_3.4.5/init/do_mounts_initrd.c | 125 | ||||
-rw-r--r-- | ANDROID_3.4.5/init/do_mounts_md.c | 302 | ||||
-rw-r--r-- | ANDROID_3.4.5/init/do_mounts_rd.c | 340 | ||||
-rw-r--r-- | ANDROID_3.4.5/init/initramfs.c | 611 | ||||
-rw-r--r-- | ANDROID_3.4.5/init/main.c | 894 | ||||
-rw-r--r-- | ANDROID_3.4.5/init/noinitramfs.c | 52 | ||||
-rw-r--r-- | ANDROID_3.4.5/init/version.c | 48 |
12 files changed, 0 insertions, 4786 deletions
diff --git a/ANDROID_3.4.5/init/Kconfig b/ANDROID_3.4.5/init/Kconfig deleted file mode 100644 index a7cffc83..00000000 --- a/ANDROID_3.4.5/init/Kconfig +++ /dev/null @@ -1,1445 +0,0 @@ -config ARCH - string - option env="ARCH" - -config KERNELVERSION - string - option env="KERNELVERSION" - -config DEFCONFIG_LIST - string - depends on !UML - option defconfig_list - default "/lib/modules/$UNAME_RELEASE/.config" - default "/etc/kernel-config" - default "/boot/config-$UNAME_RELEASE" - default "$ARCH_DEFCONFIG" - default "arch/$ARCH/defconfig" - -config CONSTRUCTORS - bool - depends on !UML - -config HAVE_IRQ_WORK - bool - -config IRQ_WORK - bool - depends on HAVE_IRQ_WORK - -menu "General setup" - -config EXPERIMENTAL - bool "Prompt for development and/or incomplete code/drivers" - ---help--- - Some of the various things that Linux supports (such as network - drivers, file systems, network protocols, etc.) can be in a state - of development where the functionality, stability, or the level of - testing is not yet high enough for general use. This is usually - known as the "alpha-test" phase among developers. If a feature is - currently in alpha-test, then the developers usually discourage - uninformed widespread use of this feature by the general public to - avoid "Why doesn't this work?" type mail messages. However, active - testing and use of these systems is welcomed. Just be aware that it - may not meet the normal level of reliability or it may fail to work - in some special cases. Detailed bug reports from people familiar - with the kernel internals are usually welcomed by the developers - (before submitting bug reports, please read the documents - <file:README>, <file:MAINTAINERS>, <file:REPORTING-BUGS>, - <file:Documentation/BUG-HUNTING>, and - <file:Documentation/oops-tracing.txt> in the kernel source). - - This option will also make obsoleted drivers available. These are - drivers that have been replaced by something else, and/or are - scheduled to be removed in a future kernel release. - - Unless you intend to help test and develop a feature or driver that - falls into this category, or you have a situation that requires - using these features, you should probably say N here, which will - cause the configurator to present you with fewer choices. If - you say Y here, you will be offered the choice of using features or - drivers that are currently considered to be in the alpha-test phase. - -config BROKEN - bool - -config BROKEN_ON_SMP - bool - depends on BROKEN || !SMP - default y - -config INIT_ENV_ARG_LIMIT - int - default 32 if !UML - default 128 if UML - help - Maximum of each of the number of arguments and environment - variables passed to init from the kernel command line. - - -config CROSS_COMPILE - string "Cross-compiler tool prefix" - help - Same as running 'make CROSS_COMPILE=prefix-' but stored for - default make runs in this kernel build directory. You don't - need to set this unless you want the configured kernel build - directory to select the cross-compiler automatically. - -config LOCALVERSION - string "Local version - append to kernel release" - help - Append an extra string to the end of your kernel version. - This will show up when you type uname, for example. - The string you set here will be appended after the contents of - any files with a filename matching localversion* in your - object and source tree, in that order. Your total string can - be a maximum of 64 characters. - -config LOCALVERSION_AUTO - bool "Automatically append version information to the version string" - default y - help - This will try to automatically determine if the current tree is a - release tree by looking for git tags that belong to the current - top of tree revision. - - A string of the format -gxxxxxxxx will be added to the localversion - if a git-based tree is found. The string generated by this will be - appended after any matching localversion* files, and after the value - set in CONFIG_LOCALVERSION. - - (The actual string used here is the first eight characters produced - by running the command: - - $ git rev-parse --verify HEAD - - which is done within the script "scripts/setlocalversion".) - -config HAVE_KERNEL_GZIP - bool - -config HAVE_KERNEL_BZIP2 - bool - -config HAVE_KERNEL_LZMA - bool - -config HAVE_KERNEL_XZ - bool - -config HAVE_KERNEL_LZO - bool - -choice - prompt "Kernel compression mode" - default KERNEL_GZIP - depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA || HAVE_KERNEL_XZ || HAVE_KERNEL_LZO - help - The linux kernel is a kind of self-extracting executable. - Several compression algorithms are available, which differ - in efficiency, compression and decompression speed. - Compression speed is only relevant when building a kernel. - Decompression speed is relevant at each boot. - - If you have any problems with bzip2 or lzma compressed - kernels, mail me (Alain Knaff) <alain@knaff.lu>. (An older - version of this functionality (bzip2 only), for 2.4, was - supplied by Christian Ludwig) - - High compression options are mostly useful for users, who - are low on disk space (embedded systems), but for whom ram - size matters less. - - If in doubt, select 'gzip' - -config KERNEL_GZIP - bool "Gzip" - depends on HAVE_KERNEL_GZIP - help - The old and tried gzip compression. It provides a good balance - between compression ratio and decompression speed. - -config KERNEL_BZIP2 - bool "Bzip2" - depends on HAVE_KERNEL_BZIP2 - help - Its compression ratio and speed is intermediate. - Decompression speed is slowest among the three. The kernel - size is about 10% smaller with bzip2, in comparison to gzip. - Bzip2 uses a large amount of memory. For modern kernels you - will need at least 8MB RAM or more for booting. - -config KERNEL_LZMA - bool "LZMA" - depends on HAVE_KERNEL_LZMA - help - The most recent compression algorithm. - Its ratio is best, decompression speed is between the other - two. Compression is slowest. The kernel size is about 33% - smaller with LZMA in comparison to gzip. - -config KERNEL_XZ - bool "XZ" - depends on HAVE_KERNEL_XZ - help - XZ uses the LZMA2 algorithm and instruction set specific - BCJ filters which can improve compression ratio of executable - code. The size of the kernel is about 30% smaller with XZ in - comparison to gzip. On architectures for which there is a BCJ - filter (i386, x86_64, ARM, IA-64, PowerPC, and SPARC), XZ - will create a few percent smaller kernel than plain LZMA. - - The speed is about the same as with LZMA: The decompression - speed of XZ is better than that of bzip2 but worse than gzip - and LZO. Compression is slow. - -config KERNEL_LZO - bool "LZO" - depends on HAVE_KERNEL_LZO - help - Its compression ratio is the poorest among the 4. The kernel - size is about 10% bigger than gzip; however its speed - (both compression and decompression) is the fastest. - -endchoice - -config DEFAULT_HOSTNAME - string "Default hostname" - default "(none)" - help - This option determines the default system hostname before userspace - calls sethostname(2). The kernel traditionally uses "(none)" here, - but you may wish to use a different default here to make a minimal - system more usable with less configuration. - -config SWAP - bool "Support for paging of anonymous memory (swap)" - depends on MMU && BLOCK - default y - help - This option allows you to choose whether you want to have support - for so called swap devices or swap files in your kernel that are - used to provide more virtual memory than the actual RAM present - in your computer. If unsure say Y. - -config SYSVIPC - bool "System V IPC" - ---help--- - Inter Process Communication is a suite of library functions and - system calls which let processes (running programs) synchronize and - exchange information. It is generally considered to be a good thing, - and some programs won't run unless you say Y here. In particular, if - you want to run the DOS emulator dosemu under Linux (read the - DOSEMU-HOWTO, available from <http://www.tldp.org/docs.html#howto>), - you'll need to say Y here. - - You can find documentation about IPC with "info ipc" and also in - section 6.4 of the Linux Programmer's Guide, available from - <http://www.tldp.org/guides.html>. - -config SYSVIPC_SYSCTL - bool - depends on SYSVIPC - depends on SYSCTL - default y - -config POSIX_MQUEUE - bool "POSIX Message Queues" - depends on NET && EXPERIMENTAL - ---help--- - POSIX variant of message queues is a part of IPC. In POSIX message - queues every message has a priority which decides about succession - of receiving it by a process. If you want to compile and run - programs written e.g. for Solaris with use of its POSIX message - queues (functions mq_*) say Y here. - - POSIX message queues are visible as a filesystem called 'mqueue' - and can be mounted somewhere if you want to do filesystem - operations on message queues. - - If unsure, say Y. - -config POSIX_MQUEUE_SYSCTL - bool - depends on POSIX_MQUEUE - depends on SYSCTL - default y - -config BSD_PROCESS_ACCT - bool "BSD Process Accounting" - help - If you say Y here, a user level program will be able to instruct the - kernel (via a special system call) to write process accounting - information to a file: whenever a process exits, information about - that process will be appended to the file by the kernel. The - information includes things such as creation time, owning user, - command name, memory usage, controlling terminal etc. (the complete - list is in the struct acct in <file:include/linux/acct.h>). It is - up to the user level program to do useful things with this - information. This is generally a good idea, so say Y. - -config BSD_PROCESS_ACCT_V3 - bool "BSD Process Accounting version 3 file format" - depends on BSD_PROCESS_ACCT - default n - help - If you say Y here, the process accounting information is written - in a new file format that also logs the process IDs of each - process and it's parent. Note that this file format is incompatible - with previous v0/v1/v2 file formats, so you will need updated tools - for processing it. A preliminary version of these tools is available - at <http://www.gnu.org/software/acct/>. - -config FHANDLE - bool "open by fhandle syscalls" - select EXPORTFS - help - If you say Y here, a user level program will be able to map - file names to handle and then later use the handle for - different file system operations. This is useful in implementing - userspace file servers, which now track files using handles instead - of names. The handle would remain the same even if file names - get renamed. Enables open_by_handle_at(2) and name_to_handle_at(2) - syscalls. - -config TASKSTATS - bool "Export task/process statistics through netlink (EXPERIMENTAL)" - depends on NET - default n - help - Export selected statistics for tasks/processes through the - generic netlink interface. Unlike BSD process accounting, the - statistics are available during the lifetime of tasks/processes as - responses to commands. Like BSD accounting, they are sent to user - space on task exit. - - Say N if unsure. - -config TASK_DELAY_ACCT - bool "Enable per-task delay accounting (EXPERIMENTAL)" - depends on TASKSTATS - help - Collect information on time spent by a task waiting for system - resources like cpu, synchronous block I/O completion and swapping - in pages. Such statistics can help in setting a task's priorities - relative to other tasks for cpu, io, rss limits etc. - - Say N if unsure. - -config TASK_XACCT - bool "Enable extended accounting over taskstats (EXPERIMENTAL)" - depends on TASKSTATS - help - Collect extended task accounting data and send the data - to userland for processing over the taskstats interface. - - Say N if unsure. - -config TASK_IO_ACCOUNTING - bool "Enable per-task storage I/O accounting (EXPERIMENTAL)" - depends on TASK_XACCT - help - Collect information on the number of bytes of storage I/O which this - task has caused. - - Say N if unsure. - -config AUDIT - bool "Auditing support" - depends on NET - help - Enable auditing infrastructure that can be used with another - kernel subsystem, such as SELinux (which requires this for - logging of avc messages output). Does not do system-call - auditing without CONFIG_AUDITSYSCALL. - -config AUDITSYSCALL - bool "Enable system-call auditing support" - depends on AUDIT && (X86 || PPC || S390 || IA64 || UML || SPARC64 || SUPERH || ARM) - default y if SECURITY_SELINUX - help - Enable low-overhead system-call auditing infrastructure that - can be used independently or with another kernel subsystem, - such as SELinux. - -config AUDIT_WATCH - def_bool y - depends on AUDITSYSCALL - select FSNOTIFY - -config AUDIT_TREE - def_bool y - depends on AUDITSYSCALL - select FSNOTIFY - -config AUDIT_LOGINUID_IMMUTABLE - bool "Make audit loginuid immutable" - depends on AUDIT - help - The config option toggles if a task setting its loginuid requires - CAP_SYS_AUDITCONTROL or if that task should require no special permissions - but should instead only allow setting its loginuid if it was never - previously set. On systems which use systemd or a similar central - process to restart login services this should be set to true. On older - systems in which an admin would typically have to directly stop and - start processes this should be set to false. Setting this to true allows - one to drop potentially dangerous capabilites from the login tasks, - but may not be backwards compatible with older init systems. - -source "kernel/irq/Kconfig" - -menu "RCU Subsystem" - -choice - prompt "RCU Implementation" - default TREE_RCU - -config TREE_RCU - bool "Tree-based hierarchical RCU" - depends on !PREEMPT && SMP - help - This option selects the RCU implementation that is - designed for very large SMP system with hundreds or - thousands of CPUs. It also scales down nicely to - smaller systems. - -config TREE_PREEMPT_RCU - bool "Preemptible tree-based hierarchical RCU" - depends on PREEMPT && SMP - help - This option selects the RCU implementation that is - designed for very large SMP systems with hundreds or - thousands of CPUs, but for which real-time response - is also required. It also scales down nicely to - smaller systems. - -config TINY_RCU - bool "UP-only small-memory-footprint RCU" - depends on !PREEMPT && !SMP - help - This option selects the RCU implementation that is - designed for UP systems from which real-time response - is not required. This option greatly reduces the - memory footprint of RCU. - -config TINY_PREEMPT_RCU - bool "Preemptible UP-only small-memory-footprint RCU" - depends on PREEMPT && !SMP - help - This option selects the RCU implementation that is designed - for real-time UP systems. This option greatly reduces the - memory footprint of RCU. - -endchoice - -config PREEMPT_RCU - def_bool ( TREE_PREEMPT_RCU || TINY_PREEMPT_RCU ) - help - This option enables preemptible-RCU code that is common between - the TREE_PREEMPT_RCU and TINY_PREEMPT_RCU implementations. - -config RCU_FANOUT - int "Tree-based hierarchical RCU fanout value" - range 2 64 if 64BIT - range 2 32 if !64BIT - depends on TREE_RCU || TREE_PREEMPT_RCU - default 64 if 64BIT - default 32 if !64BIT - help - This option controls the fanout of hierarchical implementations - of RCU, allowing RCU to work efficiently on machines with - large numbers of CPUs. This value must be at least the fourth - root of NR_CPUS, which allows NR_CPUS to be insanely large. - The default value of RCU_FANOUT should be used for production - systems, but if you are stress-testing the RCU implementation - itself, small RCU_FANOUT values allow you to test large-system - code paths on small(er) systems. - - Select a specific number if testing RCU itself. - Take the default if unsure. - -config RCU_FANOUT_EXACT - bool "Disable tree-based hierarchical RCU auto-balancing" - depends on TREE_RCU || TREE_PREEMPT_RCU - default n - help - This option forces use of the exact RCU_FANOUT value specified, - regardless of imbalances in the hierarchy. This is useful for - testing RCU itself, and might one day be useful on systems with - strong NUMA behavior. - - Without RCU_FANOUT_EXACT, the code will balance the hierarchy. - - Say N if unsure. - -config RCU_FAST_NO_HZ - bool "Accelerate last non-dyntick-idle CPU's grace periods" - depends on NO_HZ && SMP - default n - help - This option causes RCU to attempt to accelerate grace periods - in order to allow CPUs to enter dynticks-idle state more - quickly. On the other hand, this option increases the overhead - of the dynticks-idle checking, particularly on systems with - large numbers of CPUs. - - Say Y if energy efficiency is critically important, particularly - if you have relatively few CPUs. - - Say N if you are unsure. - -config TREE_RCU_TRACE - def_bool RCU_TRACE && ( TREE_RCU || TREE_PREEMPT_RCU ) - select DEBUG_FS - help - This option provides tracing for the TREE_RCU and - TREE_PREEMPT_RCU implementations, permitting Makefile to - trivially select kernel/rcutree_trace.c. - -config RCU_BOOST - bool "Enable RCU priority boosting" - depends on RT_MUTEXES && PREEMPT_RCU - default n - help - This option boosts the priority of preempted RCU readers that - block the current preemptible RCU grace period for too long. - This option also prevents heavy loads from blocking RCU - callback invocation for all flavors of RCU. - - Say Y here if you are working with real-time apps or heavy loads - Say N here if you are unsure. - -config RCU_BOOST_PRIO - int "Real-time priority to boost RCU readers to" - range 1 99 - depends on RCU_BOOST - default 1 - help - This option specifies the real-time priority to which preempted - RCU readers are to be boosted. If you are working with CPU-bound - real-time applications, you should specify a priority higher then - the highest-priority CPU-bound application. - - Specify the real-time priority, or take the default if unsure. - -config RCU_BOOST_DELAY - int "Milliseconds to delay boosting after RCU grace-period start" - range 0 3000 - depends on RCU_BOOST - default 500 - help - This option specifies the time to wait after the beginning of - a given grace period before priority-boosting preempted RCU - readers blocking that grace period. Note that any RCU reader - blocking an expedited RCU grace period is boosted immediately. - - Accept the default if unsure. - -endmenu # "RCU Subsystem" - -config IKCONFIG - tristate "Kernel .config support" - ---help--- - This option enables the complete Linux kernel ".config" file - contents to be saved in the kernel. It provides documentation - of which kernel options are used in a running kernel or in an - on-disk kernel. This information can be extracted from the kernel - image file with the script scripts/extract-ikconfig and used as - input to rebuild the current kernel or to build another kernel. - It can also be extracted from a running kernel by reading - /proc/config.gz if enabled (below). - -config IKCONFIG_PROC - bool "Enable access to .config through /proc/config.gz" - depends on IKCONFIG && PROC_FS - ---help--- - This option enables access to the kernel configuration file - through /proc/config.gz. - -config LOG_BUF_SHIFT - int "Kernel log buffer size (16 => 64KB, 17 => 128KB)" - range 12 21 - default 17 - help - Select kernel log buffer size as a power of 2. - Examples: - 17 => 128 KB - 16 => 64 KB - 15 => 32 KB - 14 => 16 KB - 13 => 8 KB - 12 => 4 KB - -# -# Architectures with an unreliable sched_clock() should select this: -# -config HAVE_UNSTABLE_SCHED_CLOCK - bool - -menuconfig CGROUPS - boolean "Control Group support" - depends on EVENTFD - help - This option adds support for grouping sets of processes together, for - use with process control subsystems such as Cpusets, CFS, memory - controls or device isolation. - See - - Documentation/scheduler/sched-design-CFS.txt (CFS) - - Documentation/cgroups/ (features for grouping, isolation - and resource control) - - Say N if unsure. - -if CGROUPS - -config CGROUP_DEBUG - bool "Example debug cgroup subsystem" - default n - help - This option enables a simple cgroup subsystem that - exports useful debugging information about the cgroups - framework. - - Say N if unsure. - -config CGROUP_FREEZER - bool "Freezer cgroup subsystem" - help - Provides a way to freeze and unfreeze all tasks in a - cgroup. - -config CGROUP_DEVICE - bool "Device controller for cgroups" - help - Provides a cgroup implementing whitelists for devices which - a process in the cgroup can mknod or open. - -config CPUSETS - bool "Cpuset support" - help - This option will let you create and manage CPUSETs which - allow dynamically partitioning a system into sets of CPUs and - Memory Nodes and assigning tasks to run only within those sets. - This is primarily useful on large SMP or NUMA systems. - - Say N if unsure. - -config PROC_PID_CPUSET - bool "Include legacy /proc/<pid>/cpuset file" - depends on CPUSETS - default y - -config CGROUP_CPUACCT - bool "Simple CPU accounting cgroup subsystem" - help - Provides a simple Resource Controller for monitoring the - total CPU consumed by the tasks in a cgroup. - -config RESOURCE_COUNTERS - bool "Resource counters" - help - This option enables controller independent resource accounting - infrastructure that works with cgroups. - -config CGROUP_MEM_RES_CTLR - bool "Memory Resource Controller for Control Groups" - depends on RESOURCE_COUNTERS - select MM_OWNER - help - Provides a memory resource controller that manages both anonymous - memory and page cache. (See Documentation/cgroups/memory.txt) - - Note that setting this option increases fixed memory overhead - associated with each page of memory in the system. By this, - 20(40)bytes/PAGE_SIZE on 32(64)bit system will be occupied by memory - usage tracking struct at boot. Total amount of this is printed out - at boot. - - Only enable when you're ok with these trade offs and really - sure you need the memory resource controller. Even when you enable - this, you can set "cgroup_disable=memory" at your boot option to - disable memory resource controller and you can avoid overheads. - (and lose benefits of memory resource controller) - - This config option also selects MM_OWNER config option, which - could in turn add some fork/exit overhead. - -config CGROUP_MEM_RES_CTLR_SWAP - bool "Memory Resource Controller Swap Extension" - depends on CGROUP_MEM_RES_CTLR && SWAP - help - Add swap management feature to memory resource controller. When you - enable this, you can limit mem+swap usage per cgroup. In other words, - when you disable this, memory resource controller has no cares to - usage of swap...a process can exhaust all of the swap. This extension - is useful when you want to avoid exhaustion swap but this itself - adds more overheads and consumes memory for remembering information. - Especially if you use 32bit system or small memory system, please - be careful about enabling this. When memory resource controller - is disabled by boot option, this will be automatically disabled and - there will be no overhead from this. Even when you set this config=y, - if boot option "swapaccount=0" is set, swap will not be accounted. - Now, memory usage of swap_cgroup is 2 bytes per entry. If swap page - size is 4096bytes, 512k per 1Gbytes of swap. -config CGROUP_MEM_RES_CTLR_SWAP_ENABLED - bool "Memory Resource Controller Swap Extension enabled by default" - depends on CGROUP_MEM_RES_CTLR_SWAP - default y - help - Memory Resource Controller Swap Extension comes with its price in - a bigger memory consumption. General purpose distribution kernels - which want to enable the feature but keep it disabled by default - and let the user enable it by swapaccount boot command line - parameter should have this option unselected. - For those who want to have the feature enabled by default should - select this option (if, for some reason, they need to disable it - then swapaccount=0 does the trick). -config CGROUP_MEM_RES_CTLR_KMEM - bool "Memory Resource Controller Kernel Memory accounting (EXPERIMENTAL)" - depends on CGROUP_MEM_RES_CTLR && EXPERIMENTAL - default n - help - The Kernel Memory extension for Memory Resource Controller can limit - the amount of memory used by kernel objects in the system. Those are - fundamentally different from the entities handled by the standard - Memory Controller, which are page-based, and can be swapped. Users of - the kmem extension can use it to guarantee that no group of processes - will ever exhaust kernel resources alone. - -config CGROUP_PERF - bool "Enable perf_event per-cpu per-container group (cgroup) monitoring" - depends on PERF_EVENTS && CGROUPS - help - This option extends the per-cpu mode to restrict monitoring to - threads which belong to the cgroup specified and run on the - designated cpu. - - Say N if unsure. - -menuconfig CGROUP_SCHED - bool "Group CPU scheduler" - default n - help - This feature lets CPU scheduler recognize task groups and control CPU - bandwidth allocation to such task groups. It uses cgroups to group - tasks. - -if CGROUP_SCHED -config FAIR_GROUP_SCHED - bool "Group scheduling for SCHED_OTHER" - depends on CGROUP_SCHED - default CGROUP_SCHED - -config CFS_BANDWIDTH - bool "CPU bandwidth provisioning for FAIR_GROUP_SCHED" - depends on EXPERIMENTAL - depends on FAIR_GROUP_SCHED - default n - help - This option allows users to define CPU bandwidth rates (limits) for - tasks running within the fair group scheduler. Groups with no limit - set are considered to be unconstrained and will run with no - restriction. - See tip/Documentation/scheduler/sched-bwc.txt for more information. - -config RT_GROUP_SCHED - bool "Group scheduling for SCHED_RR/FIFO" - depends on EXPERIMENTAL - depends on CGROUP_SCHED - default n - help - This feature lets you explicitly allocate real CPU bandwidth - to task groups. If enabled, it will also make it impossible to - schedule realtime tasks for non-root users until you allocate - realtime bandwidth for them. - See Documentation/scheduler/sched-rt-group.txt for more information. - -endif #CGROUP_SCHED - -config BLK_CGROUP - tristate "Block IO controller" - depends on BLOCK - default n - ---help--- - Generic block IO controller cgroup interface. This is the common - cgroup interface which should be used by various IO controlling - policies. - - Currently, CFQ IO scheduler uses it to recognize task groups and - control disk bandwidth allocation (proportional time slice allocation) - to such task groups. It is also used by bio throttling logic in - block layer to implement upper limit in IO rates on a device. - - This option only enables generic Block IO controller infrastructure. - One needs to also enable actual IO controlling logic/policy. For - enabling proportional weight division of disk bandwidth in CFQ, set - CONFIG_CFQ_GROUP_IOSCHED=y; for enabling throttling policy, set - CONFIG_BLK_DEV_THROTTLING=y. - - See Documentation/cgroups/blkio-controller.txt for more information. - -config DEBUG_BLK_CGROUP - bool "Enable Block IO controller debugging" - depends on BLK_CGROUP - default n - ---help--- - Enable some debugging help. Currently it exports additional stat - files in a cgroup which can be useful for debugging. - -endif # CGROUPS - -config CHECKPOINT_RESTORE - bool "Checkpoint/restore support" if EXPERT - default n - help - Enables additional kernel features in a sake of checkpoint/restore. - In particular it adds auxiliary prctl codes to setup process text, - data and heap segment sizes, and a few additional /proc filesystem - entries. - - If unsure, say N here. - -menuconfig NAMESPACES - bool "Namespaces support" if EXPERT - default !EXPERT - help - Provides the way to make tasks work with different objects using - the same id. For example same IPC id may refer to different objects - or same user id or pid may refer to different tasks when used in - different namespaces. - -if NAMESPACES - -config UTS_NS - bool "UTS namespace" - default y - help - In this namespace tasks see different info provided with the - uname() system call - -config IPC_NS - bool "IPC namespace" - depends on (SYSVIPC || POSIX_MQUEUE) - default y - help - In this namespace tasks work with IPC ids which correspond to - different IPC objects in different namespaces. - -config USER_NS - bool "User namespace (EXPERIMENTAL)" - depends on EXPERIMENTAL - default y - help - This allows containers, i.e. vservers, to use user namespaces - to provide different user info for different servers. - If unsure, say N. - -config PID_NS - bool "PID Namespaces" - default y - help - Support process id namespaces. This allows having multiple - processes with the same pid as long as they are in different - pid namespaces. This is a building block of containers. - -config NET_NS - bool "Network namespace" - depends on NET - default y - help - Allow user space to create what appear to be multiple instances - of the network stack. - -endif # NAMESPACES - -config SCHED_AUTOGROUP - bool "Automatic process group scheduling" - select EVENTFD - select CGROUPS - select CGROUP_SCHED - select FAIR_GROUP_SCHED - help - This option optimizes the scheduler for common desktop workloads by - automatically creating and populating task groups. This separation - of workloads isolates aggressive CPU burners (like build jobs) from - desktop applications. Task group autogeneration is currently based - upon task session. - -config MM_OWNER - bool - -config SYSFS_DEPRECATED - bool "Enable deprecated sysfs features to support old userspace tools" - depends on SYSFS - default n - help - This option adds code that switches the layout of the "block" class - devices, to not show up in /sys/class/block/, but only in - /sys/block/. - - This switch is only active when the sysfs.deprecated=1 boot option is - passed or the SYSFS_DEPRECATED_V2 option is set. - - This option allows new kernels to run on old distributions and tools, - which might get confused by /sys/class/block/. Since 2007/2008 all - major distributions and tools handle this just fine. - - Recent distributions and userspace tools after 2009/2010 depend on - the existence of /sys/class/block/, and will not work with this - option enabled. - - Only if you are using a new kernel on an old distribution, you might - need to say Y here. - -config SYSFS_DEPRECATED_V2 - bool "Enable deprecated sysfs features by default" - default n - depends on SYSFS - depends on SYSFS_DEPRECATED - help - Enable deprecated sysfs by default. - - See the CONFIG_SYSFS_DEPRECATED option for more details about this - option. - - Only if you are using a new kernel on an old distribution, you might - need to say Y here. Even then, odds are you would not need it - enabled, you can always pass the boot option if absolutely necessary. - -config RELAY - bool "Kernel->user space relay support (formerly relayfs)" - help - This option enables support for relay interface support in - certain file systems (such as debugfs). - It is designed to provide an efficient mechanism for tools and - facilities to relay large amounts of data from kernel space to - user space. - - If unsure, say N. - -config BLK_DEV_INITRD - bool "Initial RAM filesystem and RAM disk (initramfs/initrd) support" - depends on BROKEN || !FRV - help - The initial RAM filesystem is a ramfs which is loaded by the - boot loader (loadlin or lilo) and that is mounted as root - before the normal boot procedure. It is typically used to - load modules needed to mount the "real" root file system, - etc. See <file:Documentation/initrd.txt> for details. - - If RAM disk support (BLK_DEV_RAM) is also included, this - also enables initial RAM disk (initrd) support and adds - 15 Kbytes (more on some other architectures) to the kernel size. - - If unsure say Y. - -if BLK_DEV_INITRD - -source "usr/Kconfig" - -endif - -config CC_OPTIMIZE_FOR_SIZE - bool "Optimize for size" - help - Enabling this option will pass "-Os" instead of "-O2" to gcc - resulting in a smaller kernel. - - If unsure, say Y. - -config SYSCTL - bool - -config ANON_INODES - bool - -config PANIC_TIMEOUT - int "Default panic timeout" - default 0 - help - Set default panic timeout. - -menuconfig EXPERT - bool "Configure standard kernel features (expert users)" - # Unhide debug options, to make the on-by-default options visible - select DEBUG_KERNEL - help - This option allows certain base kernel options and settings - to be disabled or tweaked. This is for specialized - environments which can tolerate a "non-standard" kernel. - Only use this if you really know what you are doing. - -config UID16 - bool "Enable 16-bit UID system calls" if EXPERT - depends on ARM || BLACKFIN || CRIS || FRV || H8300 || X86_32 || M68K || (S390 && !64BIT) || SUPERH || SPARC32 || (SPARC64 && COMPAT) || UML || (X86_64 && IA32_EMULATION) - default y - help - This enables the legacy 16-bit UID syscall wrappers. - -config SYSCTL_SYSCALL - bool "Sysctl syscall support" if EXPERT - depends on PROC_SYSCTL - default n - select SYSCTL - ---help--- - sys_sysctl uses binary paths that have been found challenging - to properly maintain and use. The interface in /proc/sys - using paths with ascii names is now the primary path to this - information. - - Almost nothing using the binary sysctl interface so if you are - trying to save some space it is probably safe to disable this, - making your kernel marginally smaller. - - If unsure say N here. - -config KALLSYMS - bool "Load all symbols for debugging/ksymoops" if EXPERT - default y - help - Say Y here to let the kernel print out symbolic crash information and - symbolic stack backtraces. This increases the size of the kernel - somewhat, as all symbols have to be loaded into the kernel image. - -config KALLSYMS_ALL - bool "Include all symbols in kallsyms" - depends on DEBUG_KERNEL && KALLSYMS - help - Normally kallsyms only contains the symbols of functions for nicer - OOPS messages and backtraces (i.e., symbols from the text and inittext - sections). This is sufficient for most cases. And only in very rare - cases (e.g., when a debugger is used) all symbols are required (e.g., - names of variables from the data sections, etc). - - This option makes sure that all symbols are loaded into the kernel - image (i.e., symbols from all sections) in cost of increased kernel - size (depending on the kernel configuration, it may be 300KiB or - something like this). - - Say N unless you really need all symbols. - -config HOTPLUG - bool "Support for hot-pluggable devices" if EXPERT - default y - help - This option is provided for the case where no hotplug or uevent - capabilities is wanted by the kernel. You should only consider - disabling this option for embedded systems that do not use modules, a - dynamic /dev tree, or dynamic device discovery. Just say Y. - -config PRINTK - default y - bool "Enable support for printk" if EXPERT - help - This option enables normal printk support. Removing it - eliminates most of the message strings from the kernel image - and makes the kernel more or less silent. As this makes it - very difficult to diagnose system problems, saying N here is - strongly discouraged. - -config BUG - bool "BUG() support" if EXPERT - default y - help - Disabling this option eliminates support for BUG and WARN, reducing - the size of your kernel image and potentially quietly ignoring - numerous fatal conditions. You should only consider disabling this - option for embedded systems with no facilities for reporting errors. - Just say Y. - -config ELF_CORE - default y - bool "Enable ELF core dumps" if EXPERT - help - Enable support for generating core dumps. Disabling saves about 4k. - - -config PCSPKR_PLATFORM - bool "Enable PC-Speaker support" if EXPERT - depends on HAVE_PCSPKR_PLATFORM - select I8253_LOCK - default y - help - This option allows to disable the internal PC-Speaker - support, saving some memory. - -config HAVE_PCSPKR_PLATFORM - bool - -config BASE_FULL - default y - bool "Enable full-sized data structures for core" if EXPERT - help - Disabling this option reduces the size of miscellaneous core - kernel data structures. This saves memory on small machines, - but may reduce performance. - -config FUTEX - bool "Enable futex support" if EXPERT - default y - select RT_MUTEXES - help - Disabling this option will cause the kernel to be built without - support for "fast userspace mutexes". The resulting kernel may not - run glibc-based applications correctly. - -config EPOLL - bool "Enable eventpoll support" if EXPERT - default y - select ANON_INODES - help - Disabling this option will cause the kernel to be built without - support for epoll family of system calls. - -config SIGNALFD - bool "Enable signalfd() system call" if EXPERT - select ANON_INODES - default y - help - Enable the signalfd() system call that allows to receive signals - on a file descriptor. - - If unsure, say Y. - -config TIMERFD - bool "Enable timerfd() system call" if EXPERT - select ANON_INODES - default y - help - Enable the timerfd() system call that allows to receive timer - events on a file descriptor. - - If unsure, say Y. - -config EVENTFD - bool "Enable eventfd() system call" if EXPERT - select ANON_INODES - default y - help - Enable the eventfd() system call that allows to receive both - kernel notification (ie. KAIO) or userspace notifications. - - If unsure, say Y. - -config SHMEM - bool "Use full shmem filesystem" if EXPERT - default y - depends on MMU - help - The shmem is an internal filesystem used to manage shared memory. - It is backed by swap and manages resource limits. It is also exported - to userspace as tmpfs if TMPFS is enabled. Disabling this - option replaces shmem and tmpfs with the much simpler ramfs code, - which may be appropriate on small systems without swap. - -config AIO - bool "Enable AIO support" if EXPERT - default y - help - This option enables POSIX asynchronous I/O which may by used - by some high performance threaded applications. Disabling - this option saves about 7k. - -config EMBEDDED - bool "Embedded system" - select EXPERT - help - This option should be enabled if compiling the kernel for - an embedded system so certain expert options are available - for configuration. - -config HAVE_PERF_EVENTS - bool - help - See tools/perf/design.txt for details. - -config PERF_USE_VMALLOC - bool - help - See tools/perf/design.txt for details - -menu "Kernel Performance Events And Counters" - -config PERF_EVENTS - bool "Kernel performance events and counters" - default y if (PROFILING || PERF_COUNTERS) - depends on HAVE_PERF_EVENTS - select ANON_INODES - select IRQ_WORK - help - Enable kernel support for various performance events provided - by software and hardware. - - Software events are supported either built-in or via the - use of generic tracepoints. - - Most modern CPUs support performance events via performance - counter registers. These registers count the number of certain - types of hw events: such as instructions executed, cachemisses - suffered, or branches mis-predicted - without slowing down the - kernel or applications. These registers can also trigger interrupts - when a threshold number of events have passed - and can thus be - used to profile the code that runs on that CPU. - - The Linux Performance Event subsystem provides an abstraction of - these software and hardware event capabilities, available via a - system call and used by the "perf" utility in tools/perf/. It - provides per task and per CPU counters, and it provides event - capabilities on top of those. - - Say Y if unsure. - -config PERF_COUNTERS - bool "Kernel performance counters (old config option)" - depends on HAVE_PERF_EVENTS - help - This config has been obsoleted by the PERF_EVENTS - config option - please see that one for details. - - It has no effect on the kernel whether you enable - it or not, it is a compatibility placeholder. - - Say N if unsure. - -config DEBUG_PERF_USE_VMALLOC - default n - bool "Debug: use vmalloc to back perf mmap() buffers" - depends on PERF_EVENTS && DEBUG_KERNEL - select PERF_USE_VMALLOC - help - Use vmalloc memory to back perf mmap() buffers. - - Mostly useful for debugging the vmalloc code on platforms - that don't require it. - - Say N if unsure. - -endmenu - -config VM_EVENT_COUNTERS - default y - bool "Enable VM event counters for /proc/vmstat" if EXPERT - help - VM event counters are needed for event counts to be shown. - This option allows the disabling of the VM event counters - on EXPERT systems. /proc/vmstat will only show page counts - if VM event counters are disabled. - -config PCI_QUIRKS - default y - bool "Enable PCI quirk workarounds" if EXPERT - depends on PCI - help - This enables workarounds for various PCI chipset - bugs/quirks. Disable this only if your target machine is - unaffected by PCI quirks. - -config SLUB_DEBUG - default y - bool "Enable SLUB debugging support" if EXPERT - depends on SLUB && SYSFS - help - SLUB has extensive debug support features. Disabling these can - result in significant savings in code size. This also disables - SLUB sysfs support. /sys/slab will not exist and there will be - no support for cache validation etc. - -config COMPAT_BRK - bool "Disable heap randomization" - default y - help - Randomizing heap placement makes heap exploits harder, but it - also breaks ancient binaries (including anything libc5 based). - This option changes the bootup default to heap randomization - disabled, and can be overridden at runtime by setting - /proc/sys/kernel/randomize_va_space to 2. - - On non-ancient distros (post-2000 ones) N is usually a safe choice. - -choice - prompt "Choose SLAB allocator" - default SLUB - help - This option allows to select a slab allocator. - -config SLAB - bool "SLAB" - help - The regular slab allocator that is established and known to work - well in all environments. It organizes cache hot objects in - per cpu and per node queues. - -config SLUB - bool "SLUB (Unqueued Allocator)" - help - SLUB is a slab allocator that minimizes cache line usage - instead of managing queues of cached objects (SLAB approach). - Per cpu caching is realized using slabs of objects instead - of queues of objects. SLUB can use memory efficiently - and has enhanced diagnostics. SLUB is the default choice for - a slab allocator. - -config SLOB - depends on EXPERT - bool "SLOB (Simple Allocator)" - help - SLOB replaces the stock allocator with a drastically simpler - allocator. SLOB is generally more space efficient but - does not perform as well on large systems. - -endchoice - -config MMAP_ALLOW_UNINITIALIZED - bool "Allow mmapped anonymous memory to be uninitialized" - depends on EXPERT && !MMU - default n - help - Normally, and according to the Linux spec, anonymous memory obtained - from mmap() has it's contents cleared before it is passed to - userspace. Enabling this config option allows you to request that - mmap() skip that if it is given an MAP_UNINITIALIZED flag, thus - providing a huge performance boost. If this option is not enabled, - then the flag will be ignored. - - This is taken advantage of by uClibc's malloc(), and also by - ELF-FDPIC binfmt's brk and stack allocator. - - Because of the obvious security issues, this option should only be - enabled on embedded devices where you control what is run in - userspace. Since that isn't generally a problem on no-MMU systems, - it is normally safe to say Y here. - - See Documentation/nommu-mmap.txt for more information. - -config PROFILING - bool "Profiling support" - help - Say Y here to enable the extended profiling support mechanisms used - by profilers such as OProfile. - -# -# Place an empty function call at each tracepoint site. Can be -# dynamically changed for a probe function. -# -config TRACEPOINTS - bool - -source "arch/Kconfig" - -endmenu # General setup - -config HAVE_GENERIC_DMA_COHERENT - bool - default n - -config SLABINFO - bool - depends on PROC_FS - depends on SLAB || SLUB_DEBUG - default y - -config RT_MUTEXES - boolean - -config BASE_SMALL - int - default 0 if BASE_FULL - default 1 if !BASE_FULL - -menuconfig MODULES - bool "Enable loadable module support" - help - Kernel modules are small pieces of compiled code which can - be inserted in the running kernel, rather than being - permanently built into the kernel. You use the "modprobe" - tool to add (and sometimes remove) them. If you say Y here, - many parts of the kernel can be built as modules (by - answering M instead of Y where indicated): this is most - useful for infrequently used options which are not required - for booting. For more information, see the man pages for - modprobe, lsmod, modinfo, insmod and rmmod. - - If you say Y here, you will need to run "make - modules_install" to put the modules under /lib/modules/ - where modprobe can find them (you may need to be root to do - this). - - If unsure, say Y. - -if MODULES - -config MODULE_FORCE_LOAD - bool "Forced module loading" - default n - help - Allow loading of modules without version information (ie. modprobe - --force). Forced module loading sets the 'F' (forced) taint flag and - is usually a really bad idea. - -config MODULE_UNLOAD - bool "Module unloading" - help - Without this option you will not be able to unload any - modules (note that some modules may not be unloadable - anyway), which makes your kernel smaller, faster - and simpler. If unsure, say Y. - -config MODULE_FORCE_UNLOAD - bool "Forced module unloading" - depends on MODULE_UNLOAD && EXPERIMENTAL - help - This option allows you to force a module to unload, even if the - kernel believes it is unsafe: the kernel will remove the module - without waiting for anyone to stop using it (using the -f option to - rmmod). This is mainly for kernel developers and desperate users. - If unsure, say N. - -config MODVERSIONS - bool "Module versioning support" - help - Usually, you have to use modules compiled with your kernel. - Saying Y here makes it sometimes possible to use modules - compiled for different kernels, by adding enough information - to the modules to (hopefully) spot any changes which would - make them incompatible with the kernel you are running. If - unsure, say N. - -config MODULE_SRCVERSION_ALL - bool "Source checksum for all modules" - help - Modules which contain a MODULE_VERSION get an extra "srcversion" - field inserted into their modinfo section, which contains a - sum of the source files which made it. This helps maintainers - see exactly which source was used to build a module (since - others sometimes change the module source without updating - the version). With this option, such a "srcversion" field - will be created for all modules. If unsure, say N. - -endif # MODULES - -config INIT_ALL_POSSIBLE - bool - help - Back when each arch used to define their own cpu_online_mask and - cpu_possible_mask, some of them chose to initialize cpu_possible_mask - with all 1s, and others with all 0s. When they were centralised, - it was better to provide this option than to break all the archs - and have several arch maintainers pursuing me down dark alleys. - -config STOP_MACHINE - bool - default y - depends on (SMP && MODULE_UNLOAD) || HOTPLUG_CPU - help - Need stop_machine() primitive. - -source "block/Kconfig" - -config PREEMPT_NOTIFIERS - bool - -config PADATA - depends on SMP - bool - -source "kernel/Kconfig.locks" diff --git a/ANDROID_3.4.5/init/Makefile b/ANDROID_3.4.5/init/Makefile deleted file mode 100644 index 0bf677aa..00000000 --- a/ANDROID_3.4.5/init/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -# -# Makefile for the linux kernel. -# - -obj-y := main.o version.o mounts.o -ifneq ($(CONFIG_BLK_DEV_INITRD),y) -obj-y += noinitramfs.o -else -obj-$(CONFIG_BLK_DEV_INITRD) += initramfs.o -endif -obj-$(CONFIG_GENERIC_CALIBRATE_DELAY) += calibrate.o - -mounts-y := do_mounts.o -mounts-$(CONFIG_BLK_DEV_RAM) += do_mounts_rd.o -mounts-$(CONFIG_BLK_DEV_INITRD) += do_mounts_initrd.o -mounts-$(CONFIG_BLK_DEV_MD) += do_mounts_md.o - -# dependencies on generated files need to be listed explicitly -$(obj)/version.o: include/generated/compile.h - -# compile.h changes depending on hostname, generation number, etc, -# so we regenerate it always. -# mkcompile_h will make sure to only update the -# actual file if its content has changed. - - chk_compile.h = : - quiet_chk_compile.h = echo ' CHK $@' -silent_chk_compile.h = : -include/generated/compile.h: FORCE - @$($(quiet)chk_compile.h) - $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \ - "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CC) $(KBUILD_CFLAGS)" diff --git a/ANDROID_3.4.5/init/calibrate.c b/ANDROID_3.4.5/init/calibrate.c deleted file mode 100644 index fda0a7b0..00000000 --- a/ANDROID_3.4.5/init/calibrate.c +++ /dev/null @@ -1,301 +0,0 @@ -/* calibrate.c: default delay calibration - * - * Excised from init/main.c - * Copyright (C) 1991, 1992 Linus Torvalds - */ - -#include <linux/jiffies.h> -#include <linux/delay.h> -#include <linux/init.h> -#include <linux/timex.h> -#include <linux/smp.h> -#include <linux/percpu.h> - -unsigned long lpj_fine; -unsigned long preset_lpj; -static int __init lpj_setup(char *str) -{ - preset_lpj = simple_strtoul(str,NULL,0); - return 1; -} - -__setup("lpj=", lpj_setup); - -#ifdef ARCH_HAS_READ_CURRENT_TIMER - -/* This routine uses the read_current_timer() routine and gets the - * loops per jiffy directly, instead of guessing it using delay(). - * Also, this code tries to handle non-maskable asynchronous events - * (like SMIs) - */ -#define DELAY_CALIBRATION_TICKS ((HZ < 100) ? 1 : (HZ/100)) -#define MAX_DIRECT_CALIBRATION_RETRIES 5 - -static unsigned long __cpuinit calibrate_delay_direct(void) -{ - unsigned long pre_start, start, post_start; - unsigned long pre_end, end, post_end; - unsigned long start_jiffies; - unsigned long timer_rate_min, timer_rate_max; - unsigned long good_timer_sum = 0; - unsigned long good_timer_count = 0; - unsigned long measured_times[MAX_DIRECT_CALIBRATION_RETRIES]; - int max = -1; /* index of measured_times with max/min values or not set */ - int min = -1; - int i; - - if (read_current_timer(&pre_start) < 0 ) - return 0; - - /* - * A simple loop like - * while ( jiffies < start_jiffies+1) - * start = read_current_timer(); - * will not do. As we don't really know whether jiffy switch - * happened first or timer_value was read first. And some asynchronous - * event can happen between these two events introducing errors in lpj. - * - * So, we do - * 1. pre_start <- When we are sure that jiffy switch hasn't happened - * 2. check jiffy switch - * 3. start <- timer value before or after jiffy switch - * 4. post_start <- When we are sure that jiffy switch has happened - * - * Note, we don't know anything about order of 2 and 3. - * Now, by looking at post_start and pre_start difference, we can - * check whether any asynchronous event happened or not - */ - - for (i = 0; i < MAX_DIRECT_CALIBRATION_RETRIES; i++) { - pre_start = 0; - read_current_timer(&start); - start_jiffies = jiffies; - while (time_before_eq(jiffies, start_jiffies + 1)) { - pre_start = start; - read_current_timer(&start); - } - read_current_timer(&post_start); - - pre_end = 0; - end = post_start; - while (time_before_eq(jiffies, start_jiffies + 1 + - DELAY_CALIBRATION_TICKS)) { - pre_end = end; - read_current_timer(&end); - } - read_current_timer(&post_end); - - timer_rate_max = (post_end - pre_start) / - DELAY_CALIBRATION_TICKS; - timer_rate_min = (pre_end - post_start) / - DELAY_CALIBRATION_TICKS; - - /* - * If the upper limit and lower limit of the timer_rate is - * >= 12.5% apart, redo calibration. - */ - if (start >= post_end) - printk(KERN_NOTICE "calibrate_delay_direct() ignoring " - "timer_rate as we had a TSC wrap around" - " start=%lu >=post_end=%lu\n", - start, post_end); - if (start < post_end && pre_start != 0 && pre_end != 0 && - (timer_rate_max - timer_rate_min) < (timer_rate_max >> 3)) { - good_timer_count++; - good_timer_sum += timer_rate_max; - measured_times[i] = timer_rate_max; - if (max < 0 || timer_rate_max > measured_times[max]) - max = i; - if (min < 0 || timer_rate_max < measured_times[min]) - min = i; - } else - measured_times[i] = 0; - - } - - /* - * Find the maximum & minimum - if they differ too much throw out the - * one with the largest difference from the mean and try again... - */ - while (good_timer_count > 1) { - unsigned long estimate; - unsigned long maxdiff; - - /* compute the estimate */ - estimate = (good_timer_sum/good_timer_count); - maxdiff = estimate >> 3; - - /* if range is within 12% let's take it */ - if ((measured_times[max] - measured_times[min]) < maxdiff) - return estimate; - - /* ok - drop the worse value and try again... */ - good_timer_sum = 0; - good_timer_count = 0; - if ((measured_times[max] - estimate) < - (estimate - measured_times[min])) { - printk(KERN_NOTICE "calibrate_delay_direct() dropping " - "min bogoMips estimate %d = %lu\n", - min, measured_times[min]); - measured_times[min] = 0; - min = max; - } else { - printk(KERN_NOTICE "calibrate_delay_direct() dropping " - "max bogoMips estimate %d = %lu\n", - max, measured_times[max]); - measured_times[max] = 0; - max = min; - } - - for (i = 0; i < MAX_DIRECT_CALIBRATION_RETRIES; i++) { - if (measured_times[i] == 0) - continue; - good_timer_count++; - good_timer_sum += measured_times[i]; - if (measured_times[i] < measured_times[min]) - min = i; - if (measured_times[i] > measured_times[max]) - max = i; - } - - } - - printk(KERN_NOTICE "calibrate_delay_direct() failed to get a good " - "estimate for loops_per_jiffy.\nProbably due to long platform " - "interrupts. Consider using \"lpj=\" boot option.\n"); - return 0; -} -#else -static unsigned long __cpuinit calibrate_delay_direct(void) {return 0;} -#endif - -/* - * This is the number of bits of precision for the loops_per_jiffy. Each - * time we refine our estimate after the first takes 1.5/HZ seconds, so try - * to start with a good estimate. - * For the boot cpu we can skip the delay calibration and assign it a value - * calculated based on the timer frequency. - * For the rest of the CPUs we cannot assume that the timer frequency is same as - * the cpu frequency, hence do the calibration for those. - */ -#define LPS_PREC 8 - -static unsigned long __cpuinit calibrate_delay_converge(void) -{ - /* First stage - slowly accelerate to find initial bounds */ - unsigned long lpj, lpj_base, ticks, loopadd, loopadd_base, chop_limit; - int trials = 0, band = 0, trial_in_band = 0; - - lpj = (1<<12); - - /* wait for "start of" clock tick */ - ticks = jiffies; - while (ticks == jiffies) - ; /* nothing */ - /* Go .. */ - ticks = jiffies; - do { - if (++trial_in_band == (1<<band)) { - ++band; - trial_in_band = 0; - } - __delay(lpj * band); - trials += band; - } while (ticks == jiffies); - /* - * We overshot, so retreat to a clear underestimate. Then estimate - * the largest likely undershoot. This defines our chop bounds. - */ - trials -= band; - loopadd_base = lpj * band; - lpj_base = lpj * trials; - -recalibrate: - lpj = lpj_base; - loopadd = loopadd_base; - - /* - * Do a binary approximation to get lpj set to - * equal one clock (up to LPS_PREC bits) - */ - chop_limit = lpj >> LPS_PREC; - while (loopadd > chop_limit) { - lpj += loopadd; - ticks = jiffies; - while (ticks == jiffies) - ; /* nothing */ - ticks = jiffies; - __delay(lpj); - if (jiffies != ticks) /* longer than 1 tick */ - lpj -= loopadd; - loopadd >>= 1; - } - /* - * If we incremented every single time possible, presume we've - * massively underestimated initially, and retry with a higher - * start, and larger range. (Only seen on x86_64, due to SMIs) - */ - if (lpj + loopadd * 2 == lpj_base + loopadd_base * 2) { - lpj_base = lpj; - loopadd_base <<= 2; - goto recalibrate; - } - - return lpj; -} - -static DEFINE_PER_CPU(unsigned long, cpu_loops_per_jiffy) = { 0 }; - -/* - * Check if cpu calibration delay is already known. For example, - * some processors with multi-core sockets may have all cores - * with the same calibration delay. - * - * Architectures should override this function if a faster calibration - * method is available. - */ -unsigned long __attribute__((weak)) __cpuinit calibrate_delay_is_known(void) -{ - return 0; -} - -void __cpuinit calibrate_delay(void) -{ - unsigned long lpj; - static bool printed; - int this_cpu = smp_processor_id(); - - if (per_cpu(cpu_loops_per_jiffy, this_cpu)) { - lpj = per_cpu(cpu_loops_per_jiffy, this_cpu); - if (!printed) - pr_info("Calibrating delay loop (skipped) " - "already calibrated this CPU"); - } else if (preset_lpj) { - lpj = preset_lpj; - if (!printed) - pr_info("Calibrating delay loop (skipped) " - "preset value.. "); - } else if ((!printed) && lpj_fine) { - lpj = lpj_fine; - pr_info("Calibrating delay loop (skipped), " - "value calculated using timer frequency.. "); - } else if ((lpj = calibrate_delay_is_known())) { - ; - } else if ((lpj = calibrate_delay_direct()) != 0) { - if (!printed) - pr_info("Calibrating delay using timer " - "specific routine.. "); - } else { - if (!printed) - pr_info("Calibrating delay loop... "); - lpj = calibrate_delay_converge(); - } - per_cpu(cpu_loops_per_jiffy, this_cpu) = lpj; - if (!printed) - pr_cont("%lu.%02lu BogoMIPS (lpj=%lu)\n", - lpj/(500000/HZ), - (lpj/(5000/HZ)) % 100, lpj); - - loops_per_jiffy = lpj; - printed = true; -} diff --git a/ANDROID_3.4.5/init/do_mounts.c b/ANDROID_3.4.5/init/do_mounts.c deleted file mode 100644 index 42b0707c..00000000 --- a/ANDROID_3.4.5/init/do_mounts.c +++ /dev/null @@ -1,560 +0,0 @@ -#include <linux/module.h> -#include <linux/sched.h> -#include <linux/ctype.h> -#include <linux/fd.h> -#include <linux/tty.h> -#include <linux/suspend.h> -#include <linux/root_dev.h> -#include <linux/security.h> -#include <linux/delay.h> -#include <linux/genhd.h> -#include <linux/mount.h> -#include <linux/device.h> -#include <linux/init.h> -#include <linux/fs.h> -#include <linux/initrd.h> -#include <linux/async.h> -#include <linux/fs_struct.h> -#include <linux/slab.h> - -#include <linux/nfs_fs.h> -#include <linux/nfs_fs_sb.h> -#include <linux/nfs_mount.h> - -#include "do_mounts.h" - -int __initdata rd_doload; /* 1 = load RAM disk, 0 = don't load */ - -int root_mountflags = MS_RDONLY | MS_SILENT; -static char * __initdata root_device_name; -static char __initdata saved_root_name[64]; -static int root_wait; - -dev_t ROOT_DEV; - -static int __init load_ramdisk(char *str) -{ - rd_doload = simple_strtol(str,NULL,0) & 3; - return 1; -} -__setup("load_ramdisk=", load_ramdisk); - -static int __init readonly(char *str) -{ - if (*str) - return 0; - root_mountflags |= MS_RDONLY; - return 1; -} - -static int __init readwrite(char *str) -{ - if (*str) - return 0; - root_mountflags &= ~MS_RDONLY; - return 1; -} - -__setup("ro", readonly); -__setup("rw", readwrite); - -#ifdef CONFIG_BLOCK -/** - * match_dev_by_uuid - callback for finding a partition using its uuid - * @dev: device passed in by the caller - * @data: opaque pointer to a 36 byte char array with a UUID - * - * Returns 1 if the device matches, and 0 otherwise. - */ -static int match_dev_by_uuid(struct device *dev, void *data) -{ - u8 *uuid = data; - struct hd_struct *part = dev_to_part(dev); - - if (!part->info) - goto no_match; - - if (memcmp(uuid, part->info->uuid, sizeof(part->info->uuid))) - goto no_match; - - return 1; -no_match: - return 0; -} - - -/** - * devt_from_partuuid - looks up the dev_t of a partition by its UUID - * @uuid: min 36 byte char array containing a hex ascii UUID - * - * The function will return the first partition which contains a matching - * UUID value in its partition_meta_info struct. This does not search - * by filesystem UUIDs. - * - * If @uuid is followed by a "/PARTNROFF=%d", then the number will be - * extracted and used as an offset from the partition identified by the UUID. - * - * Returns the matching dev_t on success or 0 on failure. - */ -static dev_t devt_from_partuuid(char *uuid_str) -{ - dev_t res = 0; - struct device *dev = NULL; - u8 uuid[16]; - struct gendisk *disk; - struct hd_struct *part; - int offset = 0; - - if (strlen(uuid_str) < 36) - goto done; - - /* Check for optional partition number offset attributes. */ - if (uuid_str[36]) { - char c = 0; - /* Explicitly fail on poor PARTUUID syntax. */ - if (sscanf(&uuid_str[36], - "/PARTNROFF=%d%c", &offset, &c) != 1) { - printk(KERN_ERR "VFS: PARTUUID= is invalid.\n" - "Expected PARTUUID=<valid-uuid-id>[/PARTNROFF=%%d]\n"); - if (root_wait) - printk(KERN_ERR - "Disabling rootwait; root= is invalid.\n"); - root_wait = 0; - goto done; - } - } - - /* Pack the requested UUID in the expected format. */ - part_pack_uuid(uuid_str, uuid); - - dev = class_find_device(&block_class, NULL, uuid, &match_dev_by_uuid); - if (!dev) - goto done; - - res = dev->devt; - - /* Attempt to find the partition by offset. */ - if (!offset) - goto no_offset; - - res = 0; - disk = part_to_disk(dev_to_part(dev)); - part = disk_get_part(disk, dev_to_part(dev)->partno + offset); - if (part) { - res = part_devt(part); - put_device(part_to_dev(part)); - } - -no_offset: - put_device(dev); -done: - return res; -} -#endif - -/* - * Convert a name into device number. We accept the following variants: - * - * 1) device number in hexadecimal represents itself - * 2) /dev/nfs represents Root_NFS (0xff) - * 3) /dev/<disk_name> represents the device number of disk - * 4) /dev/<disk_name><decimal> represents the device number - * of partition - device number of disk plus the partition number - * 5) /dev/<disk_name>p<decimal> - same as the above, that form is - * used when disk name of partitioned disk ends on a digit. - * 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the - * unique id of a partition if the partition table provides it. - * 7) PARTUUID=<UUID>/PARTNROFF=<int> to select a partition in relation to - * a partition with a known unique id. - * - * If name doesn't have fall into the categories above, we return (0,0). - * block_class is used to check if something is a disk name. If the disk - * name contains slashes, the device name has them replaced with - * bangs. - */ - -dev_t name_to_dev_t(char *name) -{ - char s[32]; - char *p; - dev_t res = 0; - int part; - -#ifdef CONFIG_BLOCK - if (strncmp(name, "PARTUUID=", 9) == 0) { - name += 9; - res = devt_from_partuuid(name); - if (!res) - goto fail; - goto done; - } -#endif - - if (strncmp(name, "/dev/", 5) != 0) { - unsigned maj, min; - - if (sscanf(name, "%u:%u", &maj, &min) == 2) { - res = MKDEV(maj, min); - if (maj != MAJOR(res) || min != MINOR(res)) - goto fail; - } else { - res = new_decode_dev(simple_strtoul(name, &p, 16)); - if (*p) - goto fail; - } - goto done; - } - - name += 5; - res = Root_NFS; - if (strcmp(name, "nfs") == 0) - goto done; - res = Root_RAM0; - if (strcmp(name, "ram") == 0) - goto done; - - if (strlen(name) > 31) - goto fail; - strcpy(s, name); - for (p = s; *p; p++) - if (*p == '/') - *p = '!'; - res = blk_lookup_devt(s, 0); - if (res) - goto done; - - /* - * try non-existent, but valid partition, which may only exist - * after revalidating the disk, like partitioned md devices - */ - while (p > s && isdigit(p[-1])) - p--; - if (p == s || !*p || *p == '0') - goto fail; - - /* try disk name without <part number> */ - part = simple_strtoul(p, NULL, 10); - *p = '\0'; - res = blk_lookup_devt(s, part); - if (res) - goto done; - - /* try disk name without p<part number> */ - if (p < s + 2 || !isdigit(p[-2]) || p[-1] != 'p') - goto fail; - p[-1] = '\0'; - res = blk_lookup_devt(s, part); - if (res) - goto done; - -fail: - return 0; -done: - return res; -} - -static int __init root_dev_setup(char *line) -{ - strlcpy(saved_root_name, line, sizeof(saved_root_name)); - return 1; -} - -__setup("root=", root_dev_setup); - -static int __init rootwait_setup(char *str) -{ - if (*str) - return 0; - root_wait = 1; - return 1; -} - -__setup("rootwait", rootwait_setup); - -static char * __initdata root_mount_data; -static int __init root_data_setup(char *str) -{ - root_mount_data = str; - return 1; -} - -static char * __initdata root_fs_names; -static int __init fs_names_setup(char *str) -{ - root_fs_names = str; - return 1; -} - -static unsigned int __initdata root_delay; -static int __init root_delay_setup(char *str) -{ - root_delay = simple_strtoul(str, NULL, 0); - return 1; -} - -__setup("rootflags=", root_data_setup); -__setup("rootfstype=", fs_names_setup); -__setup("rootdelay=", root_delay_setup); - -static void __init get_fs_names(char *page) -{ - char *s = page; - - if (root_fs_names) { - strcpy(page, root_fs_names); - while (*s++) { - if (s[-1] == ',') - s[-1] = '\0'; - } - } else { - int len = get_filesystem_list(page); - char *p, *next; - - page[len] = '\0'; - for (p = page-1; p; p = next) { - next = strchr(++p, '\n'); - if (*p++ != '\t') - continue; - while ((*s++ = *p++) != '\n') - ; - s[-1] = '\0'; - } - } - *s = '\0'; -} - -static int __init do_mount_root(char *name, char *fs, int flags, void *data) -{ - struct super_block *s; - int err = sys_mount(name, "/root", fs, flags, data); - if (err) - return err; - - sys_chdir((const char __user __force *)"/root"); - s = current->fs->pwd.dentry->d_sb; - ROOT_DEV = s->s_dev; - printk(KERN_INFO - "VFS: Mounted root (%s filesystem)%s on device %u:%u.\n", - s->s_type->name, - s->s_flags & MS_RDONLY ? " readonly" : "", - MAJOR(ROOT_DEV), MINOR(ROOT_DEV)); - return 0; -} - -void __init mount_block_root(char *name, int flags) -{ - char *fs_names = __getname_gfp(GFP_KERNEL - | __GFP_NOTRACK_FALSE_POSITIVE); - char *p; -#ifdef CONFIG_BLOCK - char b[BDEVNAME_SIZE]; -#else - const char *b = name; -#endif - - get_fs_names(fs_names); -retry: - for (p = fs_names; *p; p += strlen(p)+1) { - int err = do_mount_root(name, p, flags, root_mount_data); - switch (err) { - case 0: - goto out; - case -EACCES: - flags |= MS_RDONLY; - goto retry; - case -EINVAL: - continue; - } - /* - * Allow the user to distinguish between failed sys_open - * and bad superblock on root device. - * and give them a list of the available devices - */ -#ifdef CONFIG_BLOCK - __bdevname(ROOT_DEV, b); -#endif - printk("VFS: Cannot open root device \"%s\" or %s: error %d\n", - root_device_name, b, err); - printk("Please append a correct \"root=\" boot option; here are the available partitions:\n"); - - printk_all_partitions(); -#ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT - printk("DEBUG_BLOCK_EXT_DEVT is enabled, you need to specify " - "explicit textual name for \"root=\" boot option.\n"); -#endif - panic("VFS: Unable to mount root fs on %s", b); - } - - printk("List of all partitions:\n"); - printk_all_partitions(); - printk("No filesystem could mount root, tried: "); - for (p = fs_names; *p; p += strlen(p)+1) - printk(" %s", p); - printk("\n"); -#ifdef CONFIG_BLOCK - __bdevname(ROOT_DEV, b); -#endif - panic("VFS: Unable to mount root fs on %s", b); -out: - putname(fs_names); -} - -#ifdef CONFIG_ROOT_NFS - -#define NFSROOT_TIMEOUT_MIN 5 -#define NFSROOT_TIMEOUT_MAX 30 -#define NFSROOT_RETRY_MAX 5 - -static int __init mount_nfs_root(void) -{ - char *root_dev, *root_data; - unsigned int timeout; - int try, err; - - err = nfs_root_data(&root_dev, &root_data); - if (err != 0) - return 0; - - /* - * The server or network may not be ready, so try several - * times. Stop after a few tries in case the client wants - * to fall back to other boot methods. - */ - timeout = NFSROOT_TIMEOUT_MIN; - for (try = 1; ; try++) { - err = do_mount_root(root_dev, "nfs", - root_mountflags, root_data); - if (err == 0) - return 1; - if (try > NFSROOT_RETRY_MAX) - break; - - /* Wait, in case the server refused us immediately */ - ssleep(timeout); - timeout <<= 1; - if (timeout > NFSROOT_TIMEOUT_MAX) - timeout = NFSROOT_TIMEOUT_MAX; - } - return 0; -} -#endif - -#if defined(CONFIG_BLK_DEV_RAM) || defined(CONFIG_BLK_DEV_FD) -void __init change_floppy(char *fmt, ...) -{ - struct termios termios; - char buf[80]; - char c; - int fd; - va_list args; - va_start(args, fmt); - vsprintf(buf, fmt, args); - va_end(args); - fd = sys_open("/dev/root", O_RDWR | O_NDELAY, 0); - if (fd >= 0) { - sys_ioctl(fd, FDEJECT, 0); - sys_close(fd); - } - printk(KERN_NOTICE "VFS: Insert %s and press ENTER\n", buf); - fd = sys_open("/dev/console", O_RDWR, 0); - if (fd >= 0) { - sys_ioctl(fd, TCGETS, (long)&termios); - termios.c_lflag &= ~ICANON; - sys_ioctl(fd, TCSETSF, (long)&termios); - sys_read(fd, &c, 1); - termios.c_lflag |= ICANON; - sys_ioctl(fd, TCSETSF, (long)&termios); - sys_close(fd); - } -} -#endif - -void __init mount_root(void) -{ -#ifdef CONFIG_ROOT_NFS - if (ROOT_DEV == Root_NFS) { - if (mount_nfs_root()) - return; - - printk(KERN_ERR "VFS: Unable to mount root fs via NFS, trying floppy.\n"); - ROOT_DEV = Root_FD0; - } -#endif -#ifdef CONFIG_BLK_DEV_FD - if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) { - /* rd_doload is 2 for a dual initrd/ramload setup */ - if (rd_doload==2) { - if (rd_load_disk(1)) { - ROOT_DEV = Root_RAM1; - root_device_name = NULL; - } - } else - change_floppy("root floppy"); - } -#endif -#ifdef CONFIG_BLOCK - create_dev("/dev/root", ROOT_DEV); - mount_block_root("/dev/root", root_mountflags); -#endif -} - -/* - * Prepare the namespace - decide what/where to mount, load ramdisks, etc. - */ -void __init prepare_namespace(void) -{ - int is_floppy; - - if (root_delay) { - printk(KERN_INFO "Waiting %dsec before mounting root device...\n", - root_delay); - ssleep(root_delay); - } - - /* - * wait for the known devices to complete their probing - * - * Note: this is a potential source of long boot delays. - * For example, it is not atypical to wait 5 seconds here - * for the touchpad of a laptop to initialize. - */ - wait_for_device_probe(); - - md_run_setup(); - - if (saved_root_name[0]) { - root_device_name = saved_root_name; - if (!strncmp(root_device_name, "mtd", 3) || - !strncmp(root_device_name, "ubi", 3)) { - mount_block_root(root_device_name, root_mountflags); - goto out; - } - ROOT_DEV = name_to_dev_t(root_device_name); - if (strncmp(root_device_name, "/dev/", 5) == 0) - root_device_name += 5; - } - - if (initrd_load()) - goto out; - - /* wait for any asynchronous scanning to complete */ - if ((ROOT_DEV == 0) && root_wait) { - printk(KERN_INFO "Waiting for root device %s...\n", - saved_root_name); - while (driver_probe_done() != 0 || - (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0) - msleep(100); - async_synchronize_full(); - } - - is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR; - - if (is_floppy && rd_doload && rd_load_disk(0)) - ROOT_DEV = Root_RAM0; - - mount_root(); -out: - devtmpfs_mount("dev"); - sys_mount(".", "/", NULL, MS_MOVE, NULL); - sys_chroot((const char __user __force *)"."); -} diff --git a/ANDROID_3.4.5/init/do_mounts.h b/ANDROID_3.4.5/init/do_mounts.h deleted file mode 100644 index f5b978a9..00000000 --- a/ANDROID_3.4.5/init/do_mounts.h +++ /dev/null @@ -1,76 +0,0 @@ -#include <linux/kernel.h> -#include <linux/blkdev.h> -#include <linux/init.h> -#include <linux/syscalls.h> -#include <linux/unistd.h> -#include <linux/slab.h> -#include <linux/mount.h> -#include <linux/major.h> -#include <linux/root_dev.h> - -void change_floppy(char *fmt, ...); -void mount_block_root(char *name, int flags); -void mount_root(void); -extern int root_mountflags; - -static inline int create_dev(char *name, dev_t dev) -{ - sys_unlink(name); - return sys_mknod(name, S_IFBLK|0600, new_encode_dev(dev)); -} - -#if BITS_PER_LONG == 32 -static inline u32 bstat(char *name) -{ - struct stat64 stat; - if (sys_stat64(name, &stat) != 0) - return 0; - if (!S_ISBLK(stat.st_mode)) - return 0; - if (stat.st_rdev != (u32)stat.st_rdev) - return 0; - return stat.st_rdev; -} -#else -static inline u32 bstat(char *name) -{ - struct stat stat; - if (sys_newstat(name, &stat) != 0) - return 0; - if (!S_ISBLK(stat.st_mode)) - return 0; - return stat.st_rdev; -} -#endif - -#ifdef CONFIG_BLK_DEV_RAM - -int __init rd_load_disk(int n); -int __init rd_load_image(char *from); - -#else - -static inline int rd_load_disk(int n) { return 0; } -static inline int rd_load_image(char *from) { return 0; } - -#endif - -#ifdef CONFIG_BLK_DEV_INITRD - -int __init initrd_load(void); - -#else - -static inline int initrd_load(void) { return 0; } - -#endif - -#ifdef CONFIG_BLK_DEV_MD - -void md_run_setup(void); - -#else - -static inline void md_run_setup(void) {} - -#endif diff --git a/ANDROID_3.4.5/init/do_mounts_initrd.c b/ANDROID_3.4.5/init/do_mounts_initrd.c deleted file mode 100644 index 9047330c..00000000 --- a/ANDROID_3.4.5/init/do_mounts_initrd.c +++ /dev/null @@ -1,125 +0,0 @@ -#include <linux/unistd.h> -#include <linux/kernel.h> -#include <linux/fs.h> -#include <linux/minix_fs.h> -#include <linux/romfs_fs.h> -#include <linux/initrd.h> -#include <linux/sched.h> -#include <linux/freezer.h> - -#include "do_mounts.h" - -unsigned long initrd_start, initrd_end; -int initrd_below_start_ok; -unsigned int real_root_dev; /* do_proc_dointvec cannot handle kdev_t */ -static int __initdata old_fd, root_fd; -static int __initdata mount_initrd = 1; - -static int __init no_initrd(char *str) -{ - mount_initrd = 0; - return 1; -} - -__setup("noinitrd", no_initrd); - -static int __init do_linuxrc(void *_shell) -{ - static const char *argv[] = { "linuxrc", NULL, }; - extern const char *envp_init[]; - const char *shell = _shell; - - sys_close(old_fd);sys_close(root_fd); - sys_setsid(); - return kernel_execve(shell, argv, envp_init); -} - -static void __init handle_initrd(void) -{ - int error; - int pid; - - real_root_dev = new_encode_dev(ROOT_DEV); - create_dev("/dev/root.old", Root_RAM0); - /* mount initrd on rootfs' /root */ - mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY); - sys_mkdir("/old", 0700); - root_fd = sys_open("/", 0, 0); - old_fd = sys_open("/old", 0, 0); - /* move initrd over / and chdir/chroot in initrd root */ - sys_chdir("/root"); - sys_mount(".", "/", NULL, MS_MOVE, NULL); - sys_chroot("."); - - /* - * In case that a resume from disk is carried out by linuxrc or one of - * its children, we need to tell the freezer not to wait for us. - */ - current->flags |= PF_FREEZER_SKIP; - - pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD); - if (pid > 0) - while (pid != sys_wait4(-1, NULL, 0, NULL)) - yield(); - - current->flags &= ~PF_FREEZER_SKIP; - - /* move initrd to rootfs' /old */ - sys_fchdir(old_fd); - sys_mount("/", ".", NULL, MS_MOVE, NULL); - /* switch root and cwd back to / of rootfs */ - sys_fchdir(root_fd); - sys_chroot("."); - sys_close(old_fd); - sys_close(root_fd); - - if (new_decode_dev(real_root_dev) == Root_RAM0) { - sys_chdir("/old"); - return; - } - - ROOT_DEV = new_decode_dev(real_root_dev); - mount_root(); - - printk(KERN_NOTICE "Trying to move old root to /initrd ... "); - error = sys_mount("/old", "/root/initrd", NULL, MS_MOVE, NULL); - if (!error) - printk("okay\n"); - else { - int fd = sys_open("/dev/root.old", O_RDWR, 0); - if (error == -ENOENT) - printk("/initrd does not exist. Ignored.\n"); - else - printk("failed\n"); - printk(KERN_NOTICE "Unmounting old root\n"); - sys_umount("/old", MNT_DETACH); - printk(KERN_NOTICE "Trying to free ramdisk memory ... "); - if (fd < 0) { - error = fd; - } else { - error = sys_ioctl(fd, BLKFLSBUF, 0); - sys_close(fd); - } - printk(!error ? "okay\n" : "failed\n"); - } -} - -int __init initrd_load(void) -{ - if (mount_initrd) { - create_dev("/dev/ram", Root_RAM0); - /* - * Load the initrd data into /dev/ram0. Execute it as initrd - * unless /dev/ram0 is supposed to be our actual root device, - * in that case the ram disk is just set up here, and gets - * mounted in the normal path. - */ - if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) { - sys_unlink("/initrd.image"); - handle_initrd(); - return 1; - } - } - sys_unlink("/initrd.image"); - return 0; -} diff --git a/ANDROID_3.4.5/init/do_mounts_md.c b/ANDROID_3.4.5/init/do_mounts_md.c deleted file mode 100644 index 32c4799b..00000000 --- a/ANDROID_3.4.5/init/do_mounts_md.c +++ /dev/null @@ -1,302 +0,0 @@ -#include <linux/delay.h> -#include <linux/raid/md_u.h> -#include <linux/raid/md_p.h> - -#include "do_mounts.h" - -/* - * When md (and any require personalities) are compiled into the kernel - * (not a module), arrays can be assembles are boot time using with AUTODETECT - * where specially marked partitions are registered with md_autodetect_dev(), - * and with MD_BOOT where devices to be collected are given on the boot line - * with md=..... - * The code for that is here. - */ - -#ifdef CONFIG_MD_AUTODETECT -static int __initdata raid_noautodetect; -#else -static int __initdata raid_noautodetect=1; -#endif -static int __initdata raid_autopart; - -static struct { - int minor; - int partitioned; - int level; - int chunk; - char *device_names; -} md_setup_args[256] __initdata; - -static int md_setup_ents __initdata; - -/* - * Parse the command-line parameters given our kernel, but do not - * actually try to invoke the MD device now; that is handled by - * md_setup_drive after the low-level disk drivers have initialised. - * - * 27/11/1999: Fixed to work correctly with the 2.3 kernel (which - * assigns the task of parsing integer arguments to the - * invoked program now). Added ability to initialise all - * the MD devices (by specifying multiple "md=" lines) - * instead of just one. -- KTK - * 18May2000: Added support for persistent-superblock arrays: - * md=n,0,factor,fault,device-list uses RAID0 for device n - * md=n,-1,factor,fault,device-list uses LINEAR for device n - * md=n,device-list reads a RAID superblock from the devices - * elements in device-list are read by name_to_kdev_t so can be - * a hex number or something like /dev/hda1 /dev/sdb - * 2001-06-03: Dave Cinege <dcinege@psychosis.com> - * Shifted name_to_kdev_t() and related operations to md_set_drive() - * for later execution. Rewrote section to make devfs compatible. - */ -static int __init md_setup(char *str) -{ - int minor, level, factor, fault, partitioned = 0; - char *pername = ""; - char *str1; - int ent; - - if (*str == 'd') { - partitioned = 1; - str++; - } - if (get_option(&str, &minor) != 2) { /* MD Number */ - printk(KERN_WARNING "md: Too few arguments supplied to md=.\n"); - return 0; - } - str1 = str; - for (ent=0 ; ent< md_setup_ents ; ent++) - if (md_setup_args[ent].minor == minor && - md_setup_args[ent].partitioned == partitioned) { - printk(KERN_WARNING "md: md=%s%d, Specified more than once. " - "Replacing previous definition.\n", partitioned?"d":"", minor); - break; - } - if (ent >= ARRAY_SIZE(md_setup_args)) { - printk(KERN_WARNING "md: md=%s%d - too many md initialisations\n", partitioned?"d":"", minor); - return 0; - } - if (ent >= md_setup_ents) - md_setup_ents++; - switch (get_option(&str, &level)) { /* RAID level */ - case 2: /* could be 0 or -1.. */ - if (level == 0 || level == LEVEL_LINEAR) { - if (get_option(&str, &factor) != 2 || /* Chunk Size */ - get_option(&str, &fault) != 2) { - printk(KERN_WARNING "md: Too few arguments supplied to md=.\n"); - return 0; - } - md_setup_args[ent].level = level; - md_setup_args[ent].chunk = 1 << (factor+12); - if (level == LEVEL_LINEAR) - pername = "linear"; - else - pername = "raid0"; - break; - } - /* FALL THROUGH */ - case 1: /* the first device is numeric */ - str = str1; - /* FALL THROUGH */ - case 0: - md_setup_args[ent].level = LEVEL_NONE; - pername="super-block"; - } - - printk(KERN_INFO "md: Will configure md%d (%s) from %s, below.\n", - minor, pername, str); - md_setup_args[ent].device_names = str; - md_setup_args[ent].partitioned = partitioned; - md_setup_args[ent].minor = minor; - - return 1; -} - -static void __init md_setup_drive(void) -{ - int minor, i, ent, partitioned; - dev_t dev; - dev_t devices[MD_SB_DISKS+1]; - - for (ent = 0; ent < md_setup_ents ; ent++) { - int fd; - int err = 0; - char *devname; - mdu_disk_info_t dinfo; - char name[16]; - - minor = md_setup_args[ent].minor; - partitioned = md_setup_args[ent].partitioned; - devname = md_setup_args[ent].device_names; - - sprintf(name, "/dev/md%s%d", partitioned?"_d":"", minor); - if (partitioned) - dev = MKDEV(mdp_major, minor << MdpMinorShift); - else - dev = MKDEV(MD_MAJOR, minor); - create_dev(name, dev); - for (i = 0; i < MD_SB_DISKS && devname != NULL; i++) { - char *p; - char comp_name[64]; - u32 rdev; - - p = strchr(devname, ','); - if (p) - *p++ = 0; - - dev = name_to_dev_t(devname); - if (strncmp(devname, "/dev/", 5) == 0) - devname += 5; - snprintf(comp_name, 63, "/dev/%s", devname); - rdev = bstat(comp_name); - if (rdev) - dev = new_decode_dev(rdev); - if (!dev) { - printk(KERN_WARNING "md: Unknown device name: %s\n", devname); - break; - } - - devices[i] = dev; - - devname = p; - } - devices[i] = 0; - - if (!i) - continue; - - printk(KERN_INFO "md: Loading md%s%d: %s\n", - partitioned ? "_d" : "", minor, - md_setup_args[ent].device_names); - - fd = sys_open(name, 0, 0); - if (fd < 0) { - printk(KERN_ERR "md: open failed - cannot start " - "array %s\n", name); - continue; - } - if (sys_ioctl(fd, SET_ARRAY_INFO, 0) == -EBUSY) { - printk(KERN_WARNING - "md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n", - minor); - sys_close(fd); - continue; - } - - if (md_setup_args[ent].level != LEVEL_NONE) { - /* non-persistent */ - mdu_array_info_t ainfo; - ainfo.level = md_setup_args[ent].level; - ainfo.size = 0; - ainfo.nr_disks =0; - ainfo.raid_disks =0; - while (devices[ainfo.raid_disks]) - ainfo.raid_disks++; - ainfo.md_minor =minor; - ainfo.not_persistent = 1; - - ainfo.state = (1 << MD_SB_CLEAN); - ainfo.layout = 0; - ainfo.chunk_size = md_setup_args[ent].chunk; - err = sys_ioctl(fd, SET_ARRAY_INFO, (long)&ainfo); - for (i = 0; !err && i <= MD_SB_DISKS; i++) { - dev = devices[i]; - if (!dev) - break; - dinfo.number = i; - dinfo.raid_disk = i; - dinfo.state = (1<<MD_DISK_ACTIVE)|(1<<MD_DISK_SYNC); - dinfo.major = MAJOR(dev); - dinfo.minor = MINOR(dev); - err = sys_ioctl(fd, ADD_NEW_DISK, (long)&dinfo); - } - } else { - /* persistent */ - for (i = 0; i <= MD_SB_DISKS; i++) { - dev = devices[i]; - if (!dev) - break; - dinfo.major = MAJOR(dev); - dinfo.minor = MINOR(dev); - sys_ioctl(fd, ADD_NEW_DISK, (long)&dinfo); - } - } - if (!err) - err = sys_ioctl(fd, RUN_ARRAY, 0); - if (err) - printk(KERN_WARNING "md: starting md%d failed\n", minor); - else { - /* reread the partition table. - * I (neilb) and not sure why this is needed, but I cannot - * boot a kernel with devfs compiled in from partitioned md - * array without it - */ - sys_close(fd); - fd = sys_open(name, 0, 0); - sys_ioctl(fd, BLKRRPART, 0); - } - sys_close(fd); - } -} - -static int __init raid_setup(char *str) -{ - int len, pos; - - len = strlen(str) + 1; - pos = 0; - - while (pos < len) { - char *comma = strchr(str+pos, ','); - int wlen; - if (comma) - wlen = (comma-str)-pos; - else wlen = (len-1)-pos; - - if (!strncmp(str, "noautodetect", wlen)) - raid_noautodetect = 1; - if (!strncmp(str, "autodetect", wlen)) - raid_noautodetect = 0; - if (strncmp(str, "partitionable", wlen)==0) - raid_autopart = 1; - if (strncmp(str, "part", wlen)==0) - raid_autopart = 1; - pos += wlen+1; - } - return 1; -} - -__setup("raid=", raid_setup); -__setup("md=", md_setup); - -static void __init autodetect_raid(void) -{ - int fd; - - /* - * Since we don't want to detect and use half a raid array, we need to - * wait for the known devices to complete their probing - */ - printk(KERN_INFO "md: Waiting for all devices to be available before autodetect\n"); - printk(KERN_INFO "md: If you don't use raid, use raid=noautodetect\n"); - - wait_for_device_probe(); - - fd = sys_open((const char __user __force *) "/dev/md0", 0, 0); - if (fd >= 0) { - sys_ioctl(fd, RAID_AUTORUN, raid_autopart); - sys_close(fd); - } -} - -void __init md_run_setup(void) -{ - create_dev("/dev/md0", MKDEV(MD_MAJOR, 0)); - - if (raid_noautodetect) - printk(KERN_INFO "md: Skipping autodetection of RAID arrays. (raid=autodetect will force)\n"); - else - autodetect_raid(); - md_setup_drive(); -} diff --git a/ANDROID_3.4.5/init/do_mounts_rd.c b/ANDROID_3.4.5/init/do_mounts_rd.c deleted file mode 100644 index 6212586d..00000000 --- a/ANDROID_3.4.5/init/do_mounts_rd.c +++ /dev/null @@ -1,340 +0,0 @@ - -#include <linux/kernel.h> -#include <linux/fs.h> -#include <linux/minix_fs.h> -#include <linux/ext2_fs.h> -#include <linux/romfs_fs.h> -#include <linux/cramfs_fs.h> -#include <linux/initrd.h> -#include <linux/string.h> -#include <linux/slab.h> - -#include "do_mounts.h" -#include "../fs/squashfs/squashfs_fs.h" - -#include <linux/decompress/generic.h> - - -int __initdata rd_prompt = 1;/* 1 = prompt for RAM disk, 0 = don't prompt */ - -static int __init prompt_ramdisk(char *str) -{ - rd_prompt = simple_strtol(str,NULL,0) & 1; - return 1; -} -__setup("prompt_ramdisk=", prompt_ramdisk); - -int __initdata rd_image_start; /* starting block # of image */ - -static int __init ramdisk_start_setup(char *str) -{ - rd_image_start = simple_strtol(str,NULL,0); - return 1; -} -__setup("ramdisk_start=", ramdisk_start_setup); - -static int __init crd_load(int in_fd, int out_fd, decompress_fn deco); - -/* - * This routine tries to find a RAM disk image to load, and returns the - * number of blocks to read for a non-compressed image, 0 if the image - * is a compressed image, and -1 if an image with the right magic - * numbers could not be found. - * - * We currently check for the following magic numbers: - * minix - * ext2 - * romfs - * cramfs - * squashfs - * gzip - */ -static int __init -identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor) -{ - const int size = 512; - struct minix_super_block *minixsb; - struct romfs_super_block *romfsb; - struct cramfs_super *cramfsb; - struct squashfs_super_block *squashfsb; - int nblocks = -1; - unsigned char *buf; - const char *compress_name; - unsigned long n; - - buf = kmalloc(size, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - minixsb = (struct minix_super_block *) buf; - romfsb = (struct romfs_super_block *) buf; - cramfsb = (struct cramfs_super *) buf; - squashfsb = (struct squashfs_super_block *) buf; - memset(buf, 0xe5, size); - - /* - * Read block 0 to test for compressed kernel - */ - sys_lseek(fd, start_block * BLOCK_SIZE, 0); - sys_read(fd, buf, size); - - *decompressor = decompress_method(buf, size, &compress_name); - if (compress_name) { - printk(KERN_NOTICE "RAMDISK: %s image found at block %d\n", - compress_name, start_block); - if (!*decompressor) - printk(KERN_EMERG - "RAMDISK: %s decompressor not configured!\n", - compress_name); - nblocks = 0; - goto done; - } - - /* romfs is at block zero too */ - if (romfsb->word0 == ROMSB_WORD0 && - romfsb->word1 == ROMSB_WORD1) { - printk(KERN_NOTICE - "RAMDISK: romfs filesystem found at block %d\n", - start_block); - nblocks = (ntohl(romfsb->size)+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS; - goto done; - } - - if (cramfsb->magic == CRAMFS_MAGIC) { - printk(KERN_NOTICE - "RAMDISK: cramfs filesystem found at block %d\n", - start_block); - nblocks = (cramfsb->size + BLOCK_SIZE - 1) >> BLOCK_SIZE_BITS; - goto done; - } - - /* squashfs is at block zero too */ - if (le32_to_cpu(squashfsb->s_magic) == SQUASHFS_MAGIC) { - printk(KERN_NOTICE - "RAMDISK: squashfs filesystem found at block %d\n", - start_block); - nblocks = (le64_to_cpu(squashfsb->bytes_used) + BLOCK_SIZE - 1) - >> BLOCK_SIZE_BITS; - goto done; - } - - /* - * Read 512 bytes further to check if cramfs is padded - */ - sys_lseek(fd, start_block * BLOCK_SIZE + 0x200, 0); - sys_read(fd, buf, size); - - if (cramfsb->magic == CRAMFS_MAGIC) { - printk(KERN_NOTICE - "RAMDISK: cramfs filesystem found at block %d\n", - start_block); - nblocks = (cramfsb->size + BLOCK_SIZE - 1) >> BLOCK_SIZE_BITS; - goto done; - } - - /* - * Read block 1 to test for minix and ext2 superblock - */ - sys_lseek(fd, (start_block+1) * BLOCK_SIZE, 0); - sys_read(fd, buf, size); - - /* Try minix */ - if (minixsb->s_magic == MINIX_SUPER_MAGIC || - minixsb->s_magic == MINIX_SUPER_MAGIC2) { - printk(KERN_NOTICE - "RAMDISK: Minix filesystem found at block %d\n", - start_block); - nblocks = minixsb->s_nzones << minixsb->s_log_zone_size; - goto done; - } - - /* Try ext2 */ - n = ext2_image_size(buf); - if (n) { - printk(KERN_NOTICE - "RAMDISK: ext2 filesystem found at block %d\n", - start_block); - nblocks = n; - goto done; - } - - printk(KERN_NOTICE - "RAMDISK: Couldn't find valid RAM disk image starting at %d.\n", - start_block); - -done: - sys_lseek(fd, start_block * BLOCK_SIZE, 0); - kfree(buf); - return nblocks; -} - -int __init rd_load_image(char *from) -{ - int res = 0; - int in_fd, out_fd; - unsigned long rd_blocks, devblocks; - int nblocks, i, disk; - char *buf = NULL; - unsigned short rotate = 0; - decompress_fn decompressor = NULL; -#if !defined(CONFIG_S390) - char rotator[4] = { '|' , '/' , '-' , '\\' }; -#endif - - out_fd = sys_open((const char __user __force *) "/dev/ram", O_RDWR, 0); - if (out_fd < 0) - goto out; - - in_fd = sys_open(from, O_RDONLY, 0); - if (in_fd < 0) - goto noclose_input; - - nblocks = identify_ramdisk_image(in_fd, rd_image_start, &decompressor); - if (nblocks < 0) - goto done; - - if (nblocks == 0) { - if (crd_load(in_fd, out_fd, decompressor) == 0) - goto successful_load; - goto done; - } - - /* - * NOTE NOTE: nblocks is not actually blocks but - * the number of kibibytes of data to load into a ramdisk. - * So any ramdisk block size that is a multiple of 1KiB should - * work when the appropriate ramdisk_blocksize is specified - * on the command line. - * - * The default ramdisk_blocksize is 1KiB and it is generally - * silly to use anything else, so make sure to use 1KiB - * blocksize while generating ext2fs ramdisk-images. - */ - if (sys_ioctl(out_fd, BLKGETSIZE, (unsigned long)&rd_blocks) < 0) - rd_blocks = 0; - else - rd_blocks >>= 1; - - if (nblocks > rd_blocks) { - printk("RAMDISK: image too big! (%dKiB/%ldKiB)\n", - nblocks, rd_blocks); - goto done; - } - - /* - * OK, time to copy in the data - */ - if (sys_ioctl(in_fd, BLKGETSIZE, (unsigned long)&devblocks) < 0) - devblocks = 0; - else - devblocks >>= 1; - - if (strcmp(from, "/initrd.image") == 0) - devblocks = nblocks; - - if (devblocks == 0) { - printk(KERN_ERR "RAMDISK: could not determine device size\n"); - goto done; - } - - buf = kmalloc(BLOCK_SIZE, GFP_KERNEL); - if (!buf) { - printk(KERN_ERR "RAMDISK: could not allocate buffer\n"); - goto done; - } - - printk(KERN_NOTICE "RAMDISK: Loading %dKiB [%ld disk%s] into ram disk... ", - nblocks, ((nblocks-1)/devblocks)+1, nblocks>devblocks ? "s" : ""); - for (i = 0, disk = 1; i < nblocks; i++) { - if (i && (i % devblocks == 0)) { - printk("done disk #%d.\n", disk++); - rotate = 0; - if (sys_close(in_fd)) { - printk("Error closing the disk.\n"); - goto noclose_input; - } - change_floppy("disk #%d", disk); - in_fd = sys_open(from, O_RDONLY, 0); - if (in_fd < 0) { - printk("Error opening disk.\n"); - goto noclose_input; - } - printk("Loading disk #%d... ", disk); - } - sys_read(in_fd, buf, BLOCK_SIZE); - sys_write(out_fd, buf, BLOCK_SIZE); -#if !defined(CONFIG_S390) - if (!(i % 16)) { - printk("%c\b", rotator[rotate & 0x3]); - rotate++; - } -#endif - } - printk("done.\n"); - -successful_load: - res = 1; -done: - sys_close(in_fd); -noclose_input: - sys_close(out_fd); -out: - kfree(buf); - sys_unlink((const char __user __force *) "/dev/ram"); - return res; -} - -int __init rd_load_disk(int n) -{ - if (rd_prompt) - change_floppy("root floppy disk to be loaded into RAM disk"); - create_dev("/dev/root", ROOT_DEV); - create_dev("/dev/ram", MKDEV(RAMDISK_MAJOR, n)); - return rd_load_image("/dev/root"); -} - -static int exit_code; -static int decompress_error; -static int crd_infd, crd_outfd; - -static int __init compr_fill(void *buf, unsigned int len) -{ - int r = sys_read(crd_infd, buf, len); - if (r < 0) - printk(KERN_ERR "RAMDISK: error while reading compressed data"); - else if (r == 0) - printk(KERN_ERR "RAMDISK: EOF while reading compressed data"); - return r; -} - -static int __init compr_flush(void *window, unsigned int outcnt) -{ - int written = sys_write(crd_outfd, window, outcnt); - if (written != outcnt) { - if (decompress_error == 0) - printk(KERN_ERR - "RAMDISK: incomplete write (%d != %d)\n", - written, outcnt); - decompress_error = 1; - return -1; - } - return outcnt; -} - -static void __init error(char *x) -{ - printk(KERN_ERR "%s\n", x); - exit_code = 1; - decompress_error = 1; -} - -static int __init crd_load(int in_fd, int out_fd, decompress_fn deco) -{ - int result; - crd_infd = in_fd; - crd_outfd = out_fd; - result = deco(NULL, 0, compr_fill, compr_flush, NULL, NULL, error); - if (decompress_error) - result = 1; - return result; -} diff --git a/ANDROID_3.4.5/init/initramfs.c b/ANDROID_3.4.5/init/initramfs.c deleted file mode 100644 index 8216c303..00000000 --- a/ANDROID_3.4.5/init/initramfs.c +++ /dev/null @@ -1,611 +0,0 @@ -#include <linux/init.h> -#include <linux/fs.h> -#include <linux/slab.h> -#include <linux/types.h> -#include <linux/fcntl.h> -#include <linux/delay.h> -#include <linux/string.h> -#include <linux/dirent.h> -#include <linux/syscalls.h> -#include <linux/utime.h> - -static __initdata char *message; -static void __init error(char *x) -{ - if (!message) - message = x; -} - -/* link hash */ - -#define N_ALIGN(len) ((((len) + 1) & ~3) + 2) - -static __initdata struct hash { - int ino, minor, major; - umode_t mode; - struct hash *next; - char name[N_ALIGN(PATH_MAX)]; -} *head[32]; - -static inline int hash(int major, int minor, int ino) -{ - unsigned long tmp = ino + minor + (major << 3); - tmp += tmp >> 5; - return tmp & 31; -} - -static char __init *find_link(int major, int minor, int ino, - umode_t mode, char *name) -{ - struct hash **p, *q; - for (p = head + hash(major, minor, ino); *p; p = &(*p)->next) { - if ((*p)->ino != ino) - continue; - if ((*p)->minor != minor) - continue; - if ((*p)->major != major) - continue; - if (((*p)->mode ^ mode) & S_IFMT) - continue; - return (*p)->name; - } - q = kmalloc(sizeof(struct hash), GFP_KERNEL); - if (!q) - panic("can't allocate link hash entry"); - q->major = major; - q->minor = minor; - q->ino = ino; - q->mode = mode; - strcpy(q->name, name); - q->next = NULL; - *p = q; - return NULL; -} - -static void __init free_hash(void) -{ - struct hash **p, *q; - for (p = head; p < head + 32; p++) { - while (*p) { - q = *p; - *p = q->next; - kfree(q); - } - } -} - -static long __init do_utime(char __user *filename, time_t mtime) -{ - struct timespec t[2]; - - t[0].tv_sec = mtime; - t[0].tv_nsec = 0; - t[1].tv_sec = mtime; - t[1].tv_nsec = 0; - - return do_utimes(AT_FDCWD, filename, t, AT_SYMLINK_NOFOLLOW); -} - -static __initdata LIST_HEAD(dir_list); -struct dir_entry { - struct list_head list; - char *name; - time_t mtime; -}; - -static void __init dir_add(const char *name, time_t mtime) -{ - struct dir_entry *de = kmalloc(sizeof(struct dir_entry), GFP_KERNEL); - if (!de) - panic("can't allocate dir_entry buffer"); - INIT_LIST_HEAD(&de->list); - de->name = kstrdup(name, GFP_KERNEL); - de->mtime = mtime; - list_add(&de->list, &dir_list); -} - -static void __init dir_utime(void) -{ - struct dir_entry *de, *tmp; - list_for_each_entry_safe(de, tmp, &dir_list, list) { - list_del(&de->list); - do_utime(de->name, de->mtime); - kfree(de->name); - kfree(de); - } -} - -static __initdata time_t mtime; - -/* cpio header parsing */ - -static __initdata unsigned long ino, major, minor, nlink; -static __initdata umode_t mode; -static __initdata unsigned long body_len, name_len; -static __initdata uid_t uid; -static __initdata gid_t gid; -static __initdata unsigned rdev; - -static void __init parse_header(char *s) -{ - unsigned long parsed[12]; - char buf[9]; - int i; - - buf[8] = '\0'; - for (i = 0, s += 6; i < 12; i++, s += 8) { - memcpy(buf, s, 8); - parsed[i] = simple_strtoul(buf, NULL, 16); - } - ino = parsed[0]; - mode = parsed[1]; - uid = parsed[2]; - gid = parsed[3]; - nlink = parsed[4]; - mtime = parsed[5]; - body_len = parsed[6]; - major = parsed[7]; - minor = parsed[8]; - rdev = new_encode_dev(MKDEV(parsed[9], parsed[10])); - name_len = parsed[11]; -} - -/* FSM */ - -static __initdata enum state { - Start, - Collect, - GotHeader, - SkipIt, - GotName, - CopyFile, - GotSymlink, - Reset -} state, next_state; - -static __initdata char *victim; -static __initdata unsigned count; -static __initdata loff_t this_header, next_header; - -static inline void __init eat(unsigned n) -{ - victim += n; - this_header += n; - count -= n; -} - -static __initdata char *vcollected; -static __initdata char *collected; -static __initdata int remains; -static __initdata char *collect; - -static void __init read_into(char *buf, unsigned size, enum state next) -{ - if (count >= size) { - collected = victim; - eat(size); - state = next; - } else { - collect = collected = buf; - remains = size; - next_state = next; - state = Collect; - } -} - -static __initdata char *header_buf, *symlink_buf, *name_buf; - -static int __init do_start(void) -{ - read_into(header_buf, 110, GotHeader); - return 0; -} - -static int __init do_collect(void) -{ - unsigned n = remains; - if (count < n) - n = count; - memcpy(collect, victim, n); - eat(n); - collect += n; - if ((remains -= n) != 0) - return 1; - state = next_state; - return 0; -} - -static int __init do_header(void) -{ - if (memcmp(collected, "070707", 6)==0) { - error("incorrect cpio method used: use -H newc option"); - return 1; - } - if (memcmp(collected, "070701", 6)) { - error("no cpio magic"); - return 1; - } - parse_header(collected); - next_header = this_header + N_ALIGN(name_len) + body_len; - next_header = (next_header + 3) & ~3; - state = SkipIt; - if (name_len <= 0 || name_len > PATH_MAX) - return 0; - if (S_ISLNK(mode)) { - if (body_len > PATH_MAX) - return 0; - collect = collected = symlink_buf; - remains = N_ALIGN(name_len) + body_len; - next_state = GotSymlink; - state = Collect; - return 0; - } - if (S_ISREG(mode) || !body_len) - read_into(name_buf, N_ALIGN(name_len), GotName); - return 0; -} - -static int __init do_skip(void) -{ - if (this_header + count < next_header) { - eat(count); - return 1; - } else { - eat(next_header - this_header); - state = next_state; - return 0; - } -} - -static int __init do_reset(void) -{ - while(count && *victim == '\0') - eat(1); - if (count && (this_header & 3)) - error("broken padding"); - return 1; -} - -static int __init maybe_link(void) -{ - if (nlink >= 2) { - char *old = find_link(major, minor, ino, mode, collected); - if (old) - return (sys_link(old, collected) < 0) ? -1 : 1; - } - return 0; -} - -static void __init clean_path(char *path, umode_t mode) -{ - struct stat st; - - if (!sys_newlstat(path, &st) && (st.st_mode^mode) & S_IFMT) { - if (S_ISDIR(st.st_mode)) - sys_rmdir(path); - else - sys_unlink(path); - } -} - -static __initdata int wfd; - -static int __init do_name(void) -{ - state = SkipIt; - next_state = Reset; - if (strcmp(collected, "TRAILER!!!") == 0) { - free_hash(); - return 0; - } - clean_path(collected, mode); - if (S_ISREG(mode)) { - int ml = maybe_link(); - if (ml >= 0) { - int openflags = O_WRONLY|O_CREAT; - if (ml != 1) - openflags |= O_TRUNC; - wfd = sys_open(collected, openflags, mode); - - if (wfd >= 0) { - sys_fchown(wfd, uid, gid); - sys_fchmod(wfd, mode); - if (body_len) - sys_ftruncate(wfd, body_len); - vcollected = kstrdup(collected, GFP_KERNEL); - state = CopyFile; - } - } - } else if (S_ISDIR(mode)) { - sys_mkdir(collected, mode); - sys_chown(collected, uid, gid); - sys_chmod(collected, mode); - dir_add(collected, mtime); - } else if (S_ISBLK(mode) || S_ISCHR(mode) || - S_ISFIFO(mode) || S_ISSOCK(mode)) { - if (maybe_link() == 0) { - sys_mknod(collected, mode, rdev); - sys_chown(collected, uid, gid); - sys_chmod(collected, mode); - do_utime(collected, mtime); - } - } - return 0; -} - -static int __init do_copy(void) -{ - if (count >= body_len) { - sys_write(wfd, victim, body_len); - sys_close(wfd); - do_utime(vcollected, mtime); - kfree(vcollected); - eat(body_len); - state = SkipIt; - return 0; - } else { - sys_write(wfd, victim, count); - body_len -= count; - eat(count); - return 1; - } -} - -static int __init do_symlink(void) -{ - collected[N_ALIGN(name_len) + body_len] = '\0'; - clean_path(collected, 0); - sys_symlink(collected + N_ALIGN(name_len), collected); - sys_lchown(collected, uid, gid); - do_utime(collected, mtime); - state = SkipIt; - next_state = Reset; - return 0; -} - -static __initdata int (*actions[])(void) = { - [Start] = do_start, - [Collect] = do_collect, - [GotHeader] = do_header, - [SkipIt] = do_skip, - [GotName] = do_name, - [CopyFile] = do_copy, - [GotSymlink] = do_symlink, - [Reset] = do_reset, -}; - -static int __init write_buffer(char *buf, unsigned len) -{ - count = len; - victim = buf; - - while (!actions[state]()) - ; - return len - count; -} - -static int __init flush_buffer(void *bufv, unsigned len) -{ - char *buf = (char *) bufv; - int written; - int origLen = len; - if (message) - return -1; - while ((written = write_buffer(buf, len)) < len && !message) { - char c = buf[written]; - if (c == '0') { - buf += written; - len -= written; - state = Start; - } else if (c == 0) { - buf += written; - len -= written; - state = Reset; - } else - error("junk in compressed archive"); - } - return origLen; -} - -static unsigned my_inptr; /* index of next byte to be processed in inbuf */ - -#include <linux/decompress/generic.h> - -static char * __init unpack_to_rootfs(char *buf, unsigned len) -{ - int written, res; - decompress_fn decompress; - const char *compress_name; - static __initdata char msg_buf[64]; - - header_buf = kmalloc(110, GFP_KERNEL); - symlink_buf = kmalloc(PATH_MAX + N_ALIGN(PATH_MAX) + 1, GFP_KERNEL); - name_buf = kmalloc(N_ALIGN(PATH_MAX), GFP_KERNEL); - - if (!header_buf || !symlink_buf || !name_buf) - panic("can't allocate buffers"); - - state = Start; - this_header = 0; - message = NULL; - while (!message && len) { - loff_t saved_offset = this_header; - if (*buf == '0' && !(this_header & 3)) { - state = Start; - written = write_buffer(buf, len); - buf += written; - len -= written; - continue; - } - if (!*buf) { - buf++; - len--; - this_header++; - continue; - } - this_header = 0; - decompress = decompress_method(buf, len, &compress_name); - if (decompress) { - res = decompress(buf, len, NULL, flush_buffer, NULL, - &my_inptr, error); - if (res) - error("decompressor failed"); - } else if (compress_name) { - if (!message) { - snprintf(msg_buf, sizeof msg_buf, - "compression method %s not configured", - compress_name); - message = msg_buf; - } - } else - error("junk in compressed archive"); - if (state != Reset) - error("junk in compressed archive"); - this_header = saved_offset + my_inptr; - buf += my_inptr; - len -= my_inptr; - } - dir_utime(); - kfree(name_buf); - kfree(symlink_buf); - kfree(header_buf); - return message; -} - -static int __initdata do_retain_initrd; - -static int __init retain_initrd_param(char *str) -{ - if (*str) - return 0; - do_retain_initrd = 1; - return 1; -} -__setup("retain_initrd", retain_initrd_param); - -extern char __initramfs_start[]; -extern unsigned long __initramfs_size; -#include <linux/initrd.h> -#include <linux/kexec.h> - -static void __init free_initrd(void) -{ -#ifdef CONFIG_KEXEC - unsigned long crashk_start = (unsigned long)__va(crashk_res.start); - unsigned long crashk_end = (unsigned long)__va(crashk_res.end); -#endif - if (do_retain_initrd) - goto skip; - -#ifdef CONFIG_KEXEC - /* - * If the initrd region is overlapped with crashkernel reserved region, - * free only memory that is not part of crashkernel region. - */ - if (initrd_start < crashk_end && initrd_end > crashk_start) { - /* - * Initialize initrd memory region since the kexec boot does - * not do. - */ - memset((void *)initrd_start, 0, initrd_end - initrd_start); - if (initrd_start < crashk_start) - free_initrd_mem(initrd_start, crashk_start); - if (initrd_end > crashk_end) - free_initrd_mem(crashk_end, initrd_end); - } else -#endif - free_initrd_mem(initrd_start, initrd_end); -skip: - initrd_start = 0; - initrd_end = 0; -} - -#ifdef CONFIG_BLK_DEV_RAM -#define BUF_SIZE 1024 -static void __init clean_rootfs(void) -{ - int fd; - void *buf; - struct linux_dirent64 *dirp; - int num; - - fd = sys_open((const char __user __force *) "/", O_RDONLY, 0); - WARN_ON(fd < 0); - if (fd < 0) - return; - buf = kzalloc(BUF_SIZE, GFP_KERNEL); - WARN_ON(!buf); - if (!buf) { - sys_close(fd); - return; - } - - dirp = buf; - num = sys_getdents64(fd, dirp, BUF_SIZE); - while (num > 0) { - while (num > 0) { - struct stat st; - int ret; - - ret = sys_newlstat(dirp->d_name, &st); - WARN_ON_ONCE(ret); - if (!ret) { - if (S_ISDIR(st.st_mode)) - sys_rmdir(dirp->d_name); - else - sys_unlink(dirp->d_name); - } - - num -= dirp->d_reclen; - dirp = (void *)dirp + dirp->d_reclen; - } - dirp = buf; - memset(buf, 0, BUF_SIZE); - num = sys_getdents64(fd, dirp, BUF_SIZE); - } - - sys_close(fd); - kfree(buf); -} -#endif - -static int __init populate_rootfs(void) -{ - char *err = unpack_to_rootfs(__initramfs_start, __initramfs_size); - if (err) - panic(err); /* Failed to decompress INTERNAL initramfs */ - if (initrd_start) { -#ifdef CONFIG_BLK_DEV_RAM - int fd; - printk(KERN_INFO "Trying to unpack rootfs image as initramfs...\n"); - err = unpack_to_rootfs((char *)initrd_start, - initrd_end - initrd_start); - if (!err) { - free_initrd(); - return 0; - } else { - clean_rootfs(); - unpack_to_rootfs(__initramfs_start, __initramfs_size); - } - printk(KERN_INFO "rootfs image is not initramfs (%s)" - "; looks like an initrd\n", err); - fd = sys_open((const char __user __force *) "/initrd.image", - O_WRONLY|O_CREAT, 0700); - if (fd >= 0) { - sys_write(fd, (char *)initrd_start, - initrd_end - initrd_start); - sys_close(fd); - free_initrd(); - } -#else - printk(KERN_INFO "Unpacking initramfs...\n"); - err = unpack_to_rootfs((char *)initrd_start, - initrd_end - initrd_start); - if (err) - printk(KERN_EMERG "Initramfs unpacking failed: %s\n", err); - free_initrd(); -#endif - } - return 0; -} -rootfs_initcall(populate_rootfs); diff --git a/ANDROID_3.4.5/init/main.c b/ANDROID_3.4.5/init/main.c deleted file mode 100644 index b08c5f75..00000000 --- a/ANDROID_3.4.5/init/main.c +++ /dev/null @@ -1,894 +0,0 @@ -/* - * linux/init/main.c - * - * Copyright (C) 1991, 1992 Linus Torvalds - * - * GK 2/5/95 - Changed to support mounting root fs via NFS - * Added initrd & change_root: Werner Almesberger & Hans Lermen, Feb '96 - * Moan early if gcc is old, avoiding bogus kernels - Paul Gortmaker, May '96 - * Simplified starting of init: Michael A. Griffith <grif@acm.org> - */ - -#include <linux/types.h> -#include <linux/module.h> -#include <linux/proc_fs.h> -#include <linux/kernel.h> -#include <linux/syscalls.h> -#include <linux/stackprotector.h> -#include <linux/string.h> -#include <linux/ctype.h> -#include <linux/delay.h> -#include <linux/ioport.h> -#include <linux/init.h> -#include <linux/initrd.h> -#include <linux/bootmem.h> -#include <linux/acpi.h> -#include <linux/tty.h> -#include <linux/percpu.h> -#include <linux/kmod.h> -#include <linux/vmalloc.h> -#include <linux/kernel_stat.h> -#include <linux/start_kernel.h> -#include <linux/security.h> -#include <linux/smp.h> -#include <linux/profile.h> -#include <linux/rcupdate.h> -#include <linux/moduleparam.h> -#include <linux/kallsyms.h> -#include <linux/writeback.h> -#include <linux/cpu.h> -#include <linux/cpuset.h> -#include <linux/cgroup.h> -#include <linux/efi.h> -#include <linux/tick.h> -#include <linux/interrupt.h> -#include <linux/taskstats_kern.h> -#include <linux/delayacct.h> -#include <linux/unistd.h> -#include <linux/rmap.h> -#include <linux/mempolicy.h> -#include <linux/key.h> -#include <linux/buffer_head.h> -#include <linux/page_cgroup.h> -#include <linux/debug_locks.h> -#include <linux/debugobjects.h> -#include <linux/lockdep.h> -#include <linux/kmemleak.h> -#include <linux/pid_namespace.h> -#include <linux/device.h> -#include <linux/kthread.h> -#include <linux/sched.h> -#include <linux/signal.h> -#include <linux/idr.h> -#include <linux/kgdb.h> -#include <linux/ftrace.h> -#include <linux/async.h> -#include <linux/kmemcheck.h> -#include <linux/sfi.h> -#include <linux/shmem_fs.h> -#include <linux/slab.h> -#include <linux/perf_event.h> - -#include <asm/io.h> -#include <asm/bugs.h> -#include <asm/setup.h> -#include <asm/sections.h> -#include <asm/cacheflush.h> - -#ifdef CONFIG_X86_LOCAL_APIC -#include <asm/smp.h> -#endif - -static int kernel_init(void *); - -extern void init_IRQ(void); -extern void fork_init(unsigned long); -extern void mca_init(void); -extern void sbus_init(void); -extern void prio_tree_init(void); -extern void radix_tree_init(void); -#ifndef CONFIG_DEBUG_RODATA -static inline void mark_rodata_ro(void) { } -#endif - -#ifdef CONFIG_TC -extern void tc_init(void); -#endif - -/* - * Debug helper: via this flag we know that we are in 'early bootup code' - * where only the boot processor is running with IRQ disabled. This means - * two things - IRQ must not be enabled before the flag is cleared and some - * operations which are not allowed with IRQ disabled are allowed while the - * flag is set. - */ -bool early_boot_irqs_disabled __read_mostly; - -enum system_states system_state __read_mostly; -EXPORT_SYMBOL(system_state); - -/* - * Boot command-line arguments - */ -#define MAX_INIT_ARGS CONFIG_INIT_ENV_ARG_LIMIT -#define MAX_INIT_ENVS CONFIG_INIT_ENV_ARG_LIMIT - -extern void time_init(void); -/* Default late time init is NULL. archs can override this later. */ -void (*__initdata late_time_init)(void); -extern void softirq_init(void); - -/* Untouched command line saved by arch-specific code. */ -char __initdata boot_command_line[COMMAND_LINE_SIZE]; -/* Untouched saved command line (eg. for /proc) */ -char *saved_command_line; -/* Command line for parameter parsing */ -static char *static_command_line; - -static char *execute_command; -static char *ramdisk_execute_command; - -/* - * If set, this is an indication to the drivers that reset the underlying - * device before going ahead with the initialization otherwise driver might - * rely on the BIOS and skip the reset operation. - * - * This is useful if kernel is booting in an unreliable environment. - * For ex. kdump situaiton where previous kernel has crashed, BIOS has been - * skipped and devices will be in unknown state. - */ -unsigned int reset_devices; -EXPORT_SYMBOL(reset_devices); - -static int __init set_reset_devices(char *str) -{ - reset_devices = 1; - return 1; -} - -__setup("reset_devices", set_reset_devices); - -static const char * argv_init[MAX_INIT_ARGS+2] = { "init", NULL, }; -const char * envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, }; -static const char *panic_later, *panic_param; - -extern const struct obs_kernel_param __setup_start[], __setup_end[]; - -static int __init obsolete_checksetup(char *line) -{ - const struct obs_kernel_param *p; - int had_early_param = 0; - - p = __setup_start; - do { - int n = strlen(p->str); - if (parameqn(line, p->str, n)) { - if (p->early) { - /* Already done in parse_early_param? - * (Needs exact match on param part). - * Keep iterating, as we can have early - * params and __setups of same names 8( */ - if (line[n] == '\0' || line[n] == '=') - had_early_param = 1; - } else if (!p->setup_func) { - printk(KERN_WARNING "Parameter %s is obsolete," - " ignored\n", p->str); - return 1; - } else if (p->setup_func(line + n)) - return 1; - } - p++; - } while (p < __setup_end); - - return had_early_param; -} - -/* - * This should be approx 2 Bo*oMips to start (note initial shift), and will - * still work even if initially too large, it will just take slightly longer - */ -unsigned long loops_per_jiffy = (1<<12); - -EXPORT_SYMBOL(loops_per_jiffy); - -static int __init debug_kernel(char *str) -{ - console_loglevel = 10; - return 0; -} - -static int __init quiet_kernel(char *str) -{ - console_loglevel = 4; - return 0; -} - -early_param("debug", debug_kernel); -early_param("quiet", quiet_kernel); - -static int __init loglevel(char *str) -{ - int newlevel; - - /* - * Only update loglevel value when a correct setting was passed, - * to prevent blind crashes (when loglevel being set to 0) that - * are quite hard to debug - */ - if (get_option(&str, &newlevel)) { - console_loglevel = newlevel; - return 0; - } - - return -EINVAL; -} - -early_param("loglevel", loglevel); - -/* Change NUL term back to "=", to make "param" the whole string. */ -static int __init repair_env_string(char *param, char *val) -{ - if (val) { - /* param=val or param="val"? */ - if (val == param+strlen(param)+1) - val[-1] = '='; - else if (val == param+strlen(param)+2) { - val[-2] = '='; - memmove(val-1, val, strlen(val)+1); - val--; - } else - BUG(); - } - return 0; -} - -/* - * Unknown boot options get handed to init, unless they look like - * unused parameters (modprobe will find them in /proc/cmdline). - */ -static int __init unknown_bootoption(char *param, char *val) -{ - repair_env_string(param, val); - - /* Handle obsolete-style parameters */ - if (obsolete_checksetup(param)) - return 0; - - /* Unused module parameter. */ - if (strchr(param, '.') && (!val || strchr(param, '.') < val)) - return 0; - - if (panic_later) - return 0; - - if (val) { - /* Environment option */ - unsigned int i; - for (i = 0; envp_init[i]; i++) { - if (i == MAX_INIT_ENVS) { - panic_later = "Too many boot env vars at `%s'"; - panic_param = param; - } - if (!strncmp(param, envp_init[i], val - param)) - break; - } - envp_init[i] = param; - } else { - /* Command line option */ - unsigned int i; - for (i = 0; argv_init[i]; i++) { - if (i == MAX_INIT_ARGS) { - panic_later = "Too many boot init vars at `%s'"; - panic_param = param; - } - } - argv_init[i] = param; - } - return 0; -} - -static int __init init_setup(char *str) -{ - unsigned int i; - - execute_command = str; - /* - * In case LILO is going to boot us with default command line, - * it prepends "auto" before the whole cmdline which makes - * the shell think it should execute a script with such name. - * So we ignore all arguments entered _before_ init=... [MJ] - */ - for (i = 1; i < MAX_INIT_ARGS; i++) - argv_init[i] = NULL; - return 1; -} -__setup("init=", init_setup); - -static int __init rdinit_setup(char *str) -{ - unsigned int i; - - ramdisk_execute_command = str; - /* See "auto" comment in init_setup */ - for (i = 1; i < MAX_INIT_ARGS; i++) - argv_init[i] = NULL; - return 1; -} -__setup("rdinit=", rdinit_setup); - -#ifndef CONFIG_SMP -static const unsigned int setup_max_cpus = NR_CPUS; -#ifdef CONFIG_X86_LOCAL_APIC -static void __init smp_init(void) -{ - APIC_init_uniprocessor(); -} -#else -#define smp_init() do { } while (0) -#endif - -static inline void setup_nr_cpu_ids(void) { } -static inline void smp_prepare_cpus(unsigned int maxcpus) { } -#endif - -/* - * We need to store the untouched command line for future reference. - * We also need to store the touched command line since the parameter - * parsing is performed in place, and we should allow a component to - * store reference of name/value for future reference. - */ -static void __init setup_command_line(char *command_line) -{ - saved_command_line = alloc_bootmem(strlen (boot_command_line)+1); - static_command_line = alloc_bootmem(strlen (command_line)+1); - strcpy (saved_command_line, boot_command_line); - strcpy (static_command_line, command_line); -} - -/* - * We need to finalize in a non-__init function or else race conditions - * between the root thread and the init thread may cause start_kernel to - * be reaped by free_initmem before the root thread has proceeded to - * cpu_idle. - * - * gcc-3.4 accidentally inlines this function, so use noinline. - */ - -static __initdata DECLARE_COMPLETION(kthreadd_done); - -static noinline void __init_refok rest_init(void) -{ - int pid; - - rcu_scheduler_starting(); - /* - * We need to spawn init first so that it obtains pid 1, however - * the init task will end up wanting to create kthreads, which, if - * we schedule it before we create kthreadd, will OOPS. - */ - kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); - numa_default_policy(); - pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); - rcu_read_lock(); - kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns); - rcu_read_unlock(); - complete(&kthreadd_done); - - /* - * The boot idle thread must execute schedule() - * at least once to get things moving: - */ - init_idle_bootup_task(current); - schedule_preempt_disabled(); - /* Call into cpu_idle with preempt disabled */ - cpu_idle(); -} - -/* Check for early params. */ -static int __init do_early_param(char *param, char *val) -{ - const struct obs_kernel_param *p; - - for (p = __setup_start; p < __setup_end; p++) { - if ((p->early && parameq(param, p->str)) || - (strcmp(param, "console") == 0 && - strcmp(p->str, "earlycon") == 0) - ) { - if (p->setup_func(val) != 0) - printk(KERN_WARNING - "Malformed early option '%s'\n", param); - } - } - /* We accept everything at this stage. */ - return 0; -} - -void __init parse_early_options(char *cmdline) -{ - parse_args("early options", cmdline, NULL, 0, 0, 0, do_early_param); -} - -/* Arch code calls this early on, or if not, just before other parsing. */ -void __init parse_early_param(void) -{ - static __initdata int done = 0; - static __initdata char tmp_cmdline[COMMAND_LINE_SIZE]; - - if (done) - return; - - /* All fall through to do_early_param. */ - strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); - parse_early_options(tmp_cmdline); - done = 1; -} - -/* - * Activate the first processor. - */ - -static void __init boot_cpu_init(void) -{ - int cpu = smp_processor_id(); - /* Mark the boot cpu "present", "online" etc for SMP and UP case */ - set_cpu_online(cpu, true); - set_cpu_active(cpu, true); - set_cpu_present(cpu, true); - set_cpu_possible(cpu, true); -} - -void __init __weak smp_setup_processor_id(void) -{ -} - -void __init __weak thread_info_cache_init(void) -{ -} - -/* - * Set up kernel memory allocators - */ -static void __init mm_init(void) -{ - /* - * page_cgroup requires contiguous pages, - * bigger than MAX_ORDER unless SPARSEMEM. - */ - page_cgroup_init_flatmem(); - mem_init(); - kmem_cache_init(); - percpu_init_late(); - pgtable_cache_init(); - vmalloc_init(); -} - -asmlinkage void __init start_kernel(void) -{ - char * command_line; - extern const struct kernel_param __start___param[], __stop___param[]; - - /* - * Need to run as early as possible, to initialize the - * lockdep hash: - */ - lockdep_init(); - smp_setup_processor_id(); - debug_objects_early_init(); - - /* - * Set up the the initial canary ASAP: - */ - boot_init_stack_canary(); - - cgroup_init_early(); - - local_irq_disable(); - early_boot_irqs_disabled = true; - -/* - * Interrupts are still disabled. Do necessary setups, then - * enable them - */ - tick_init(); - boot_cpu_init(); - page_address_init(); - printk(KERN_NOTICE "%s", linux_banner); - setup_arch(&command_line); - mm_init_owner(&init_mm, &init_task); - mm_init_cpumask(&init_mm); - setup_command_line(command_line); - setup_nr_cpu_ids(); - setup_per_cpu_areas(); - smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ - - build_all_zonelists(NULL); - page_alloc_init(); - - printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line); - parse_early_param(); - parse_args("Booting kernel", static_command_line, __start___param, - __stop___param - __start___param, - -1, -1, &unknown_bootoption); - - jump_label_init(); - - /* - * These use large bootmem allocations and must precede - * kmem_cache_init() - */ - setup_log_buf(0); - pidhash_init(); - vfs_caches_init_early(); - sort_main_extable(); - trap_init(); - mm_init(); - - /* - * Set up the scheduler prior starting any interrupts (such as the - * timer interrupt). Full topology setup happens at smp_init() - * time - but meanwhile we still have a functioning scheduler. - */ - sched_init(); - /* - * Disable preemption - early bootup scheduling is extremely - * fragile until we cpu_idle() for the first time. - */ - preempt_disable(); - if (!irqs_disabled()) { - printk(KERN_WARNING "start_kernel(): bug: interrupts were " - "enabled *very* early, fixing it\n"); - local_irq_disable(); - } - idr_init_cache(); - perf_event_init(); - rcu_init(); - radix_tree_init(); - /* init some links before init_ISA_irqs() */ - early_irq_init(); - init_IRQ(); - prio_tree_init(); - init_timers(); - hrtimers_init(); - softirq_init(); - timekeeping_init(); - time_init(); - profile_init(); - call_function_init(); - if (!irqs_disabled()) - printk(KERN_CRIT "start_kernel(): bug: interrupts were " - "enabled early\n"); - early_boot_irqs_disabled = false; - local_irq_enable(); - - kmem_cache_init_late(); - - /* - * HACK ALERT! This is early. We're enabling the console before - * we've done PCI setups etc, and console_init() must be aware of - * this. But we do want output early, in case something goes wrong. - */ - console_init(); - if (panic_later) - panic(panic_later, panic_param); - - lockdep_info(); - - /* - * Need to run this when irqs are enabled, because it wants - * to self-test [hard/soft]-irqs on/off lock inversion bugs - * too: - */ - locking_selftest(); - -#ifdef CONFIG_BLK_DEV_INITRD - if (initrd_start && !initrd_below_start_ok && - page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) { - printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - " - "disabling it.\n", - page_to_pfn(virt_to_page((void *)initrd_start)), - min_low_pfn); - initrd_start = 0; - } -#endif - page_cgroup_init(); - debug_objects_mem_init(); - kmemleak_init(); - setup_per_cpu_pageset(); - numa_policy_init(); - if (late_time_init) - late_time_init(); - sched_clock_init(); - calibrate_delay(); - pidmap_init(); - anon_vma_init(); -#ifdef CONFIG_X86 - if (efi_enabled) - efi_enter_virtual_mode(); -#endif - thread_info_cache_init(); - cred_init(); - fork_init(totalram_pages); - proc_caches_init(); - buffer_init(); - key_init(); - security_init(); - dbg_late_init(); - vfs_caches_init(totalram_pages); - signals_init(); - /* rootfs populating might need page-writeback */ - page_writeback_init(); -#ifdef CONFIG_PROC_FS - proc_root_init(); -#endif - cgroup_init(); - cpuset_init(); - taskstats_init_early(); - delayacct_init(); - - check_bugs(); - - acpi_early_init(); /* before LAPIC and SMP init */ - sfi_init_late(); - - ftrace_init(); - - /* Do the rest non-__init'ed, we're now alive */ - rest_init(); -} - -/* Call all constructor functions linked into the kernel. */ -static void __init do_ctors(void) -{ -#ifdef CONFIG_CONSTRUCTORS - ctor_fn_t *fn = (ctor_fn_t *) __ctors_start; - - for (; fn < (ctor_fn_t *) __ctors_end; fn++) - (*fn)(); -#endif -} - -bool initcall_debug; -core_param(initcall_debug, initcall_debug, bool, 0644); - -static char msgbuf[64]; - -static int __init_or_module do_one_initcall_debug(initcall_t fn) -{ - ktime_t calltime, delta, rettime; - unsigned long long duration; - int ret; - - printk(KERN_DEBUG "calling %pF @ %i\n", fn, task_pid_nr(current)); - calltime = ktime_get(); - ret = fn(); - rettime = ktime_get(); - delta = ktime_sub(rettime, calltime); - duration = (unsigned long long) ktime_to_ns(delta) >> 10; - printk(KERN_DEBUG "initcall %pF returned %d after %lld usecs\n", fn, - ret, duration); - - return ret; -} - -int __init_or_module do_one_initcall(initcall_t fn) -{ - int count = preempt_count(); - int ret; - - if (initcall_debug) - ret = do_one_initcall_debug(fn); - else - ret = fn(); - - msgbuf[0] = 0; - - if (ret && ret != -ENODEV && initcall_debug) - sprintf(msgbuf, "error code %d ", ret); - - if (preempt_count() != count) { - strlcat(msgbuf, "preemption imbalance ", sizeof(msgbuf)); - preempt_count() = count; - } - if (irqs_disabled()) { - strlcat(msgbuf, "disabled interrupts ", sizeof(msgbuf)); - local_irq_enable(); - } - if (msgbuf[0]) { - printk("initcall %pF returned with %s\n", fn, msgbuf); - } - - return ret; -} - - -extern initcall_t __initcall_start[]; -extern initcall_t __initcall0_start[]; -extern initcall_t __initcall1_start[]; -extern initcall_t __initcall2_start[]; -extern initcall_t __initcall3_start[]; -extern initcall_t __initcall4_start[]; -extern initcall_t __initcall5_start[]; -extern initcall_t __initcall6_start[]; -extern initcall_t __initcall7_start[]; -extern initcall_t __initcall_end[]; - -static initcall_t *initcall_levels[] __initdata = { - __initcall0_start, - __initcall1_start, - __initcall2_start, - __initcall3_start, - __initcall4_start, - __initcall5_start, - __initcall6_start, - __initcall7_start, - __initcall_end, -}; - -static char *initcall_level_names[] __initdata = { - "early parameters", - "core parameters", - "postcore parameters", - "arch parameters", - "subsys parameters", - "fs parameters", - "device parameters", - "late parameters", -}; - -static void __init do_initcall_level(int level) -{ - extern const struct kernel_param __start___param[], __stop___param[]; - initcall_t *fn; - - strcpy(static_command_line, saved_command_line); - parse_args(initcall_level_names[level], - static_command_line, __start___param, - __stop___param - __start___param, - level, level, - repair_env_string); - - for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++) - do_one_initcall(*fn); -} - -static void __init do_initcalls(void) -{ - int level; - - for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++) - do_initcall_level(level); -} - -/* - * Ok, the machine is now initialized. None of the devices - * have been touched yet, but the CPU subsystem is up and - * running, and memory and process management works. - * - * Now we can finally start doing some real work.. - */ -static void __init do_basic_setup(void) -{ - cpuset_init_smp(); - usermodehelper_init(); - shmem_init(); - driver_init(); - init_irq_proc(); - do_ctors(); - usermodehelper_enable(); - do_initcalls(); -} - -static void __init do_pre_smp_initcalls(void) -{ - initcall_t *fn; - - for (fn = __initcall_start; fn < __initcall0_start; fn++) - do_one_initcall(*fn); -} - -static void run_init_process(const char *init_filename) -{ - argv_init[0] = init_filename; - kernel_execve(init_filename, argv_init, envp_init); -} - -/* This is a non __init function. Force it to be noinline otherwise gcc - * makes it inline to init() and it becomes part of init.text section - */ -static noinline int init_post(void) -{ - /* need to finish all async __init code before freeing the memory */ - async_synchronize_full(); - free_initmem(); - mark_rodata_ro(); - system_state = SYSTEM_RUNNING; - numa_default_policy(); - - - current->signal->flags |= SIGNAL_UNKILLABLE; - - if (ramdisk_execute_command) { - run_init_process(ramdisk_execute_command); - printk(KERN_WARNING "Failed to execute %s\n", - ramdisk_execute_command); - } - - /* - * We try each of these until one succeeds. - * - * The Bourne shell can be used instead of init if we are - * trying to recover a really broken machine. - */ - if (execute_command) { - run_init_process(execute_command); - printk(KERN_WARNING "Failed to execute %s. Attempting " - "defaults...\n", execute_command); - } - run_init_process("/sbin/init"); - run_init_process("/etc/init"); - run_init_process("/bin/init"); - run_init_process("/bin/sh"); - - panic("No init found. Try passing init= option to kernel. " - "See Linux Documentation/init.txt for guidance."); -} - -static int __init kernel_init(void * unused) -{ - /* - * Wait until kthreadd is all set-up. - */ - wait_for_completion(&kthreadd_done); - - /* Now the scheduler is fully set up and can do blocking allocations */ - gfp_allowed_mask = __GFP_BITS_MASK; - - /* - * init can allocate pages on any node - */ - set_mems_allowed(node_states[N_HIGH_MEMORY]); - /* - * init can run on any cpu. - */ - set_cpus_allowed_ptr(current, cpu_all_mask); - - cad_pid = task_pid(current); - - smp_prepare_cpus(setup_max_cpus); - - do_pre_smp_initcalls(); - lockup_detector_init(); - - smp_init(); - sched_init_smp(); - - do_basic_setup(); - - /* Open the /dev/console on the rootfs, this should never fail */ - if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) - printk(KERN_WARNING "Warning: unable to open an initial console.\n"); - - (void) sys_dup(0); - (void) sys_dup(0); - /* - * check if there is an early userspace init. If yes, let it do all - * the work - */ - - if (!ramdisk_execute_command) - ramdisk_execute_command = "/init"; - - if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) { - ramdisk_execute_command = NULL; - prepare_namespace(); - } - - /* - * Ok, we have completed the initial bootup, and - * we're essentially up and running. Get rid of the - * initmem segments and start the user-mode stuff.. - */ - - init_post(); - return 0; -} diff --git a/ANDROID_3.4.5/init/noinitramfs.c b/ANDROID_3.4.5/init/noinitramfs.c deleted file mode 100644 index 267739d8..00000000 --- a/ANDROID_3.4.5/init/noinitramfs.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * init/noinitramfs.c - * - * Copyright (C) 2006, NXP Semiconductors, All Rights Reserved - * Author: Jean-Paul Saman <jean-paul.saman@nxp.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include <linux/init.h> -#include <linux/stat.h> -#include <linux/kdev_t.h> -#include <linux/syscalls.h> - -/* - * Create a simple rootfs that is similar to the default initramfs - */ -static int __init default_rootfs(void) -{ - int err; - - err = sys_mkdir((const char __user __force *) "/dev", 0755); - if (err < 0) - goto out; - - err = sys_mknod((const char __user __force *) "/dev/console", - S_IFCHR | S_IRUSR | S_IWUSR, - new_encode_dev(MKDEV(5, 1))); - if (err < 0) - goto out; - - err = sys_mkdir((const char __user __force *) "/root", 0700); - if (err < 0) - goto out; - - return 0; - -out: - printk(KERN_WARNING "Failed to create a rootfs\n"); - return err; -} -rootfs_initcall(default_rootfs); diff --git a/ANDROID_3.4.5/init/version.c b/ANDROID_3.4.5/init/version.c deleted file mode 100644 index 86fe0ccb..00000000 --- a/ANDROID_3.4.5/init/version.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * linux/init/version.c - * - * Copyright (C) 1992 Theodore Ts'o - * - * May be freely distributed as part of Linux. - */ - -#include <generated/compile.h> -#include <linux/module.h> -#include <linux/uts.h> -#include <linux/utsname.h> -#include <generated/utsrelease.h> -#include <linux/version.h> - -#ifndef CONFIG_KALLSYMS -#define version(a) Version_ ## a -#define version_string(a) version(a) - -extern int version_string(LINUX_VERSION_CODE); -int version_string(LINUX_VERSION_CODE); -#endif - -struct uts_namespace init_uts_ns = { - .kref = { - .refcount = ATOMIC_INIT(2), - }, - .name = { - .sysname = UTS_SYSNAME, - .nodename = UTS_NODENAME, - .release = UTS_RELEASE, - .version = UTS_VERSION, - .machine = UTS_MACHINE, - .domainname = UTS_DOMAINNAME, - }, - .user_ns = &init_user_ns, -}; -EXPORT_SYMBOL_GPL(init_uts_ns); - -/* FIXED STRINGS! Don't touch! */ -const char linux_banner[] = - "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@" - LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n"; - -const char linux_proc_banner[] = - "%s version %s" - " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")" - " (" LINUX_COMPILER ") %s\n"; |