platform_bionic/libc/kernel
Daniel Mentz 6d6b4cedd1 clean_header: Fix error handling for no-such-file case
The function cleanupFile should always return a single value (as opposed
to a tuple or list). In addition, if it encounters an error, it is
expected to return a value that evaluates to False. As it stands,
however, it returns (None, None) in certain error cases. Change this
function to return None, in those cases.

We previously saw the following error message, when we tried to run
clean_header.py on a non-existent file.

Traceback (most recent call last):
  File "clean_header.py", line 208, in <module>
    b.updateGitFiles()
  File "utils.py", line 164, in updateGitFiles
    self._writeFile(dst)
  File "utils.py", line 136, in _writeFile
    f.write(self.new_data[dst])
TypeError: expected a string or other character buffer object

Change-Id: I5f717dd1a4388f598f0fd4bfd5e6129017de9095
2019-04-15 15:03:39 -07:00
..
android Move kernel README files to Markdown. 2019-04-11 13:38:25 -07:00
tools clean_header: Fix error handling for no-such-file case 2019-04-15 15:03:39 -07:00
uapi Update kernel headers to v5.0.3. 2019-03-21 15:31:06 +00:00
README.md Move kernel README files to Markdown. 2019-04-11 13:38:25 -07:00

Bionic Kernel Header Files

Bionic comes with a processed set of all of the uapi Linux kernel headers that can safely be included by userland applications and libraries.

These clean headers are automatically generated by several scripts located in the tools/ directory. The tools process the original unmodified kernel headers in order to get rid of many annoying declarations and constructs that usually result in compilation failure.

The 'clean headers' only contain type and macro definitions, with the exception of a couple static inline functions used for performance reason (e.g. optimized CPU-specific byte-swapping routines).

They can be included from C++, or when compiling code in strict ANSI mode. They can be also included before or after any Bionic C library header.

Description of the directories involved in generating the parsed kernel headers:

  • external/kernel-headers/original/ Contains the uapi kernel headers found in the android kernel. Note this also includes the header files that are generated by building the kernel sources.

  • bionic/libc/kernel/uapi/ Contains the cleaned kernel headers and mirrors the directory structure in external/kernel-headers/original/uapi/.

  • bionic/libc/kernel/tools/ Contains various Python and shell scripts used to get and re-generate the headers.

The tools to get/parse the headers:

  • tools/generate_uapi_headers.sh Checks out the android kernel and generates all uapi header files. copies all the changed files into external/kernel-headers.

  • tools/clean_header.py Prints the clean version of a given kernel header. With the -u option, this will also update the corresponding clean header file if its content has changed. You can also process more than one file with -u.

  • tools/update_all.py Automatically update all clean headers from the content of external/kernel-headers/original/.

How To Update The Headers

IMPORTANT IMPORTANT:

WHEN UPDATING THE HEADERS, ALWAYS CHECK THAT THE NEW CLEAN HEADERS DO NOT BREAK THE KERNEL <-> USER ABI, FOR EXAMPLE BY CHANGING THE SIZE OF A GIVEN TYPE. THIS TASK CANNOT BE EASILY AUTOMATED AT THE MOMENT.

Download the Linux kernel source code:

  > mkdir kernel_src
  > cd kernel_src
  kernel_src> git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

Then checkout the stable tag for the new kernel headers to import:

  kernel_src> cd linux-stable
  kernel_src/linux-stable> git checkout tags/vXXX

Before running the command to import the headers, make sure that you have done a lunch TARGET. The script uses a variable set by the lunch command to determine which directory to use as the destination directory.

After running lunch, run this command to import the headers into the android source tree:

  bionic/libc/kernel/tools/generate_uapi_headers.sh --use-kernel-dir kernel_src

Next, run this command to copy the parsed files to bionic/libc/kernel/uapi:

  bionic/libc/kernel/tools/update_all.py

Finally, run this command to regenerate the syscalls list:

  bionic/libc/tools/gensyscalls.py

After this, you will need to build/test the tree to make sure that these changes do not introduce any errors.