1*8d67ca89SAndroid Build Coastguard Worker# Bionic Kernel Header Files 2*8d67ca89SAndroid Build Coastguard Worker 3*8d67ca89SAndroid Build Coastguard WorkerBionic comes with a processed set of all of the uapi Linux kernel headers that 4*8d67ca89SAndroid Build Coastguard Workercan safely be included by userland applications and libraries. 5*8d67ca89SAndroid Build Coastguard Worker 6*8d67ca89SAndroid Build Coastguard WorkerThese clean headers are automatically generated by several scripts located 7*8d67ca89SAndroid Build Coastguard Workerin the `tools/` directory. The tools process the original 8*8d67ca89SAndroid Build Coastguard Workerunmodified kernel headers in order to get rid of many annoying 9*8d67ca89SAndroid Build Coastguard Workerdeclarations and constructs that usually result in compilation failure. 10*8d67ca89SAndroid Build Coastguard Worker 11*8d67ca89SAndroid Build Coastguard WorkerThe 'clean headers' only contain type and macro definitions, with the 12*8d67ca89SAndroid Build Coastguard Workerexception of a couple static inline functions used for performance 13*8d67ca89SAndroid Build Coastguard Workerreason (e.g. optimized CPU-specific byte-swapping routines). 14*8d67ca89SAndroid Build Coastguard Worker 15*8d67ca89SAndroid Build Coastguard WorkerThey can be included from C++, or when compiling code in strict ANSI mode. 16*8d67ca89SAndroid Build Coastguard WorkerThey can be also included before or after any Bionic C library header. 17*8d67ca89SAndroid Build Coastguard Worker 18*8d67ca89SAndroid Build Coastguard WorkerDescription of the directories involved in generating the parsed kernel headers: 19*8d67ca89SAndroid Build Coastguard Worker 20*8d67ca89SAndroid Build Coastguard Worker * `external/kernel-headers/original/uapi/` 21*8d67ca89SAndroid Build Coastguard Worker Contains the uapi kernel headers found in the Android kernel. Note this 22*8d67ca89SAndroid Build Coastguard Worker also includes the header files that are generated by building the kernel 23*8d67ca89SAndroid Build Coastguard Worker sources. 24*8d67ca89SAndroid Build Coastguard Worker 25*8d67ca89SAndroid Build Coastguard Worker * `external/kernel-headers/original/scsi/` 26*8d67ca89SAndroid Build Coastguard Worker Contains copies of the kernel scsi header files. These where never 27*8d67ca89SAndroid Build Coastguard Worker made into uapi files, but some user space code expects that these 28*8d67ca89SAndroid Build Coastguard Worker headers are available. 29*8d67ca89SAndroid Build Coastguard Worker 30*8d67ca89SAndroid Build Coastguard Worker * `external/kernel-headers/modified/scsi/` 31*8d67ca89SAndroid Build Coastguard Worker Contains hand-modified versions of a few files from `original/scsi/` 32*8d67ca89SAndroid Build Coastguard Worker that removes the kernel specific code from these files so they can 33*8d67ca89SAndroid Build Coastguard Worker be used as uapi headers. The tools to process the kernel headers will 34*8d67ca89SAndroid Build Coastguard Worker warn if any scsi header files have changed and require new versions 35*8d67ca89SAndroid Build Coastguard Worker to be hand-modified. 36*8d67ca89SAndroid Build Coastguard Worker 37*8d67ca89SAndroid Build Coastguard Worker * `bionic/libc/kernel/uapi/` 38*8d67ca89SAndroid Build Coastguard Worker Contains the cleaned kernel headers and mirrors the directory structure 39*8d67ca89SAndroid Build Coastguard Worker in `external/kernel-headers/original/uapi/`. 40*8d67ca89SAndroid Build Coastguard Worker 41*8d67ca89SAndroid Build Coastguard Worker * `bionic/libc/kernel/tools/` 42*8d67ca89SAndroid Build Coastguard Worker Contains various Python and shell scripts used to get and re-generate 43*8d67ca89SAndroid Build Coastguard Worker the headers. 44*8d67ca89SAndroid Build Coastguard Worker 45*8d67ca89SAndroid Build Coastguard WorkerThe tools to get/parse the headers: 46*8d67ca89SAndroid Build Coastguard Worker 47*8d67ca89SAndroid Build Coastguard Worker * `tools/generate_uapi_headers.sh` 48*8d67ca89SAndroid Build Coastguard Worker Checks out the Android kernel and generates all uapi header files. 49*8d67ca89SAndroid Build Coastguard Worker copies all the changed files into external/kernel-headers. 50*8d67ca89SAndroid Build Coastguard Worker 51*8d67ca89SAndroid Build Coastguard Worker * `tools/clean_header.py` 52*8d67ca89SAndroid Build Coastguard Worker Prints the clean version of a given kernel header. With the -u option, 53*8d67ca89SAndroid Build Coastguard Worker this will also update the corresponding clean header file if its 54*8d67ca89SAndroid Build Coastguard Worker content has changed. You can also process more than one file with -u. 55*8d67ca89SAndroid Build Coastguard Worker 56*8d67ca89SAndroid Build Coastguard Worker * `tools/update_all.py` 57*8d67ca89SAndroid Build Coastguard Worker Automatically update all clean headers from the content of 58*8d67ca89SAndroid Build Coastguard Worker `external/kernel-headers/original/`. 59*8d67ca89SAndroid Build Coastguard Worker 60*8d67ca89SAndroid Build Coastguard Worker## How To Update The Headers 61*8d67ca89SAndroid Build Coastguard Worker 62*8d67ca89SAndroid Build Coastguard WorkerIMPORTANT IMPORTANT: 63*8d67ca89SAndroid Build Coastguard Worker 64*8d67ca89SAndroid Build Coastguard WorkerWHEN UPDATING THE HEADERS, ALWAYS CHECK THAT THE NEW CLEAN HEADERS DO 65*8d67ca89SAndroid Build Coastguard WorkerNOT BREAK THE KERNEL <-> USER ABI, FOR EXAMPLE BY CHANGING THE SIZE 66*8d67ca89SAndroid Build Coastguard WorkerOF A GIVEN TYPE. THIS TASK CANNOT BE EASILY AUTOMATED AT THE MOMENT. 67*8d67ca89SAndroid Build Coastguard Worker 68*8d67ca89SAndroid Build Coastguard WorkerDownload the Android mainline kernel source code: 69*8d67ca89SAndroid Build Coastguard Worker``` 70*8d67ca89SAndroid Build Coastguard Worker > mkdir kernel_src 71*8d67ca89SAndroid Build Coastguard Worker > cd kernel_src 72*8d67ca89SAndroid Build Coastguard Worker kernel_src> git clone https://android.googlesource.com/kernel/common/ -b android-mainline 73*8d67ca89SAndroid Build Coastguard Worker``` 74*8d67ca89SAndroid Build Coastguard Worker 75*8d67ca89SAndroid Build Coastguard WorkerThe Android mainline kernel source has tags that indicate the kernel 76*8d67ca89SAndroid Build Coastguard Workerversion to which they correspond. The format of a tag is 77*8d67ca89SAndroid Build Coastguard Workerandroid-mainline-XXX, where XXX is the kernel version. For example, 78*8d67ca89SAndroid Build Coastguard Workerandroid-mainline-5.10 corresponds to linux stable kernel 5.10. To check out 79*8d67ca89SAndroid Build Coastguard Workera particular tag: 80*8d67ca89SAndroid Build Coastguard Worker``` 81*8d67ca89SAndroid Build Coastguard Worker kernel_src> cd common 82*8d67ca89SAndroid Build Coastguard Worker kernel_src/common> git checkout tags/android-mainline-XXX 83*8d67ca89SAndroid Build Coastguard Worker``` 84*8d67ca89SAndroid Build Coastguard Worker 85*8d67ca89SAndroid Build Coastguard WorkerIt is expected that a kernel update should only be performed on a valid tag. 86*8d67ca89SAndroid Build Coastguard WorkerFor testing purposes, it is possible that you can use the top of tree 87*8d67ca89SAndroid Build Coastguard Workerversion, but never use that as the basis for importing new kernel headers. 88*8d67ca89SAndroid Build Coastguard Worker 89*8d67ca89SAndroid Build Coastguard WorkerBefore running the command to import the headers, make sure that you have 90*8d67ca89SAndroid Build Coastguard Workerdone a lunch TARGET. The script uses a variable set by the lunch command 91*8d67ca89SAndroid Build Coastguard Workerto determine which directory to use as the destination directory. 92*8d67ca89SAndroid Build Coastguard Worker 93*8d67ca89SAndroid Build Coastguard WorkerAfter running lunch, run this command to import the headers into the Android 94*8d67ca89SAndroid Build Coastguard Workersource tree if there is a kernel source tree already checked out: 95*8d67ca89SAndroid Build Coastguard Worker``` 96*8d67ca89SAndroid Build Coastguard Worker bionic/libc/kernel/tools/generate_uapi_headers.sh --use-kernel-dir kernel_src 97*8d67ca89SAndroid Build Coastguard Worker``` 98*8d67ca89SAndroid Build Coastguard Worker 99*8d67ca89SAndroid Build Coastguard WorkerRun this command to automatically download the latest version of the headers 100*8d67ca89SAndroid Build Coastguard Workerand import them if there is no checked out kernel source tree: 101*8d67ca89SAndroid Build Coastguard Worker``` 102*8d67ca89SAndroid Build Coastguard Worker # For testing only, not for use in production! 103*8d67ca89SAndroid Build Coastguard Worker bionic/libc/kernel/tools/generate_uapi_headers.sh --download-kernel 104*8d67ca89SAndroid Build Coastguard Worker``` 105*8d67ca89SAndroid Build Coastguard Worker 106*8d67ca89SAndroid Build Coastguard WorkerNext, run this command to copy the parsed files to bionic/libc/kernel/uapi: 107*8d67ca89SAndroid Build Coastguard Worker``` 108*8d67ca89SAndroid Build Coastguard Worker bionic/libc/kernel/tools/update_all.py 109*8d67ca89SAndroid Build Coastguard Worker``` 110*8d67ca89SAndroid Build Coastguard Worker 111*8d67ca89SAndroid Build Coastguard WorkerAfter this, you will need to build/test the tree to make sure that these 112*8d67ca89SAndroid Build Coastguard Workerchanges do not introduce any errors. 113