Esphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget*/translations/zh_CN/admin-guide/bootconfigmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/zh_TW/admin-guide/bootconfigmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/it_IT/admin-guide/bootconfigmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/ja_JP/admin-guide/bootconfigmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/ko_KR/admin-guide/bootconfigmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/pt_BR/admin-guide/bootconfigmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/sp_SP/admin-guide/bootconfigmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhD/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig.rsthKubhtarget)}(h.. _bootconfig:h]h}(h]h ]h"]h$]h&]refid bootconfiguh1hhKhhhhhhubhsection)}(hhh](htitle)}(hBoot Configurationh]hBoot Configuration}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh field_list)}(hhh]hfield)}(hhh](h field_name)}(hAuthorh]hAuthor}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h'Masami Hiramatsu h]h paragraph)}(h&Masami Hiramatsu h](hMasami Hiramatsu <}(hj hhhNhNubh reference)}(hmhiramat@kernel.orgh]hmhiramat@kernel.org}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:mhiramat@kernel.orguh1jhj ubh>}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhK hjubah}(h]h ]h"]h$]h&]uh1jhhubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hOverviewh]hOverview}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChhhhhK ubj )}(hThe boot configuration expands the current kernel command line to support additional key-value data when booting the kernel in an efficient way. This allows administrators to pass a structured-Key config file.h]hThe boot configuration expands the current kernel command line to support additional key-value data when booting the kernel in an efficient way. This allows administrators to pass a structured-Key config file.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKhjChhubeh}(h]overviewah ]h"]overviewah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hConfig File Syntaxh]hConfig File Syntax}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhhhhhKubj )}(hThe boot config syntax is a simple structured key-value. Each key consists of dot-connected-words, and key and value are connected by ``=``. The value string has to be terminated by the following delimiters described below.h](hThe boot config syntax is a simple structured key-value. Each key consists of dot-connected-words, and key and value are connected by }(hj{hhhNhNubhliteral)}(h``=``h]h=}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubhT. The value string has to be terminated by the following delimiters described below.}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKhjjhhubj )}(hXEach key word must contain only alphabets, numbers, dash (``-``) or underscore (``_``). And each value only contains printable characters or spaces except for delimiters such as semi-colon (``;``), new-line (``\n``), comma (``,``), hash (``#``) and closing brace (``}``).h](h:Each key word must contain only alphabets, numbers, dash (}(hjhhhNhNubj)}(h``-``h]h-}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) or underscore (}(hjhhhNhNubj)}(h``_``h]h_}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhi). And each value only contains printable characters or spaces except for delimiters such as semi-colon (}(hjhhhNhNubj)}(h``;``h]h;}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh ), new-line (}(hjhhhNhNubj)}(h``\n``h]h\n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh ), comma (}(hjhhhNhNubj)}(h``,``h]h,}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh ), hash (}(hjhhhNhNubj)}(h``#``h]h#}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) and closing brace (}(hjhhhNhNubj)}(h``}``h]h}}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKhjjhhubj )}(hiIf the ``=`` is followed by whitespace up to one of these delimiters, the key is assigned an empty value.h](hIf the }(hj)hhhNhNubj)}(h``=``h]h=}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh] is followed by whitespace up to one of these delimiters, the key is assigned an empty value.}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKhjjhhubj )}(hFor arrays, the array values are comma (``,``) separated, and comments and line breaks with newline (``\n``) are allowed between array values for readability. Thus the first entry of the array must be on the same line as the key.::h](h(For arrays, the array values are comma (}(hjIhhhNhNubj)}(h``,``h]h,}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh8) separated, and comments and line breaks with newline (}(hjIhhhNhNubj)}(h``\n``h]h\n}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh{) are allowed between array values for readability. Thus the first entry of the array must be on the same line as the key.:}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhK!hjjhhubh literal_block)}(h)KEY[.WORD[...]] = VALUE[, VALUE2[...]][;]h]h)KEY[.WORD[...]] = VALUE[, VALUE2[...]][;]}hj}sbah}(h]h ]h"]h$]h&]hhuh1j{hhhK&hjjhhubj )}(hlUnlike the kernel command line syntax, white spaces (including tabs) are ignored around the comma and ``=``.h](hfUnlike the kernel command line syntax, white spaces (including tabs) are ignored around the comma and }(hjhhhNhNubj)}(h``=``h]h=}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhK(hjjhhubj )}(hIf you want to use those delimiters in a value, you can use either double- quotes (``"VALUE"``) or single-quotes (``'VALUE'``) to quote it. Note that you can not escape these quotes.h](hSIf you want to use those delimiters in a value, you can use either double- quotes (}(hjhhhNhNubj)}(h ``"VALUE"``h]h"VALUE"}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) or single-quotes (}(hjhhhNhNubj)}(h ``'VALUE'``h]h'VALUE'}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh9) to quote it. Note that you can not escape these quotes.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhK+hjjhhubj )}(hThere can be a key which doesn't have value or has an empty value. Those keys are used for checking if the key exists or not (like a boolean).h]hThere can be a key which doesn’t have value or has an empty value. Those keys are used for checking if the key exists or not (like a boolean).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhK/hjjhhubh)}(hhh](h)}(hKey-Value Syntaxh]hKey-Value Syntax}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK3ubj )}(haThe boot config file syntax allows user to merge partially same word keys by brace. For example::h]h`The boot config file syntax allows user to merge partially same word keys by brace. For example:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhK5hjhhubj|)}(h.foo.bar.baz = value1 foo.bar.qux.quux = value2h]h.foo.bar.baz = value1 foo.bar.qux.quux = value2}hj sbah}(h]h ]h"]h$]h&]hhuh1j{hhhK8hjhhubj )}(hThese can be written also in::h]hThese can be written also in:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhK;hjhhubj|)}(h0foo.bar { baz = value1 qux.quux = value2 }h]h0foo.bar { baz = value1 qux.quux = value2 }}hj&sbah}(h]h ]h"]h$]h&]hhuh1j{hhhK=hjhhubj )}(h'Or more shorter, written as following::h]h&Or more shorter, written as following:}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKBhjhhubj|)}(h+foo.bar { baz = value1; qux.quux = value2 }h]h+foo.bar { baz = value1; qux.quux = value2 }}hjBsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKDhjhhubj )}(hIn both styles, same key words are automatically merged when parsing it at boot time. So you can append similar trees or key-values.h]hIn both styles, same key words are automatically merged when parsing it at boot time. So you can append similar trees or key-values.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKFhjhhubeh}(h]key-value-syntaxah ]h"]key-value syntaxah$]h&]uh1hhjjhhhhhK3ubh)}(hhh](h)}(hSame-key Valuesh]hSame-key Values}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhhhhhKJubj )}(hSIt is prohibited that two or more values or arrays share a same-key. For example,::h]hRIt is prohibited that two or more values or arrays share a same-key. For example,:}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKLhjfhhubj|)}(hAfoo = bar, baz foo = qux # !ERROR! we can not re-define same keyh]hAfoo = bar, baz foo = qux # !ERROR! we can not re-define same key}hjsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKOhjfhhubj )}(hdIf you want to update the value, you must use the override operator ``:=`` explicitly. For example::h](hDIf you want to update the value, you must use the override operator }(hjhhhNhNubj)}(h``:=``h]h:=}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh explicitly. For example:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKRhjfhhubj|)}(hfoo = bar, baz foo := quxh]hfoo = bar, baz foo := qux}hjsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKUhjfhhubj )}(hthen, the ``qux`` is assigned to ``foo`` key. This is useful for overriding the default value by adding (partial) custom bootconfigs without parsing the default bootconfig.h](h then, the }(hjhhhNhNubj)}(h``qux``h]hqux}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is assigned to }(hjhhhNhNubj)}(h``foo``h]hfoo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh key. This is useful for overriding the default value by adding (partial) custom bootconfigs without parsing the default bootconfig.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKXhjfhhubj )}(hnIf you want to append the value to existing key as an array member, you can use ``+=`` operator. For example::h](hPIf you want to append the value to existing key as an array member, you can use }(hjhhhNhNubj)}(h``+=``h]h+=}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh operator. For example:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhK\hjfhhubj|)}(hfoo = bar, baz foo += quxh]hfoo = bar, baz foo += qux}hjsbah}(h]h ]h"]h$]h&]hhuh1j{hhhK_hjfhhubj )}(h?In this case, the key ``foo`` has ``bar``, ``baz`` and ``qux``.h](hIn this case, the key }(hj!hhhNhNubj)}(h``foo``h]hfoo}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh has }(hj!hhhNhNubj)}(h``bar``h]hbar}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh, }(hj!hhhNhNubj)}(h``baz``h]hbaz}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh and }(hj!hhhNhNubj)}(h``qux``h]hqux}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh.}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKbhjfhhubj )}(hjMoreover, sub-keys and a value can coexist under a parent key. For example, following config is allowed.::h]hiMoreover, sub-keys and a value can coexist under a parent key. For example, following config is allowed.:}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKdhjfhhubj|)}(hKfoo = value1 foo.bar = value2 foo := value3 # This will update foo's value.h]hKfoo = value1 foo.bar = value2 foo := value3 # This will update foo's value.}hjsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKghjfhhubj )}(hNote, since there is no syntax to put a raw value directly under a structured key, you have to define it outside of the brace. For example::h]hNote, since there is no syntax to put a raw value directly under a structured key, you have to define it outside of the brace. For example:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKkhjfhhubj|)}(hRfoo { bar = value1 bar { baz = value2 qux = value3 } }h]hRfoo { bar = value1 bar { baz = value2 qux = value3 } }}hjsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKnhjfhhubj )}(hAlso, the order of the value node under a key is fixed. If there are a value and subkeys, the value is always the first child node of the key. Thus if user specifies subkeys first, e.g.::h]hAlso, the order of the value node under a key is fixed. If there are a value and subkeys, the value is always the first child node of the key. Thus if user specifies subkeys first, e.g.:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKvhjfhhubj|)}(hfoo.bar = value1 foo = value2h]hfoo.bar = value1 foo = value2}hjsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKzhjfhhubj )}(hBIn the program (and /proc/bootconfig), it will be shown as below::h]hAIn the program (and /proc/bootconfig), it will be shown as below:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhK}hjfhhubj|)}(hfoo = value2 foo.bar = value1h]hfoo = value2 foo.bar = value1}hjsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKhjfhhubeh}(h]same-key-valuesah ]h"]same-key valuesah$]h&]uh1hhjjhhhhhKJubh)}(hhh](h)}(hCommentsh]hComments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubj )}(hThe config syntax accepts shell-script style comments. The comments starting with hash ("#") until newline ("\n") will be ignored.h]hThe config syntax accepts shell-script style comments. The comments starting with hash (“#”) until newline (”n”) will be ignored.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj|)}(hv# comment line foo = value # value is set to foo. bar = 1, # 1st element 2, # 2nd element 3 # 3rd elementh]hv# comment line foo = value # value is set to foo. bar = 1, # 1st element 2, # 2nd element 3 # 3rd element}hjsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKhjhhubj )}(hThis is parsed as below::h]hThis is parsed as below:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj|)}(hfoo = value bar = 1, 2, 3h]hfoo = value bar = 1, 2, 3}hj*sbah}(h]h ]h"]h$]h&]hhuh1j{hhhKhjhhubj )}(hNote that you can NOT put a comment or a newline between value and delimiter (``,`` or ``;``). This means following config has a syntax error ::h](hNNote that you can NOT put a comment or a newline between value and delimiter (}(hj8hhhNhNubj)}(h``,``h]h,}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubh or }(hj8hhhNhNubj)}(h``;``h]h;}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubh1). This means following config has a syntax error}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj|)}(hkey = 1 # comment ,2h]hkey = 1 # comment ,2}hjjsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKhjhhubeh}(h]commentsah ]h"]commentsah$]h&]uh1hhjjhhhhhKubeh}(h]config-file-syntaxah ]h"]config file syntaxah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h/proc/bootconfigh]h/proc/bootconfig}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubj )}(h/proc/bootconfig is a user-space interface of the boot config. Unlike /proc/cmdline, this file shows the key-value style list. Each key-value pair is shown in each line with following style::h]h/proc/bootconfig is a user-space interface of the boot config. Unlike /proc/cmdline, this file shows the key-value style list. Each key-value pair is shown in each line with following style:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj|)}(h(KEY[.WORDS...] = "[VALUE]"[,"VALUE2"...]h]h(KEY[.WORDS...] = "[VALUE]"[,"VALUE2"...]}hjsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKhjhhubeh}(h]proc-bootconfigah ]h"]/proc/bootconfigah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hBoot Kernel With a Boot Configh]hBoot Kernel With a Boot Config}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubj )}(hThere are two options to boot the kernel with bootconfig: attaching the bootconfig to the initrd image or embedding it in the kernel itself.h]hThere are two options to boot the kernel with bootconfig: attaching the bootconfig to the initrd image or embedding it in the kernel itself.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKhjhhubh)}(hhh](h)}(h!Attaching a Boot Config to Initrdh]h!Attaching a Boot Config to Initrd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubj )}(hSince the boot configuration file is loaded with initrd by default, it will be added to the end of the initrd (initramfs) image file with padding, size, checksum and 12-byte magic word as below.h]hSince the boot configuration file is loaded with initrd by default, it will be added to the end of the initrd (initramfs) image file with padding, size, checksum and 12-byte magic word as below.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj )}(hH[initrd][bootconfig][padding][size(le32)][checksum(le32)][#BOOTCONFIG\n]h]hH[initrd][bootconfig][padding][size(le32)][checksum(le32)][#BOOTCONFIGn]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj )}(hDThe size and checksum fields are unsigned 32bit little endian value.h]hDThe size and checksum fields are unsigned 32bit little endian value.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj )}(hWhen the boot configuration is added to the initrd image, the total file size is aligned to 4 bytes. To fill the gap, null characters (``\0``) will be added. Thus the ``size`` is the length of the bootconfig file + padding bytes.h](hWhen the boot configuration is added to the initrd image, the total file size is aligned to 4 bytes. To fill the gap, null characters (}(hjhhhNhNubj)}(h``\0``h]h\0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) will be added. Thus the }(hjhhhNhNubj)}(h``size``h]hsize}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh6 is the length of the bootconfig file + padding bytes.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj )}(hXThe Linux kernel decodes the last part of the initrd image in memory to get the boot configuration data. Because of this "piggyback" method, there is no need to change or update the boot loader and the kernel image itself as long as the boot loader passes the correct initrd file size. If by any chance, the boot loader passes a longer size, the kernel fails to find the bootconfig data.h]hXThe Linux kernel decodes the last part of the initrd image in memory to get the boot configuration data. Because of this “piggyback” method, there is no need to change or update the boot loader and the kernel image itself as long as the boot loader passes the correct initrd file size. If by any chance, the boot loader passes a longer size, the kernel fails to find the bootconfig data.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj )}(hTo do this operation, Linux kernel provides ``bootconfig`` command under tools/bootconfig, which allows admin to apply or delete the config file to/from initrd image. You can build it by the following command::h](h,To do this operation, Linux kernel provides }(hjWhhhNhNubj)}(h``bootconfig``h]h bootconfig}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh command under tools/bootconfig, which allows admin to apply or delete the config file to/from initrd image. You can build it by the following command:}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj|)}(h# make -C tools/bootconfigh]h# make -C tools/bootconfig}hjwsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKhjhhubj )}(huTo add your boot config file to initrd image, run bootconfig as below (Old data is removed automatically if exists)::h]htTo add your boot config file to initrd image, run bootconfig as below (Old data is removed automatically if exists):}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj|)}(hC# tools/bootconfig/bootconfig -a your-config /boot/initrd.img-X.Y.Zh]hC# tools/bootconfig/bootconfig -a your-config /boot/initrd.img-X.Y.Z}hjsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKhjhhubj )}(hETo remove the config from the image, you can use -d option as below::h]hDTo remove the config from the image, you can use -d option as below:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj|)}(h7# tools/bootconfig/bootconfig -d /boot/initrd.img-X.Y.Zh]h7# tools/bootconfig/bootconfig -d /boot/initrd.img-X.Y.Z}hjsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKhjhhubj )}(hThen add "bootconfig" on the normal kernel command line to tell the kernel to look for the bootconfig at the end of the initrd file. Alternatively, build your kernel with the ``CONFIG_BOOT_CONFIG_FORCE`` Kconfig option selected.h](hThen add “bootconfig” on the normal kernel command line to tell the kernel to look for the bootconfig at the end of the initrd file. Alternatively, build your kernel with the }(hjhhhNhNubj)}(h``CONFIG_BOOT_CONFIG_FORCE``h]hCONFIG_BOOT_CONFIG_FORCE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh Kconfig option selected.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKhjhhubeh}(h]!attaching-a-boot-config-to-initrdah ]h"]!attaching a boot config to initrdah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(h#Embedding a Boot Config into Kernelh]h#Embedding a Boot Config into Kernel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubj )}(hIf you can not use initrd, you can also embed the bootconfig file in the kernel by Kconfig options. In this case, you need to recompile the kernel with the following configs::h]hIf you can not use initrd, you can also embed the bootconfig file in the kernel by Kconfig options. In this case, you need to recompile the kernel with the following configs:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj|)}(hSCONFIG_BOOT_CONFIG_EMBED=y CONFIG_BOOT_CONFIG_EMBED_FILE="/PATH/TO/BOOTCONFIG/FILE"h]hSCONFIG_BOOT_CONFIG_EMBED=y CONFIG_BOOT_CONFIG_EMBED_FILE="/PATH/TO/BOOTCONFIG/FILE"}hjsbah}(h]h ]h"]h$]h&]hhuh1j{hhhKhjhhubj )}(h``CONFIG_BOOT_CONFIG_EMBED_FILE`` requires an absolute path or a relative path to the bootconfig file from source tree or object tree. The kernel will embed it as the default bootconfig.h](j)}(h!``CONFIG_BOOT_CONFIG_EMBED_FILE``h]hCONFIG_BOOT_CONFIG_EMBED_FILE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh requires an absolute path or a relative path to the bootconfig file from source tree or object tree. The kernel will embed it as the default bootconfig.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj )}(hJust as when attaching the bootconfig to the initrd, you need ``bootconfig`` option on the kernel command line to enable the embedded bootconfig, or, alternatively, build your kernel with the ``CONFIG_BOOT_CONFIG_FORCE`` Kconfig option selected.h](h>Just as when attaching the bootconfig to the initrd, you need }(hj.hhhNhNubj)}(h``bootconfig``h]h bootconfig}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubht option on the kernel command line to enable the embedded bootconfig, or, alternatively, build your kernel with the }(hj.hhhNhNubj)}(h``CONFIG_BOOT_CONFIG_FORCE``h]hCONFIG_BOOT_CONFIG_FORCE}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh Kconfig option selected.}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKhjhhubj )}(hNote that even if you set this option, you can override the embedded bootconfig by another bootconfig which attached to the initrd.h]hNote that even if you set this option, you can override the embedded bootconfig by another bootconfig which attached to the initrd.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhKhjhhubeh}(h]#embedding-a-boot-config-into-kernelah ]h"]#embedding a boot config into kernelah$]h&]uh1hhjhhhhhKubh)}(hhh](h)}(h.Rendering Embedded kernel.* Keys at Build Timeh]h.Rendering Embedded kernel.* Keys at Build Time}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhhhhhKubj )}(hXBy default, the embedded bootconfig (``CONFIG_BOOT_CONFIG_EMBED=y``) is parsed at runtime, after ``parse_early_param()`` has already run. Early parameter handlers (``mem=``, ``earlycon=``, ``loglevel=``, ...) therefore cannot see values supplied via the embedded ``kernel`` subtree.h](h%By default, the embedded bootconfig (}(hjhhhNhNubj)}(h``CONFIG_BOOT_CONFIG_EMBED=y``h]hCONFIG_BOOT_CONFIG_EMBED=y}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) is parsed at runtime, after }(hjhhhNhNubj)}(h``parse_early_param()``h]hparse_early_param()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, has already run. Early parameter handlers (}(hjhhhNhNubj)}(h``mem=``h]hmem=}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }(hjhhhNhNubj)}(h ``earlycon=``h]h earlycon=}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }hjsbj)}(h ``loglevel=``h]h loglevel=}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh=, ...) therefore cannot see values supplied via the embedded }(hjhhhNhNubj)}(h ``kernel``h]hkernel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh subtree.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKhjvhhubj )}(hXG``CONFIG_CMDLINE_FROM_BOOTCONFIG`` resolves this by rendering the ``kernel`` subtree of ``CONFIG_BOOT_CONFIG_EMBED_FILE`` into a flat cmdline string at kernel build time (via ``tools/bootconfig -C``) and prepending it to ``boot_command_line`` during early architecture setup, so the keys are visible to ``parse_early_param()``.h](j)}(h"``CONFIG_CMDLINE_FROM_BOOTCONFIG``h]hCONFIG_CMDLINE_FROM_BOOTCONFIG}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh resolves this by rendering the }(hjhhhNhNubj)}(h ``kernel``h]hkernel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh subtree of }(hjhhhNhNubj)}(h!``CONFIG_BOOT_CONFIG_EMBED_FILE``h]hCONFIG_BOOT_CONFIG_EMBED_FILE}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh6 into a flat cmdline string at kernel build time (via }(hjhhhNhNubj)}(h``tools/bootconfig -C``h]htools/bootconfig -C}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) and prepending it to }(hjhhhNhNubj)}(h``boot_command_line``h]hboot_command_line}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh= during early architecture setup, so the keys are visible to }(hjhhhNhNubj)}(h``parse_early_param()``h]hparse_early_param()}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKhjvhhubj )}(hXZThe option requires ``CONFIG_BOOT_CONFIG_EMBED=y``, a non-empty ``CONFIG_BOOT_CONFIG_EMBED_FILE``, ``CONFIG_CMDLINE`` to be empty, and an architecture that selects ``CONFIG_ARCH_SUPPORTS_CMDLINE_FROM_BOOTCONFIG``. Currently only x86 selects it; on other architectures the embedded bootconfig still works, but only through the late runtime parser.h](hThe option requires }(hjwhhhNhNubj)}(h``CONFIG_BOOT_CONFIG_EMBED=y``h]hCONFIG_BOOT_CONFIG_EMBED=y}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubh, a non-empty }(hjwhhhNhNubj)}(h!``CONFIG_BOOT_CONFIG_EMBED_FILE``h]hCONFIG_BOOT_CONFIG_EMBED_FILE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubh, }(hjwhhhNhNubj)}(h``CONFIG_CMDLINE``h]hCONFIG_CMDLINE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubh/ to be empty, and an architecture that selects }(hjwhhhNhNubj)}(h0``CONFIG_ARCH_SUPPORTS_CMDLINE_FROM_BOOTCONFIG``h]h,CONFIG_ARCH_SUPPORTS_CMDLINE_FROM_BOOTCONFIG}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubh. Currently only x86 selects it; on other architectures the embedded bootconfig still works, but only through the late runtime parser.}(hjwhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhKhjvhhubj )}(hXThe same ``bootconfig`` opt-in applies as elsewhere: the rendered keys are prepended only when ``bootconfig`` (in any form) appears on the kernel command line, or when ``CONFIG_BOOT_CONFIG_FORCE`` is set, which defaults to ``y`` when ``CONFIG_BOOT_CONFIG_EMBED`` is set.h](h The same }(hjhhhNhNubj)}(h``bootconfig``h]h bootconfig}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhH opt-in applies as elsewhere: the rendered keys are prepended only when }(hjhhhNhNubj)}(h``bootconfig``h]h bootconfig}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh; (in any form) appears on the kernel command line, or when }(hjhhhNhNubj)}(h``CONFIG_BOOT_CONFIG_FORCE``h]hCONFIG_BOOT_CONFIG_FORCE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is set, which defaults to }(hjhhhNhNubj)}(h``y``h]hy}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh when }(hjhhhNhNubj)}(h``CONFIG_BOOT_CONFIG_EMBED``h]hCONFIG_BOOT_CONFIG_EMBED}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is set.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhMhjvhhubj )}(hFor example, given::h]hFor example, given:}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhMhjvhhubj|)}(h$kernel { loglevel = 7 mem = 4G }h]h$kernel { loglevel = 7 mem = 4G }}hjC sbah}(h]h ]h"]h$]h&]hhuh1j{hhhMhjvhhubj )}(hXthe kernel boots as if ``loglevel=7 mem=4G`` had been prepended to the bootloader command line, with the values visible to early-parsed handlers. Comma-separated values are still expanded into multiple cmdline entries per the bootconfig array convention -- the embedded ``kernel.earlycon = "uart8250,io,0x3f8"`` must be quoted to land as a single ``earlycon=`` entry, exactly as for the runtime parser.h](hthe kernel boots as if }(hjQ hhhNhNubj)}(h``loglevel=7 mem=4G``h]hloglevel=7 mem=4G}(hjY hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ ubh had been prepended to the bootloader command line, with the values visible to early-parsed handlers. Comma-separated values are still expanded into multiple cmdline entries per the bootconfig array convention -- the embedded }(hjQ hhhNhNubj)}(h)``kernel.earlycon = "uart8250,io,0x3f8"``h]h%kernel.earlycon = "uart8250,io,0x3f8"}(hjk hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ ubh$ must be quoted to land as a single }(hjQ hhhNhNubj)}(h ``earlycon=``h]h earlycon=}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ ubh* entry, exactly as for the runtime parser.}(hjQ hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhM hjvhhubj )}(hIf the rendered string would not fit in ``COMMAND_LINE_SIZE`` together with the existing command line, the prepend is skipped and an error is logged, so an oversized embedded bootconfig cannot brick a boot.h](h(If the rendered string would not fit in }(hj hhhNhNubj)}(h``COMMAND_LINE_SIZE``h]hCOMMAND_LINE_SIZE}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh together with the existing command line, the prepend is skipped and an error is logged, so an oversized embedded bootconfig cannot brick a boot.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhMhjvhhubh)}(hhh](h)}(h:Interaction with other command line and bootconfig sourcesh]h:Interaction with other command line and bootconfig sources}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubj )}(hXxWith ``CONFIG_CMDLINE_FROM_BOOTCONFIG=y`` the rendered ``kernel`` subtree behaves like a build-time command line (similar to ``CONFIG_CMDLINE``), not like a bootconfig source. It is prepended to ``boot_command_line`` in ``setup_arch()``, before ``parse_early_param()`` and long before the runtime parser looks at an initrd. Options can reach the kernel from up to four places:h](hWith }(hj hhhNhNubj)}(h$``CONFIG_CMDLINE_FROM_BOOTCONFIG=y``h]h CONFIG_CMDLINE_FROM_BOOTCONFIG=y}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh the rendered }(hj hhhNhNubj)}(h ``kernel``h]hkernel}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh< subtree behaves like a build-time command line (similar to }(hj hhhNhNubj)}(h``CONFIG_CMDLINE``h]hCONFIG_CMDLINE}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh4), not like a bootconfig source. It is prepended to }(hj hhhNhNubj)}(h``boot_command_line``h]hboot_command_line}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh in }(hj hhhNhNubj)}(h``setup_arch()``h]h setup_arch()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh , before }(hj hhhNhNubj)}(h``parse_early_param()``h]hparse_early_param()}(hj( hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhl and long before the runtime parser looks at an initrd. Options can reach the kernel from up to four places:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhMhj hhubh bullet_list)}(hhh](h list_item)}(hBootloader command line: the arguments the boot loader passes. The embedded cmdline is prepended in front of them, so for last-one-wins parameters a bootloader option still overrides the embedded value. Visible in /proc/cmdline.h]j )}(hBootloader command line: the arguments the boot loader passes. The embedded cmdline is prepended in front of them, so for last-one-wins parameters a bootloader option still overrides the embedded value. Visible in /proc/cmdline.h]hBootloader command line: the arguments the boot loader passes. The embedded cmdline is prepended in front of them, so for last-one-wins parameters a bootloader option still overrides the embedded value. Visible in /proc/cmdline.}(hjK hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhM"hjG ubah}(h]h ]h"]h$]h&]uh1jE hjB hhhhhNubjF )}(hEmbedded cmdline (this option): the rendered ``kernel`` subtree, prepended early so it is seen by ``parse_early_param()``. Visible in /proc/cmdline.h]j )}(hEmbedded cmdline (this option): the rendered ``kernel`` subtree, prepended early so it is seen by ``parse_early_param()``. Visible in /proc/cmdline.h](h-Embedded cmdline (this option): the rendered }(hjc hhhNhNubj)}(h ``kernel``h]hkernel}(hjk hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc ubh+ subtree, prepended early so it is seen by }(hjc hhhNhNubj)}(h``parse_early_param()``h]hparse_early_param()}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc ubh. Visible in /proc/cmdline.}(hjc hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhM&hj_ ubah}(h]h ]h"]h$]h&]uh1jE hjB hhhhhNubjF )}(hXHInitrd bootconfig: parsed late in ``setup_boot_config()``; its ``kernel`` keys are placed ahead of ``boot_command_line``, i.e. before the embedded cmdline, so last-wins favors the embedded values. As a bootconfig source, an initrd bootconfig still replaces the embedded bootconfig. Visible in /proc/cmdline and /proc/bootconfig.h]j )}(hXHInitrd bootconfig: parsed late in ``setup_boot_config()``; its ``kernel`` keys are placed ahead of ``boot_command_line``, i.e. before the embedded cmdline, so last-wins favors the embedded values. As a bootconfig source, an initrd bootconfig still replaces the embedded bootconfig. Visible in /proc/cmdline and /proc/bootconfig.h](h"Initrd bootconfig: parsed late in }(hj hhhNhNubj)}(h``setup_boot_config()``h]hsetup_boot_config()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh; its }(hj hhhNhNubj)}(h ``kernel``h]hkernel}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh keys are placed ahead of }(hj hhhNhNubj)}(h``boot_command_line``h]hboot_command_line}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh, i.e. before the embedded cmdline, so last-wins favors the embedded values. As a bootconfig source, an initrd bootconfig still replaces the embedded bootconfig. Visible in /proc/cmdline and /proc/bootconfig.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhM)hj ubah}(h]h ]h"]h$]h&]uh1jE hjB hhhhhNubjF )}(hEmbedded bootconfig (runtime): parsed late, only when no initrd bootconfig is present. Visible in /proc/cmdline and /proc/bootconfig. h]j )}(hEmbedded bootconfig (runtime): parsed late, only when no initrd bootconfig is present. Visible in /proc/cmdline and /proc/bootconfig.h]hEmbedded bootconfig (runtime): parsed late, only when no initrd bootconfig is present. Visible in /proc/cmdline and /proc/bootconfig.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhM.hj ubah}(h]h ]h"]h$]h&]uh1jE hjB hhhhhNubeh}(h]h ]h"]h$]h&]bullet-uh1j@ hhhM"hj hhubj )}(hXySo with this option the embedded ``kernel.*`` values take precedence over an initrd bootconfig's ``kernel.*`` values: for early parameters the initrd is not parsed yet, and for ordinary parameters the embedded keys land later in the command line. If you need an initrd bootconfig to override the embedded ``kernel.*`` keys, leave this option off and rely on the runtime parser.h](h!So with this option the embedded }(hj hhhNhNubj)}(h ``kernel.*``h]hkernel.*}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh6 values take precedence over an initrd bootconfig’s }(hj hhhNhNubj)}(h ``kernel.*``h]hkernel.*}(hj# hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh values: for early parameters the initrd is not parsed yet, and for ordinary parameters the embedded keys land later in the command line. If you need an initrd bootconfig to override the embedded }(hj hhhNhNubj)}(h ``kernel.*``h]hkernel.*}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh< keys, leave this option off and rely on the runtime parser.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhM1hj hhubj )}(hXAThe rendered string is part of the command line, so it appears in /proc/cmdline. It is deliberately not shown in /proc/bootconfig: that file keeps reporting the parsed bootconfig tree -- the initrd bootconfig if present, otherwise the embedded bootconfig -- independent of whether build-time cmdline rendering is enabled.h]hXAThe rendered string is part of the command line, so it appears in /proc/cmdline. It is deliberately not shown in /proc/bootconfig: that file keeps reporting the parsed bootconfig tree -- the initrd bootconfig if present, otherwise the embedded bootconfig -- independent of whether build-time cmdline rendering is enabled.}(hjM hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhM8hj hhubeh}(h]:interaction-with-other-command-line-and-bootconfig-sourcesah ]h"]:interaction with other command line and bootconfig sourcesah$]h&]uh1hhjvhhhhhMubeh}(h],rendering-embedded-kernel-keys-at-build-timeah ]h"].rendering embedded kernel.* keys at build timeah$]h&]uh1hhjhhhhhKubeh}(h]boot-kernel-with-a-boot-configah ]h"]boot kernel with a boot configah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h!Kernel parameters via Boot Configh]h!Kernel parameters via Boot Config}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjs hhhhhM?ubj )}(hX<In addition to the kernel command line, the boot config can be used for passing the kernel parameters. All the key-value pairs under ``kernel`` key will be passed to kernel cmdline directly. Moreover, the key-value pairs under ``init`` will be passed to init process via the cmdline. The parameters are concatenated with user-given kernel cmdline string as the following order, so that the command line parameter can override bootconfig parameters (this depends on how the subsystem handles parameters but in general, earlier parameter will be overwritten by later one.)::h](hIn addition to the kernel command line, the boot config can be used for passing the kernel parameters. All the key-value pairs under }(hj hhhNhNubj)}(h ``kernel``h]hkernel}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhT key will be passed to kernel cmdline directly. Moreover, the key-value pairs under }(hj hhhNhNubj)}(h``init``h]hinit}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhXP will be passed to init process via the cmdline. The parameters are concatenated with user-given kernel cmdline string as the following order, so that the command line parameter can override bootconfig parameters (this depends on how the subsystem handles parameters but in general, earlier parameter will be overwritten by later one.):}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hhhMAhjs hhubj|)}(hT[bootconfig params][cmdline params] -- [bootconfig init params][cmdline init params]h]hT[bootconfig params][cmdline params] -- [bootconfig init params][cmdline init params]}hj sbah}(h]h ]h"]h$]h&]hhuh1j{hhhMJhjs hhubj )}(hGHere is an example of the bootconfig file for kernel/init parameters.::h]hFHere is an example of the bootconfig file for kernel/init parameters.:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhMLhjs hhubj|)}(hGkernel { root = 01234567-89ab-cdef-0123-456789abcd } init { splash }h]hGkernel { root = 01234567-89ab-cdef-0123-456789abcd } init { splash }}hj sbah}(h]h ]h"]h$]h&]hhuh1j{hhhMNhjs hhubj )}(hEThis will be copied into the kernel cmdline string as the following::h]hDThis will be copied into the kernel cmdline string as the following:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhMUhjs hhubj|)}(h3root="01234567-89ab-cdef-0123-456789abcd" -- splashh]h3root="01234567-89ab-cdef-0123-456789abcd" -- splash}hj sbah}(h]h ]h"]h$]h&]hhuh1j{hhhMWhjs hhubj )}(h-If user gives some other command line like,::h]h,If user gives some other command line like,:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhMYhjs hhubj|)}(hro bootconfig -- quieth]hro bootconfig -- quiet}hj sbah}(h]h ]h"]h$]h&]hhuh1j{hhhM[hjs hhubj )}(h0The final kernel cmdline will be the following::h]h/The final kernel cmdline will be the following:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhM]hjs hhubj|)}(hGroot="01234567-89ab-cdef-0123-456789abcd" ro bootconfig -- splash quieth]hGroot="01234567-89ab-cdef-0123-456789abcd" ro bootconfig -- splash quiet}hj& sbah}(h]h ]h"]h$]h&]hhuh1j{hhhM_hjs hhubeh}(h]!kernel-parameters-via-boot-configah ]h"]!kernel parameters via boot configah$]h&]uh1hhhhhhhhM?ubh)}(hhh](h)}(hConfig File Limitationh]hConfig File Limitation}(hj? hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj< hhhhhMcubj )}(hXCurrently the maximum config size is 32KB and the total key-words (not key-value entries) must be under 1024 nodes. Note: this is not the number of entries but nodes, an entry must consume more than 2 nodes (a key-word and a value). So theoretically, it will be up to 512 key-value pairs. If keys contains 3 words in average, it can contain 256 key-value pairs. In most cases, the number of config items will be under 100 entries and smaller than 8KB, so it would be enough. If the node number exceeds 1024, parser returns an error even if the file size is smaller than 32KB. (Note that this maximum size is not including the padding null characters.) Anyway, since bootconfig command verifies it when appending a boot config to initrd image, user can notice it before boot.h]hXCurrently the maximum config size is 32KB and the total key-words (not key-value entries) must be under 1024 nodes. Note: this is not the number of entries but nodes, an entry must consume more than 2 nodes (a key-word and a value). So theoretically, it will be up to 512 key-value pairs. If keys contains 3 words in average, it can contain 256 key-value pairs. In most cases, the number of config items will be under 100 entries and smaller than 8KB, so it would be enough. If the node number exceeds 1024, parser returns an error even if the file size is smaller than 32KB. (Note that this maximum size is not including the padding null characters.) Anyway, since bootconfig command verifies it when appending a boot config to initrd image, user can notice it before boot.}(hjM hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhMehj< hhubeh}(h]config-file-limitationah ]h"]config file limitationah$]h&]uh1hhhhhhhhMcubh)}(hhh](h)}(hBootconfig APIsh]hBootconfig APIs}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjc hhhhhMtubj )}(hUser can query or loop on key-value pairs, also it is possible to find a root (prefix) key node and find key-values under that node.h]hUser can query or loop on key-value pairs, also it is possible to find a root (prefix) key node and find key-values under that node.}(hjt hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhMvhjc hhubj )}(hX6If you have a key string, you can query the value directly with the key using xbc_find_value(). If you want to know what keys exist in the boot config, you can use xbc_for_each_key_value() to iterate key-value pairs. Note that you need to use xbc_array_for_each_value() for accessing each array's value, e.g.::h]hX7If you have a key string, you can query the value directly with the key using xbc_find_value(). If you want to know what keys exist in the boot config, you can use xbc_for_each_key_value() to iterate key-value pairs. Note that you need to use xbc_array_for_each_value() for accessing each array’s value, e.g.:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhMyhjc hhubj|)}(hvnode = NULL; xbc_find_value("key.word", &vnode); if (vnode && xbc_node_is_array(vnode)) xbc_array_for_each_value(vnode, value) { printk("%s ", value); }h]hvnode = NULL; xbc_find_value("key.word", &vnode); if (vnode && xbc_node_is_array(vnode)) xbc_array_for_each_value(vnode, value) { printk("%s ", value); }}hj sbah}(h]h ]h"]h$]h&]hhuh1j{hhhMhjc hhubj )}(hIf you want to focus on keys which have a prefix string, you can use xbc_find_node() to find a node by the prefix string, and iterate keys under the prefix node with xbc_node_for_each_key_value().h]hIf you want to focus on keys which have a prefix string, you can use xbc_find_node() to find a node by the prefix string, and iterate keys under the prefix node with xbc_node_for_each_key_value().}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhMhjc hhubj )}(hpBut the most typical usage is to get the named value under prefix or get the named array under prefix as below::h]hoBut the most typical usage is to get the named value under prefix or get the named array under prefix as below:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhMhjc hhubj|)}(hroot = xbc_find_node("key.prefix"); value = xbc_node_find_value(root, "option", &vnode); ... xbc_node_for_each_array_value(root, "array-option", value, anode) { ... }h]hroot = xbc_find_node("key.prefix"); value = xbc_node_find_value(root, "option", &vnode); ... xbc_node_for_each_array_value(root, "array-option", value, anode) { ... }}hj sbah}(h]h ]h"]h$]h&]hhuh1j{hhhMhjc hhubj )}(hWThis accesses a value of "key.prefix.option" and an array of "key.prefix.array-option".h]h_This accesses a value of “key.prefix.option” and an array of “key.prefix.array-option”.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhMhjc hhubj )}(hLocking is not needed, since after initialization, the config becomes read-only. All data and keys must be copied if you need to modify it.h]hLocking is not needed, since after initialization, the config becomes read-only. All data and keys must be copied if you need to modify it.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hhhMhjc hhubeh}(h]bootconfig-apisah ]h"]bootconfig apisah$]h&]uh1hhhhhhhhMtubh)}(hhh](h)}(hFunctions and structuresh]hFunctions and structures}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singlexbc_calc_checksum (C function)c.xbc_calc_checksumhNtauh1j hj hhhNhNubhdesc)}(hhh](hdesc_signature)}(hhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj6ubj)}(hhh]j )}(h Search keyh]h Search key}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjQhKhjRubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1jhjQhKhj3ubj)}(hC``struct xbc_node **vnode`` A container pointer of XBC value node. h](j)}(h``struct xbc_node **vnode``h]j)}(hjuh]hstruct xbc_node **vnode}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjoubj)}(hhh]j )}(h&A container pointer of XBC value node.h]h&A container pointer of XBC value node.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1jhjhKhj3ubeh}(h]h ]h"]h$]h&]uh1jhjubj )}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubj )}(hSearch a value whose key matches **key** from whole of XBC tree and return the value if found. Found value node is stored in ***vnode**. Note that this can return 0-length string and store NULL in ***vnode** for key-only (non-value) entry.h](h!Search a value whose key matches }(hjhhhNhNubj)}(h**key**h]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhU from whole of XBC tree and return the value if found. Found value node is stored in }(hjhhhNhNubj)}(h ***vnode**h]h*vnode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh>. Note that this can return 0-length string and store NULL in }(hjhhhNhNubj)}(h ***vnode**h]h*vnode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh for key-only (non-value) entry.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j xbc_find_node (C function)c.xbc_find_nodehNtauh1j hj hhhNhNubj )}(hhh](j )}(h1struct xbc_node * xbc_find_node (const char *key)h]j )}(h/struct xbc_node *xbc_find_node(const char *key)h](j )}(hjh]hstruct}(hj+hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj'hhhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKubjQ )}(h h]h }(hj9hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj'hhhj8hKubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hjJhhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjGubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetjLmodnameN classnameNj@ jC )}jF ]jI )}j< xbc_find_nodesbc.xbc_find_nodeasbuh1hhj'hhhj8hKubjQ )}(h h]h }(hjkhhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj'hhhj8hKubj )}(hj h]h*}(hjyhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj'hhhj8hKubjb )}(h xbc_find_nodeh]j# )}(hjhh]h xbc_find_node}(hjhhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hj'hhhj8hKubj} )}(h(const char *key)h]j )}(hconst char *keyh](j )}(hj h]hconst}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubjQ )}(h h]h }(hjhhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjubj )}(hcharh]hchar}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubjQ )}(h h]h }(hjhhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubj# )}(hkeyh]hkey}(hjhhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjubah}(h]h ]h"]h$]h&]hhuh1j| hj'hhhj8hKubeh}(h]h ]h"]h$]h&]hhj@uh1j jAjBhj#hhhj8hKubah}(h]jah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hj8hKhj hhubjO)}(hhh]j )}(h!Find a node which matches the keyh]h!Find a node which matches the key}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jNhj hhhj8hKubeh}(h]h ](j: functioneh"]h$]h&]joj: jpj+jqj+jrjsjtuh1j hhhj hNhNubjv)}(h**Parameters** ``const char *key`` Search key **Description** Search a (key) node whose key matches **key** from whole of XBC tree and return the node if found. If not found, returns NULL.h](j )}(h**Parameters**h]j)}(hj5h]h Parameters}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj/ubj)}(hhh]j)}(h``const char *key`` Search key h](j)}(h``const char *key``h]j)}(hjTh]hconst char *key}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjNubj)}(hhh]j )}(h Search keyh]h Search key}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjihKhjjubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhjihKhjKubah}(h]h ]h"]h$]h&]uh1jhj/ubj )}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj/ubj )}(h~Search a (key) node whose key matches **key** from whole of XBC tree and return the node if found. If not found, returns NULL.h](h&Search a (key) node whose key matches }(hjhhhNhNubj)}(h**key**h]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhQ from whole of XBC tree and return the node if found. If not found, returns NULL.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j xbc_node_get_subkey (C function)c.xbc_node_get_subkeyhNtauh1j hj hhhNhNubj )}(hhh](j )}(h=struct xbc_node * xbc_node_get_subkey (struct xbc_node *node)h]j )}(h;struct xbc_node *xbc_node_get_subkey(struct xbc_node *node)h](j )}(hjh]hstruct}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKubjQ )}(h h]h }(hjhhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjhhhjhKubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hjhhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetjmodnameN classnameNj@ jC )}jF ]jI )}j< xbc_node_get_subkeysbc.xbc_node_get_subkeyasbuh1hhjhhhjhKubjQ )}(h h]h }(hj&hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjhhhjhKubj )}(hj h]h*}(hj4hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjhhhjhKubjb )}(hxbc_node_get_subkeyh]j# )}(hj#h]hxbc_node_get_subkey}(hjEhhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjAubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hjhhhjhKubj} )}(h(struct xbc_node *node)h]j )}(hstruct xbc_node *nodeh](j )}(hjh]hstruct}(hj`hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj\ubjQ )}(h h]h }(hjmhhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj\ubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hj~hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj{ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetjmodnameN classnameNj@ jC )}jF ]j!c.xbc_node_get_subkeyasbuh1hhj\ubjQ )}(h h]h }(hjhhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj\ubj )}(hj h]h*}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj\ubj# )}(hnodeh]hnode}(hjhhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj\ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjXubah}(h]h ]h"]h$]h&]hhuh1j| hjhhhjhKubeh}(h]h ]h"]h$]h&]hhj@uh1j jAjBhjhhhjhKubah}(h]jah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hjhKhjhhubjO)}(hhh]j )}(h&Return the first subkey node if existsh]h&Return the first subkey node if exists}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jNhjhhhjhKubeh}(h]h ](j: functioneh"]h$]h&]joj: jpjjqjjrjsjtuh1j hhhj hNhNubjv)}(h**Parameters** ``struct xbc_node *node`` Parent node **Description** Return the first subkey node of the **node**. If the **node** has no child or only value node, this will return NULL.h](j )}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubj)}(hhh]j)}(h&``struct xbc_node *node`` Parent node h](j)}(h``struct xbc_node *node``h]j)}(hj"h]hstruct xbc_node *node}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubj)}(hhh]j )}(h Parent nodeh]h Parent node}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj7hKhj8ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj7hKhjubah}(h]h ]h"]h$]h&]uh1jhjubj )}(h**Description**h]j)}(hj]h]h Description}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubj )}(huReturn the first subkey node of the **node**. If the **node** has no child or only value node, this will return NULL.h](h$Return the first subkey node of the }(hjshhhNhNubj)}(h**node**h]hnode}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubh . If the }(hjshhhNhNubj)}(h**node**h]hnode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubh8 has no child or only value node, this will return NULL.}(hjshhhNhNubeh}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j "xbc_array_for_each_value (C macro)c.xbc_array_for_each_valuehNtauh1j hj hhhNhNubj )}(hhh](j )}(hxbc_array_for_each_valueh]j )}(hxbc_array_for_each_valueh]jb )}(hxbc_array_for_each_valueh]j# )}(hjh]hxbc_array_for_each_value}(hjhhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hjhhhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKubah}(h]h ]h"]h$]h&]hhj@uh1j jAjBhjhhhjhKubah}(h]jah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hjhKhjhhubjO)}(hhh]h}(h]h ]h"]h$]h&]uh1jNhjhhhjhKubeh}(h]h ](j: macroeh"]h$]h&]joj: jpjjqjjrjsjtuh1j hhhj hNhNubj )}(h+``xbc_array_for_each_value (anode, value)``h]j)}(hjh]h'xbc_array_for_each_value (anode, value)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj hhubh block_quote)}(h Iterate value nodes on an array h]j )}(hIterate value nodes on an arrayh]hIterate value nodes on an array}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj&hKhj hhubjv)}(hX**Parameters** ``anode`` An XBC arraied value node ``value`` A value **Description** Iterate array value nodes and values starts from **anode**. This is expected to be used with xbc_find_value() and xbc_node_find_value(), so that user can process each array entry node.h](j )}(h**Parameters**h]j)}(hj3h]h Parameters}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj-ubj)}(hhh](j)}(h$``anode`` An XBC arraied value node h](j)}(h ``anode``h]j)}(hjRh]hanode}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjLubj)}(hhh]j )}(hAn XBC arraied value nodeh]hAn XBC arraied value node}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjghKhjhubah}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]uh1jhjghKhjIubj)}(h``value`` A value h](j)}(h ``value``h]j)}(hjh]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubj)}(hhh]j )}(hA valueh]hA value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjIubeh}(h]h ]h"]h$]h&]uh1jhj-ubj )}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj-ubj )}(hIterate array value nodes and values starts from **anode**. This is expected to be used with xbc_find_value() and xbc_node_find_value(), so that user can process each array entry node.h](h1Iterate array value nodes and values starts from }(hjhhhNhNubj)}(h **anode**h]hanode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh~. This is expected to be used with xbc_find_value() and xbc_node_find_value(), so that user can process each array entry node.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj-ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j !xbc_node_for_each_child (C macro)c.xbc_node_for_each_childhNtauh1j hj hhhNhNubj )}(hhh](j )}(hxbc_node_for_each_childh]j )}(hxbc_node_for_each_childh]jb )}(hxbc_node_for_each_childh]j# )}(hjh]hxbc_node_for_each_child}(hj!hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hjhhhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKubah}(h]h ]h"]h$]h&]hhj@uh1j jAjBhjhhhj4hKubah}(h]jah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hj4hKhjhhubjO)}(hhh]h}(h]h ]h"]h$]h&]uh1jNhjhhhj4hKubeh}(h]h ](j: macroeh"]h$]h&]joj: jpjMjqjMjrjsjtuh1j hhhj hNhNubj )}(h+``xbc_node_for_each_child (parent, child)``h]j)}(hjSh]h'xbc_node_for_each_child (parent, child)}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj hhubj)}(hIterate child nodes h]j )}(hIterate child nodesh]hIterate child nodes}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjiubah}(h]h ]h"]h$]h&]uh1jhj{hKhj hhubjv)}(h**Parameters** ``parent`` An XBC node. ``child`` Iterated XBC node. **Description** Iterate child nodes of **parent**. Each child nodes are stored to **child**. The **child** can be mixture of a value node and subkey nodes.h](j )}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubj)}(hhh](j)}(h``parent`` An XBC node. h](j)}(h ``parent``h]j)}(hjh]hparent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubj)}(hhh]j )}(h An XBC node.h]h An XBC node.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h``child`` Iterated XBC node. h](j)}(h ``child``h]j)}(hjh]hchild}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubj)}(hhh]j )}(hIterated XBC node.h]hIterated XBC node.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubj )}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubj )}(hIterate child nodes of **parent**. Each child nodes are stored to **child**. The **child** can be mixture of a value node and subkey nodes.h](hIterate child nodes of }(hj1hhhNhNubj)}(h **parent**h]hparent}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh!. Each child nodes are stored to }(hj1hhhNhNubj)}(h **child**h]hchild}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh. The }(hj1hhhNhNubj)}(h **child**h]hchild}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh1 can be mixture of a value node and subkey nodes.}(hj1hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j "xbc_node_for_each_subkey (C macro)c.xbc_node_for_each_subkeyhNtauh1j hj hhhNhNubj )}(hhh](j )}(hxbc_node_for_each_subkeyh]j )}(hxbc_node_for_each_subkeyh]jb )}(hxbc_node_for_each_subkeyh]j# )}(hjh]hxbc_node_for_each_subkey}(hjhhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hjhhhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKubah}(h]h ]h"]h$]h&]hhj@uh1j jAjBhjhhhjhKubah}(h]jah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hjhKhjhhubjO)}(hhh]h}(h]h ]h"]h$]h&]uh1jNhjhhhjhKubeh}(h]h ](j: macroeh"]h$]h&]joj: jpjjqjjrjsjtuh1j hhhj hNhNubj )}(h,``xbc_node_for_each_subkey (parent, child)``h]j)}(hjh]h(xbc_node_for_each_subkey (parent, child)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj hhubj)}(hIterate child subkey nodes h]j )}(hIterate child subkey nodesh]hIterate child subkey nodes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjhKhj hhubjv)}(h**Parameters** ``parent`` An XBC node. ``child`` Iterated XBC node. **Description** Iterate subkey nodes of **parent**. Each child nodes are stored to **child**. The **child** is only the subkey node.h](j )}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubj)}(hhh](j)}(h``parent`` An XBC node. h](j)}(h ``parent``h]j)}(hj h]hparent}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubj)}(hhh]j )}(h An XBC node.h]h An XBC node.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj5hKhj6ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj5hKhjubj)}(h``child`` Iterated XBC node. h](j)}(h ``child``h]j)}(hjYh]hchild}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjSubj)}(hhh]j )}(hIterated XBC node.h]hIterated XBC node.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjnhKhjoubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhjnhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubj )}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubj )}(htIterate subkey nodes of **parent**. Each child nodes are stored to **child**. The **child** is only the subkey node.h](hIterate subkey nodes of }(hjhhhNhNubj)}(h **parent**h]hparent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh!. Each child nodes are stored to }(hjhhhNhNubj)}(h **child**h]hchild}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. The }(hjhhhNhNubj)}(h **child**h]hchild}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is only the subkey node.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j 'xbc_node_for_each_array_value (C macro)c.xbc_node_for_each_array_valuehNtauh1j hj hhhNhNubj )}(hhh](j )}(hxbc_node_for_each_array_valueh]j )}(hxbc_node_for_each_array_valueh]jb )}(hxbc_node_for_each_array_valueh]j# )}(hj h]hxbc_node_for_each_array_value}(hj hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hj hhhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKubah}(h]h ]h"]h$]h&]hhj@uh1j jAjBhj hhhj& hKubah}(h]j ah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hj& hKhj hhubjO)}(hhh]h}(h]h ]h"]h$]h&]uh1jNhj hhhj& hKubeh}(h]h ](j: macroeh"]h$]h&]joj: jpj? jqj? jrjsjtuh1j hhhj hNhNubj )}(h;``xbc_node_for_each_array_value (node, key, anode, value)``h]j)}(hjE h]h7xbc_node_for_each_array_value (node, key, anode, value)}(hjG hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj hhubj)}(h#Iterate array entries of geven key h]j )}(h"Iterate array entries of geven keyh]h"Iterate array entries of geven key}(hj_ hhhNhNubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj[ ubah}(h]h ]h"]h$]h&]uh1jhjm hKhj hhubjv)}(hX]**Parameters** ``node`` An XBC node. ``key`` A key string searched under **node** ``anode`` Iterated XBC node of array entry. ``value`` Iterated value of array entry. **Description** Iterate array entries of given **key** under **node**. Each array entry node is stored to **anode** and **value**. If the **node** doesn't have **key** node, it does nothing. Note that even if the found key node has only one value (not array) this executes block once. However, if the found key node has no value (key-only node), this does nothing. So don't use this for testing the key-value pair existence.h](j )}(h**Parameters**h]j)}(hjz h]h Parameters}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjt ubj)}(hhh](j)}(h``node`` An XBC node. h](j)}(h``node``h]j)}(hj h]hnode}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj ubj)}(hhh]j )}(h An XBC node.h]h An XBC node.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj hKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj ubj)}(h-``key`` A key string searched under **node** h](j)}(h``key``h]j)}(hj h]hkey}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj ubj)}(hhh]j )}(h$A key string searched under **node**h](hA key string searched under }(hj hhhNhNubj)}(h**node**h]hnode}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j hj hKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj ubj)}(h,``anode`` Iterated XBC node of array entry. h](j)}(h ``anode``h]j)}(hj!h]hanode}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj!ubj)}(hhh]j )}(h!Iterated XBC node of array entry.h]h!Iterated XBC node of array entry.}(hj2!hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj.!hKhj/!ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj.!hKhj ubj)}(h)``value`` Iterated value of array entry. h](j)}(h ``value``h]j)}(hjR!h]hvalue}(hjT!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP!ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjL!ubj)}(hhh]j )}(hIterated value of array entry.h]hIterated value of array entry.}(hjk!hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjg!hKhjh!ubah}(h]h ]h"]h$]h&]uh1jhjL!ubeh}(h]h ]h"]h$]h&]uh1jhjg!hKhj ubeh}(h]h ]h"]h$]h&]uh1jhjt ubj )}(h**Description**h]j)}(hj!h]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjt ubj )}(hXIterate array entries of given **key** under **node**. Each array entry node is stored to **anode** and **value**. If the **node** doesn't have **key** node, it does nothing. Note that even if the found key node has only one value (not array) this executes block once. However, if the found key node has no value (key-only node), this does nothing. So don't use this for testing the key-value pair existence.h](hIterate array entries of given }(hj!hhhNhNubj)}(h**key**h]hkey}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh under }(hj!hhhNhNubj)}(h**node**h]hnode}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh%. Each array entry node is stored to }(hj!hhhNhNubj)}(h **anode**h]hanode}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh and }(hj!hhhNhNubj)}(h **value**h]hvalue}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh . If the }(hj!hhhNhNubj)}(h**node**h]hnode}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh doesn’t have }(hj!hhhNhNubj)}(h**key**h]hkey}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubhX node, it does nothing. Note that even if the found key node has only one value (not array) this executes block once. However, if the found key node has no value (key-only node), this does nothing. So don’t use this for testing the key-value pair existence.}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjt ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j %xbc_node_for_each_key_value (C macro)c.xbc_node_for_each_key_valuehNtauh1j hj hhhNhNubj )}(hhh](j )}(hxbc_node_for_each_key_valueh]j )}(hxbc_node_for_each_key_valueh]jb )}(hxbc_node_for_each_key_valueh]j# )}(hj8"h]hxbc_node_for_each_key_value}(hjB"hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj>"ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hj:"hhhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKubah}(h]h ]h"]h$]h&]hhj@uh1j jAjBhj6"hhhjU"hKubah}(h]j1"ah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hjU"hKhj3"hhubjO)}(hhh]h}(h]h ]h"]h$]h&]uh1jNhj3"hhhjU"hKubeh}(h]h ](j: macroeh"]h$]h&]joj: jpjn"jqjn"jrjsjtuh1j hhhj hNhNubj )}(h4``xbc_node_for_each_key_value (node, knode, value)``h]j)}(hjt"h]h0xbc_node_for_each_key_value (node, knode, value)}(hjv"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjr"ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj hhubj)}(h%Iterate key-value pairs under a node h]j )}(h$Iterate key-value pairs under a nodeh]h$Iterate key-value pairs under a node}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj"ubah}(h]h ]h"]h$]h&]uh1jhj"hKhj hhubjv)}(h**Parameters** ``node`` An XBC node. ``knode`` Iterated key node ``value`` Iterated value string **Description** Iterate key-value pairs under **node**. Each key node and value string are stored in **knode** and **value** respectively.h](j )}(h**Parameters**h]j)}(hj"h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj"ubj)}(hhh](j)}(h``node`` An XBC node. h](j)}(h``node``h]j)}(hj"h]hnode}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj"ubj)}(hhh]j )}(h An XBC node.h]h An XBC node.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj"hKhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj"hKhj"ubj)}(h``knode`` Iterated key node h](j)}(h ``knode``h]j)}(hj#h]hknode}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj"ubj)}(hhh]j )}(hIterated key nodeh]hIterated key node}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj#hKhj#ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj#hKhj"ubj)}(h ``value`` Iterated value string h](j)}(h ``value``h]j)}(hj:#h]hvalue}(hj<#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8#ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj4#ubj)}(hhh]j )}(hIterated value stringh]hIterated value string}(hjS#hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjO#hKhjP#ubah}(h]h ]h"]h$]h&]uh1jhj4#ubeh}(h]h ]h"]h$]h&]uh1jhjO#hKhj"ubeh}(h]h ]h"]h$]h&]uh1jhj"ubj )}(h**Description**h]j)}(hju#h]h Description}(hjw#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs#ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj"ubj )}(hzIterate key-value pairs under **node**. Each key node and value string are stored in **knode** and **value** respectively.h](hIterate key-value pairs under }(hj#hhhNhNubj)}(h**node**h]hnode}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh/. Each key node and value string are stored in }(hj#hhhNhNubj)}(h **knode**h]hknode}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh and }(hj#hhhNhNubj)}(h **value**h]hvalue}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh respectively.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j xbc_for_each_key_value (C macro)c.xbc_for_each_key_valuehNtauh1j hj hhhNhNubj )}(hhh](j )}(hxbc_for_each_key_valueh]j )}(hxbc_for_each_key_valueh]jb )}(hxbc_for_each_key_valueh]j# )}(hj#h]hxbc_for_each_key_value}(hj#hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj#ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hj#hhhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKubah}(h]h ]h"]h$]h&]hhj@uh1j jAjBhj#hhhj$hKubah}(h]j#ah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hj$hKhj#hhubjO)}(hhh]h}(h]h ]h"]h$]h&]uh1jNhj#hhhj$hKubeh}(h]h ](j: macroeh"]h$]h&]joj: jpj $jqj $jrjsjtuh1j hhhj hNhNubj )}(h)``xbc_for_each_key_value (knode, value)``h]j)}(hj&$h]h%xbc_for_each_key_value (knode, value)}(hj($hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$$ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhMhj hhubj)}(hIterate key-value pairs h]j )}(hIterate key-value pairsh]hIterate key-value pairs}(hj@$hhhNhNubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhj<$ubah}(h]h ]h"]h$]h&]uh1jhjN$hKhj hhubjv)}(h**Parameters** ``knode`` Iterated key node ``value`` Iterated value string **Description** Iterate key-value pairs in whole XBC tree. Each key node and value string are stored in **knode** and **value** respectively.h](j )}(h**Parameters**h]j)}(hj[$h]h Parameters}(hj]$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY$ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhMhjU$ubj)}(hhh](j)}(h``knode`` Iterated key node h](j)}(h ``knode``h]j)}(hjz$h]hknode}(hj|$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx$ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhKhjt$ubj)}(hhh]j )}(hIterated key nodeh]hIterated key node}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj$hKhj$ubah}(h]h ]h"]h$]h&]uh1jhjt$ubeh}(h]h ]h"]h$]h&]uh1jhj$hKhjq$ubj)}(h ``value`` Iterated value string h](j)}(h ``value``h]j)}(hj$h]hvalue}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhMhj$ubj)}(hhh]j )}(hIterated value stringh]hIterated value string}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj$hMhj$ubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hMhjq$ubeh}(h]h ]h"]h$]h&]uh1jhjU$ubj )}(h**Description**h]j)}(hj$h]h Description}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhMhjU$ubj )}(h}Iterate key-value pairs in whole XBC tree. Each key node and value string are stored in **knode** and **value** respectively.h](hXIterate key-value pairs in whole XBC tree. Each key node and value string are stored in }(hj%hhhNhNubj)}(h **knode**h]hknode}(hj %hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh and }(hj%hhhNhNubj)}(h **value**h]hvalue}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh respectively.}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhMhjU$ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j !xbc_node_compose_key (C function)c.xbc_node_compose_keyhNtauh1j hj hhhNhNubj )}(hhh](j )}(hHint xbc_node_compose_key (struct xbc_node *node, char *buf, size_t size)h]j )}(hGint xbc_node_compose_key(struct xbc_node *node, char *buf, size_t size)h](j )}(hinth]hint}(hjW%hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjS%hhhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhMubjQ )}(h h]h }(hjf%hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjS%hhhje%hMubjb )}(hxbc_node_compose_keyh]j# )}(hxbc_node_compose_keyh]hxbc_node_compose_key}(hjx%hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjt%ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hjS%hhhje%hMubj} )}(h/(struct xbc_node *node, char *buf, size_t size)h](j )}(hstruct xbc_node *nodeh](j )}(hjh]hstruct}(hj%hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj%ubjQ )}(h h]h }(hj%hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj%ubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hj%hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj%ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetj%modnameN classnameNj@ jC )}jF ]jI )}j< jz%sbc.xbc_node_compose_keyasbuh1hhj%ubjQ )}(h h]h }(hj%hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj%ubj )}(hj h]h*}(hj%hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj%ubj# )}(hnodeh]hnode}(hj%hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj%ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj%ubj )}(h char *bufh](j )}(hcharh]hchar}(hj&hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj&ubjQ )}(h h]h }(hj&hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj&ubj )}(hj h]h*}(hj"&hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj&ubj# )}(hbufh]hbuf}(hj/&hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj%ubj )}(h size_t sizeh](h)}(hhh]j# )}(hsize_th]hsize_t}(hjK&hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjH&ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetjM&modnameN classnameNj@ jC )}jF ]j%c.xbc_node_compose_keyasbuh1hhjD&ubjQ )}(h h]h }(hji&hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjD&ubj# )}(hsizeh]hsize}(hjw&hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjD&ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj%ubeh}(h]h ]h"]h$]h&]hhuh1j| hjS%hhhje%hMubeh}(h]h ]h"]h$]h&]hhj@uh1j jAjBhjO%hhhje%hMubah}(h]jJ%ah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hje%hMhjL%hhubjO)}(hhh]j )}(h'Compose full key string of the XBC nodeh]h'Compose full key string of the XBC node}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhMhj&hhubah}(h]h ]h"]h$]h&]uh1jNhjL%hhhje%hMubeh}(h]h ](j: functioneh"]h$]h&]joj: jpj&jqj&jrjsjtuh1j hhhj hNhNubjv)}(hXr**Parameters** ``struct xbc_node *node`` An XBC node. ``char *buf`` A buffer to store the key. ``size_t size`` The size of the **buf**. **Description** Compose the full-length key of the **node** into **buf**. Returns the total length of the key stored in **buf**. Or returns -EINVAL if **node** is NULL, and -ERANGE if the key depth is deeper than max depth.h](j )}(h**Parameters**h]j)}(hj&h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhMhj&ubj)}(hhh](j)}(h'``struct xbc_node *node`` An XBC node. h](j)}(h``struct xbc_node *node``h]j)}(hj&h]hstruct xbc_node *node}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhMhj&ubj)}(hhh]j )}(h An XBC node.h]h An XBC node.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj&hMhj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhj&ubj)}(h)``char *buf`` A buffer to store the key. h](j)}(h ``char *buf``h]j)}(hj'h]h char *buf}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhMhj'ubj)}(hhh]j )}(hA buffer to store the key.h]hA buffer to store the key.}(hj4'hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj0'hMhj1'ubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1jhj0'hMhj&ubj)}(h)``size_t size`` The size of the **buf**. h](j)}(h``size_t size``h]j)}(hjT'h]h size_t size}(hjV'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjR'ubah}(h]h ]h"]h$]h&]uh1jhb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhMhjN'ubj)}(hhh]j )}(hThe size of the **buf**.h](hThe size of the }(hjm'hhhNhNubj)}(h**buf**h]hbuf}(hju'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm'ubh.}(hjm'hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hji'hMhjj'ubah}(h]h ]h"]h$]h&]uh1jhjN'ubeh}(h]h ]h"]h$]h&]uh1jhji'hMhj&ubeh}(h]h ]h"]h$]h&]uh1jhj&ubj )}(h**Description**h]j)}(hj'h]h Description}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhMhj&ubj )}(hCompose the full-length key of the **node** into **buf**. Returns the total length of the key stored in **buf**. Or returns -EINVAL if **node** is NULL, and -ERANGE if the key depth is deeper than max depth.h](h#Compose the full-length key of the }(hj'hhhNhNubj)}(h**node**h]hnode}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh into }(hj'hhhNhNubj)}(h**buf**h]hbuf}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh0. Returns the total length of the key stored in }(hj'hhhNhNubj)}(h**buf**h]hbuf}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh. Or returns -EINVAL if }(hj'hhhNhNubj)}(h**node**h]hnode}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh@ is NULL, and -ERANGE if the key depth is deeper than max depth.}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hb/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:414: ./include/linux/bootconfig.hhMhj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j )xbc_prepend_embedded_cmdline (C function)c.xbc_prepend_embedded_cmdlinehNtauh1j hj hhhNhNubj )}(hhh](j )}(h:void xbc_prepend_embedded_cmdline (char *dst, size_t size)h]j )}(h9void xbc_prepend_embedded_cmdline(char *dst, size_t size)h](j )}(hvoidh]hvoid}(hj.(hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj*(hhhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKEubjQ )}(h h]h }(hj=(hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj*(hhhj<(hKEubjb )}(hxbc_prepend_embedded_cmdlineh]j# )}(hxbc_prepend_embedded_cmdlineh]hxbc_prepend_embedded_cmdline}(hjO(hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjK(ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hj*(hhhj<(hKEubj} )}(h(char *dst, size_t size)h](j )}(h char *dsth](j )}(hcharh]hchar}(hjk(hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjg(ubjQ )}(h h]h }(hjy(hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjg(ubj )}(hj h]h*}(hj(hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjg(ubj# )}(hdsth]hdst}(hj(hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjg(ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjc(ubj )}(h size_t sizeh](h)}(hhh]j# )}(hsize_th]hsize_t}(hj(hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj(ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetj(modnameN classnameNj@ jC )}jF ]jI )}j< jQ(sbc.xbc_prepend_embedded_cmdlineasbuh1hhj(ubjQ )}(h h]h }(hj(hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj(ubj# )}(hsizeh]hsize}(hj(hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj(ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjc(ubeh}(h]h ]h"]h$]h&]hhuh1j| hj*(hhhj<(hKEubeh}(h]h ]h"]h$]h&]hhj@uh1j jAjBhj&(hhhj<(hKEubah}(h]j!(ah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hj<(hKEhj#(hhubjO)}(hhh]j )}(h#Prepend embedded bootconfig cmdlineh]h#Prepend embedded bootconfig cmdline}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKEhj)hhubah}(h]h ]h"]h$]h&]uh1jNhj#(hhhj<(hKEubeh}(h]h ](j: functioneh"]h$]h&]joj: jpj )jqj )jrjsjtuh1j hhhj hNhNubjv)}(hX**Parameters** ``char *dst`` cmdline buffer to prepend into (must already contain a NUL byte) ``size_t size`` total capacity of **dst** in bytes **Description** Prepend the build-time-rendered "kernel" subtree of the embedded bootconfig to **dst**. The rendered string already ends with a single space (the xbc_snprint_cmdline() invariant), which serves as the separator between the embedded keys and any existing content of **dst**. On overflow, log an error and leave **dst** untouched rather than silently truncating: booting without the embedded values is better than refusing to boot, and the error message tells the user why their embedded keys are missing. Intended to be called from setup_arch() before parse_early_param() so that early_param() handlers see the embedded values.h](j )}(h**Parameters**h]j)}(hj*)h]h Parameters}(hj,)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj()ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKIhj$)ubj)}(hhh](j)}(hO``char *dst`` cmdline buffer to prepend into (must already contain a NUL byte) h](j)}(h ``char *dst``h]j)}(hjI)h]h char *dst}(hjK)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjG)ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKFhjC)ubj)}(hhh]j )}(h@cmdline buffer to prepend into (must already contain a NUL byte)h]h@cmdline buffer to prepend into (must already contain a NUL byte)}(hjb)hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj^)hKFhj_)ubah}(h]h ]h"]h$]h&]uh1jhjC)ubeh}(h]h ]h"]h$]h&]uh1jhj^)hKFhj@)ubj)}(h3``size_t size`` total capacity of **dst** in bytes h](j)}(h``size_t size``h]j)}(hj)h]h size_t size}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKGhj|)ubj)}(hhh]j )}(h"total capacity of **dst** in bytesh](htotal capacity of }(hj)hhhNhNubj)}(h**dst**h]hdst}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh in bytes}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hj)hKGhj)ubah}(h]h ]h"]h$]h&]uh1jhj|)ubeh}(h]h ]h"]h$]h&]uh1jhj)hKGhj@)ubeh}(h]h ]h"]h$]h&]uh1jhj$)ubj )}(h**Description**h]j)}(hj)h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKIhj$)ubj )}(hXPrepend the build-time-rendered "kernel" subtree of the embedded bootconfig to **dst**. The rendered string already ends with a single space (the xbc_snprint_cmdline() invariant), which serves as the separator between the embedded keys and any existing content of **dst**. On overflow, log an error and leave **dst** untouched rather than silently truncating: booting without the embedded values is better than refusing to boot, and the error message tells the user why their embedded keys are missing.h](hSPrepend the build-time-rendered “kernel” subtree of the embedded bootconfig to }(hj)hhhNhNubj)}(h**dst**h]hdst}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh. The rendered string already ends with a single space (the xbc_snprint_cmdline() invariant), which serves as the separator between the embedded keys and any existing content of }(hj)hhhNhNubj)}(h**dst**h]hdst}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh&. On overflow, log an error and leave }(hj)hhhNhNubj)}(h**dst**h]hdst}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh untouched rather than silently truncating: booting without the embedded values is better than refusing to boot, and the error message tells the user why their embedded keys are missing.}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKHhj$)ubj )}(hzIntended to be called from setup_arch() before parse_early_param() so that early_param() handlers see the embedded values.h]hzIntended to be called from setup_arch() before parse_early_param() so that early_param() handlers see the embedded values.}(hj**hhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKQhj$)ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j )xbc_embedded_cmdline_applied (C function)c.xbc_embedded_cmdline_appliedhNtauh1j hj hhhNhNubj )}(hhh](j )}(h(bool xbc_embedded_cmdline_applied (void)h]j )}(h'bool xbc_embedded_cmdline_applied(void)h](j )}(hjah]hbool}(hjY*hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjU*hhhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKjubjQ )}(h h]h }(hjg*hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjU*hhhjf*hKjubjb )}(hxbc_embedded_cmdline_appliedh]j# )}(hxbc_embedded_cmdline_appliedh]hxbc_embedded_cmdline_applied}(hjy*hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hju*ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hjU*hhhjf*hKjubj} )}(h(void)h]j )}(hvoidh]j )}(hvoidh]hvoid}(hj*hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj*ubah}(h]h ]h"]h$]h&]noemphhhuh1j hj*ubah}(h]h ]h"]h$]h&]hhuh1j| hjU*hhhjf*hKjubeh}(h]h ]h"]h$]h&]hhj@uh1j jAjBhjQ*hhhjf*hKjubah}(h]jL*ah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hjf*hKjhjN*hhubjO)}(hhh]j )}(h'Did the embedded cmdline get prepended?h]h'Did the embedded cmdline get prepended?}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKjhj*hhubah}(h]h ]h"]h$]h&]uh1jNhjN*hhhjf*hKjubeh}(h]h ](j: functioneh"]h$]h&]joj: jpj*jqj*jrjsjtuh1j hhhj hNhNubjv)}(h**Parameters** ``void`` no arguments **Description** Return true if xbc_prepend_embedded_cmdline() actually prepended the embedded "kernel" subtree. setup_boot_config() uses this to avoid rendering the same keys a second time.h](j )}(h**Parameters**h]j)}(hj*h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKnhj*ubj)}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hj+h]hvoid}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj*ubj)}(hhh]j )}(h no argumentsh]h no arguments}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj+hKhj+ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhj+hKhj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubj )}(h**Description**h]j)}(hj;+h]h Description}(hj=+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9+ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj*ubj )}(hReturn true if xbc_prepend_embedded_cmdline() actually prepended the embedded "kernel" subtree. setup_boot_config() uses this to avoid rendering the same keys a second time.h]hReturn true if xbc_prepend_embedded_cmdline() actually prepended the embedded “kernel” subtree. setup_boot_config() uses this to avoid rendering the same keys a second time.}(hjQ+hhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKkhj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j )bootconfig_cmdline_requested (C function)c.bootconfig_cmdline_requestedhNtauh1j hj hhhNhNubj )}(hhh](j )}(hMbool bootconfig_cmdline_requested (const char *boot_cmdline, int *end_offset)h]j )}(hLbool bootconfig_cmdline_requested(const char *boot_cmdline, int *end_offset)h](j )}(hjah]hbool}(hj+hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj|+hhhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKubjQ )}(h h]h }(hj+hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj|+hhhj+hKubjb )}(hbootconfig_cmdline_requestedh]j# )}(hbootconfig_cmdline_requestedh]hbootconfig_cmdline_requested}(hj+hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj+ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hj|+hhhj+hKubj} )}(h+(const char *boot_cmdline, int *end_offset)h](j )}(hconst char *boot_cmdlineh](j )}(hj h]hconst}(hj+hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj+ubjQ )}(h h]h }(hj+hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj+ubj )}(hcharh]hchar}(hj+hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj+ubjQ )}(h h]h }(hj+hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj+ubj )}(hj h]h*}(hj+hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj+ubj# )}(h boot_cmdlineh]h boot_cmdline}(hj,hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj+ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj+ubj )}(hint *end_offseth](j )}(hinth]hint}(hj,hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj,ubjQ )}(h h]h }(hj',hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj,ubj )}(hj h]h*}(hj5,hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj,ubj# )}(h end_offseth]h end_offset}(hjB,hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj,ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj+ubeh}(h]h ]h"]h$]h&]hhuh1j| hj|+hhhj+hKubeh}(h]h ]h"]h$]h&]hhj@uh1j jAjBhjx+hhhj+hKubah}(h]js+ah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hj+hKhju+hhubjO)}(hhh]j )}(h'Was "bootconfig" passed on the cmdline?h]h+Was “bootconfig” passed on the cmdline?}(hjl,hhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhji,hhubah}(h]h ]h"]h$]h&]uh1jNhju+hhhj+hKubeh}(h]h ](j: functioneh"]h$]h&]joj: jpj,jqj,jrjsjtuh1j hhhj hNhNubjv)}(hX**Parameters** ``const char *boot_cmdline`` kernel command line to inspect (not modified) ``int *end_offset`` if non-NULL, set to the offset of the init arguments that follow a "--" separator, or 0 when there is none **Description** Parse a private copy of **boot_cmdline** (parse_args() is destructive) and report whether "bootconfig" is present before the "--" separator. setup_arch() uses this to gate prepending the build-time embedded cmdline; setup_boot_config() uses it for the runtime opt-in and to locate the init arguments via **end_offset**. Sharing one parser keeps the early and late paths agreeing on what counts as opt-in. CONFIG_BOOT_CONFIG_FORCE is not folded in here; callers apply it where they need it.h](j )}(h**Parameters**h]j)}(hj,h]h Parameters}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj,ubj)}(hhh](j)}(hK``const char *boot_cmdline`` kernel command line to inspect (not modified) h](j)}(h``const char *boot_cmdline``h]j)}(hj,h]hconst char *boot_cmdline}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj,ubj)}(hhh]j )}(h-kernel command line to inspect (not modified)h]h-kernel command line to inspect (not modified)}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj,hKhj,ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hKhj,ubj)}(h``int *end_offset`` if non-NULL, set to the offset of the init arguments that follow a "--" separator, or 0 when there is none h](j)}(h``int *end_offset``h]j)}(hj,h]hint *end_offset}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj,ubj)}(hhh]j )}(hjif non-NULL, set to the offset of the init arguments that follow a "--" separator, or 0 when there is noneh]hnif non-NULL, set to the offset of the init arguments that follow a “--” separator, or 0 when there is none}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj,ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hKhj,ubeh}(h]h ]h"]h$]h&]uh1jhj,ubj )}(h**Description**h]j)}(hj"-h]h Description}(hj$-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj -ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj,ubj )}(hXParse a private copy of **boot_cmdline** (parse_args() is destructive) and report whether "bootconfig" is present before the "--" separator. setup_arch() uses this to gate prepending the build-time embedded cmdline; setup_boot_config() uses it for the runtime opt-in and to locate the init arguments via **end_offset**. Sharing one parser keeps the early and late paths agreeing on what counts as opt-in. CONFIG_BOOT_CONFIG_FORCE is not folded in here; callers apply it where they need it.h](hParse a private copy of }(hj8-hhhNhNubj)}(h**boot_cmdline**h]h boot_cmdline}(hj@-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8-ubhX (parse_args() is destructive) and report whether “bootconfig” is present before the “--” separator. setup_arch() uses this to gate prepending the build-time embedded cmdline; setup_boot_config() uses it for the runtime opt-in and to locate the init arguments via }(hj8-hhhNhNubj)}(h**end_offset**h]h end_offset}(hjR-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8-ubh. Sharing one parser keeps the early and late paths agreeing on what counts as opt-in. CONFIG_BOOT_CONFIG_FORCE is not folded in here; callers apply it where they need it.}(hj8-hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j xbc_get_info (C function)c.xbc_get_infohNtauh1j hj hhhNhNubj )}(hhh](j )}(h4int xbc_get_info (int *node_size, size_t *data_size)h]j )}(h3int xbc_get_info(int *node_size, size_t *data_size)h](j )}(hinth]hint}(hj-hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj-hhhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKubjQ )}(h h]h }(hj-hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj-hhhj-hKubjb )}(h xbc_get_infoh]j# )}(h xbc_get_infoh]h xbc_get_info}(hj-hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj-ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hj-hhhj-hKubj} )}(h#(int *node_size, size_t *data_size)h](j )}(hint *node_sizeh](j )}(hinth]hint}(hj-hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj-ubjQ )}(h h]h }(hj-hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj-ubj )}(hj h]h*}(hj-hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj-ubj# )}(h node_sizeh]h node_size}(hj-hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj-ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj-ubj )}(hsize_t *data_sizeh](h)}(hhh]j# )}(hsize_th]hsize_t}(hj .hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj .ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetj.modnameN classnameNj@ jC )}jF ]jI )}j< j-sbc.xbc_get_infoasbuh1hhj.ubjQ )}(h h]h }(hj-.hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj.ubj )}(hj h]h*}(hj;.hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj.ubj# )}(h data_sizeh]h data_size}(hjH.hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj.ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj-ubeh}(h]h ]h"]h$]h&]hhuh1j| hj-hhhj-hKubeh}(h]h ]h"]h$]h&]hhj@uh1j jAjBhj-hhhj-hKubah}(h]j~-ah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hj-hKhj-hhubjO)}(hhh]j )}(h)Get the information of loaded boot configh]h)Get the information of loaded boot config}(hjr.hhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhjo.hhubah}(h]h ]h"]h$]h&]uh1jNhj-hhhj-hKubeh}(h]h ](j: functioneh"]h$]h&]joj: jpj.jqj.jrjsjtuh1j hhhj hNhNubjv)}(hXk**Parameters** ``int *node_size`` A pointer to store the number of nodes. ``size_t *data_size`` A pointer to store the size of bootconfig data. **Description** Get the number of used nodes in **node_size** if it is not NULL, and the size of bootconfig data in **data_size** if it is not NULL. Return 0 if the boot config is initialized, or return -ENODEV.h](j )}(h**Parameters**h]j)}(hj.h]h Parameters}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj.ubj)}(hhh](j)}(h;``int *node_size`` A pointer to store the number of nodes. h](j)}(h``int *node_size``h]j)}(hj.h]hint *node_size}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj.ubj)}(hhh]j )}(h'A pointer to store the number of nodes.h]h'A pointer to store the number of nodes.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj.hKhj.ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hKhj.ubj)}(hF``size_t *data_size`` A pointer to store the size of bootconfig data. h](j)}(h``size_t *data_size``h]j)}(hj.h]hsize_t *data_size}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj.ubj)}(hhh]j )}(h/A pointer to store the size of bootconfig data.h]h/A pointer to store the size of bootconfig data.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj/hKhj/ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj/hKhj.ubeh}(h]h ]h"]h$]h&]uh1jhj.ubj )}(h**Description**h]j)}(hj'/h]h Description}(hj)/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%/ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj.ubj )}(hGet the number of used nodes in **node_size** if it is not NULL, and the size of bootconfig data in **data_size** if it is not NULL. Return 0 if the boot config is initialized, or return -ENODEV.h](h Get the number of used nodes in }(hj=/hhhNhNubj)}(h **node_size**h]h node_size}(hjE/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=/ubh7 if it is not NULL, and the size of bootconfig data in }(hj=/hhhNhNubj)}(h **data_size**h]h data_size}(hjW/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=/ubhR if it is not NULL. Return 0 if the boot config is initialized, or return -ENODEV.}(hj=/hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j xbc_root_node (C function)c.xbc_root_nodehNtauh1j hj hhhNhNubj )}(hhh](j )}(h&struct xbc_node * xbc_root_node (void)h]j )}(h$struct xbc_node *xbc_root_node(void)h](j )}(hjh]hstruct}(hj/hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj/hhhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKubjQ )}(h h]h }(hj/hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj/hhhj/hKubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hj/hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj/ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetj/modnameN classnameNj@ jC )}jF ]jI )}j< xbc_root_nodesbc.xbc_root_nodeasbuh1hhj/hhhj/hKubjQ )}(h h]h }(hj/hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj/hhhj/hKubj )}(hj h]h*}(hj/hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj/hhhj/hKubjb )}(h xbc_root_nodeh]j# )}(hj/h]h xbc_root_node}(hj/hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj/ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hj/hhhj/hKubj} )}(h(void)h]j )}(hvoidh]j )}(hvoidh]hvoid}(hj 0hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj0ubah}(h]h ]h"]h$]h&]noemphhhuh1j hj0ubah}(h]h ]h"]h$]h&]hhuh1j| hj/hhhj/hKubeh}(h]h ]h"]h$]h&]hhj@uh1j jAjBhj/hhhj/hKubah}(h]j/ah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hj/hKhj/hhubjO)}(hhh]j )}(h)Get the root node of extended boot configh]h)Get the root node of extended boot config}(hj40hhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj10hhubah}(h]h ]h"]h$]h&]uh1jNhj/hhhj/hKubeh}(h]h ](j: functioneh"]h$]h&]joj: jpjL0jqjL0jrjsjtuh1j hhhj hNhNubjv)}(h**Parameters** ``void`` no arguments **Description** Return the address of root node of extended boot config. If the extended boot config is not initialized, return NULL.h](j )}(h**Parameters**h]j)}(hjV0h]h Parameters}(hjX0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT0ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhjP0ubj)}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]j)}(hju0h]hvoid}(hjw0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs0ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhjo0ubj)}(hhh]j )}(h no argumentsh]h no arguments}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj0hKhj0ubah}(h]h ]h"]h$]h&]uh1jhjo0ubeh}(h]h ]h"]h$]h&]uh1jhj0hKhjl0ubah}(h]h ]h"]h$]h&]uh1jhjP0ubj )}(h**Description**h]j)}(hj0h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhjP0ubj )}(huReturn the address of root node of extended boot config. If the extended boot config is not initialized, return NULL.h]huReturn the address of root node of extended boot config. If the extended boot config is not initialized, return NULL.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhjP0ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j xbc_node_index (C function)c.xbc_node_indexhNtauh1j hj hhhNhNubj )}(hhh](j )}(h/uint16_t xbc_node_index (struct xbc_node *node)h]j )}(h.uint16_t xbc_node_index(struct xbc_node *node)h](h)}(hhh]j# )}(huint16_th]huint16_t}(hj0hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj0ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetj0modnameN classnameNj@ jC )}jF ]jI )}j< xbc_node_indexsbc.xbc_node_indexasbuh1hhj0hhhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKubjQ )}(h h]h }(hj1hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj0hhhj1hKubjb )}(hxbc_node_indexh]j# )}(hj1h]hxbc_node_index}(hj,1hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj(1ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hj0hhhj1hKubj} )}(h(struct xbc_node *node)h]j )}(hstruct xbc_node *nodeh](j )}(hjh]hstruct}(hjG1hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjC1ubjQ )}(h h]h }(hjT1hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjC1ubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hje1hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjb1ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetjg1modnameN classnameNj@ jC )}jF ]j1c.xbc_node_indexasbuh1hhjC1ubjQ )}(h h]h }(hj1hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjC1ubj )}(hj h]h*}(hj1hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjC1ubj# )}(hnodeh]hnode}(hj1hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjC1ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj?1ubah}(h]h ]h"]h$]h&]hhuh1j| hj0hhhj1hKubeh}(h]h ]h"]h$]h&]hhj@uh1j jAjBhj0hhhj1hKubah}(h]j0ah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hj1hKhj0hhubjO)}(hhh]j )}(hGet the index of XBC nodeh]hGet the index of XBC node}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chKhj1hhubah}(h]h ]h"]h$]h&]uh1jNhj0hhhj1hKubeh}(h]h ](j: functioneh"]h$]h&]joj: jpj1jqj1jrjsjtuh1j hhhj hNhNubjv)}(h**Parameters** ``struct xbc_node *node`` A target node of getting index. **Description** Return the index number of **node** in XBC node list.h](j )}(h**Parameters**h]j)}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMhj1ubj)}(hhh]j)}(h:``struct xbc_node *node`` A target node of getting index. h](j)}(h``struct xbc_node *node``h]j)}(hj 2h]hstruct xbc_node *node}(hj 2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMhj2ubj)}(hhh]j )}(hA target node of getting index.h]hA target node of getting index.}(hj"2hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj2hMhj2ubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1jhj1ubj )}(h**Description**h]j)}(hjD2h]h Description}(hjF2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjB2ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMhj1ubj )}(h5Return the index number of **node** in XBC node list.h](hReturn the index number of }(hjZ2hhhNhNubj)}(h**node**h]hnode}(hjb2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ2ubh in XBC node list.}(hjZ2hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j xbc_node_get_parent (C function)c.xbc_node_get_parenthNtauh1j hj hhhNhNubj )}(hhh](j )}(h=struct xbc_node * xbc_node_get_parent (struct xbc_node *node)h]j )}(h;struct xbc_node *xbc_node_get_parent(struct xbc_node *node)h](j )}(hjh]hstruct}(hj2hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj2hhhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chM ubjQ )}(h h]h }(hj2hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj2hhhj2hM ubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hj2hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj2ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetj2modnameN classnameNj@ jC )}jF ]jI )}j< xbc_node_get_parentsbc.xbc_node_get_parentasbuh1hhj2hhhj2hM ubjQ )}(h h]h }(hj2hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj2hhhj2hM ubj )}(hj h]h*}(hj2hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj2hhhj2hM ubjb )}(hxbc_node_get_parenth]j# )}(hj2h]hxbc_node_get_parent}(hj2hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj2ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hj2hhhj2hM ubj} )}(h(struct xbc_node *node)h]j )}(hstruct xbc_node *nodeh](j )}(hjh]hstruct}(hj3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj3ubjQ )}(h h]h }(hj"3hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj3ubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hj33hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj03ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetj53modnameN classnameNj@ jC )}jF ]j2c.xbc_node_get_parentasbuh1hhj3ubjQ )}(h h]h }(hjQ3hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj3ubj )}(hj h]h*}(hj_3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj3ubj# )}(hnodeh]hnode}(hjl3hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj3ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj 3ubah}(h]h ]h"]h$]h&]hhuh1j| hj2hhhj2hM ubeh}(h]h ]h"]h$]h&]hhj@uh1j jAjBhj2hhhj2hM ubah}(h]j2ah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hj2hM hj2hhubjO)}(hhh]j )}(hGet the parent XBC nodeh]hGet the parent XBC node}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chM hj3hhubah}(h]h ]h"]h$]h&]uh1jNhj2hhhj2hM ubeh}(h]h ](j: functioneh"]h$]h&]joj: jpj3jqj3jrjsjtuh1j hhhj hNhNubjv)}(h**Parameters** ``struct xbc_node *node`` An XBC node. **Description** Return the parent node of **node**. If the node is top node of the tree, return NULL.h](j )}(h**Parameters**h]j)}(hj3h]h Parameters}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMhj3ubj)}(hhh]j)}(h'``struct xbc_node *node`` An XBC node. h](j)}(h``struct xbc_node *node``h]j)}(hj3h]hstruct xbc_node *node}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chM hj3ubj)}(hhh]j )}(h An XBC node.h]h An XBC node.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj3hM hj3ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hM hj3ubah}(h]h ]h"]h$]h&]uh1jhj3ubj )}(h**Description**h]j)}(hj4h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chM hj3ubj )}(hUReturn the parent node of **node**. If the node is top node of the tree, return NULL.h](hReturn the parent node of }(hj(4hhhNhNubj)}(h**node**h]hnode}(hj04hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(4ubh3. If the node is top node of the tree, return NULL.}(hj(4hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chM hj3ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j xbc_node_get_child (C function)c.xbc_node_get_childhNtauh1j hj hhhNhNubj )}(hhh](j )}(hReturn the data (which is always a null terminated string) of }(hj9hhhNhNubj)}(h**node**h]hnode}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubh5. If the node has invalid data, warn and return NULL.}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chM2hj-9ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j !xbc_node_find_subkey (C function)c.xbc_node_find_subkeyhNtauh1j hj hhhNhNubj )}(hhh](j )}(hQstruct xbc_node * xbc_node_find_subkey (struct xbc_node *parent, const char *key)h]j )}(hOstruct xbc_node *xbc_node_find_subkey(struct xbc_node *parent, const char *key)h](j )}(hjh]hstruct}(hj9hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj9hhhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMTubjQ )}(h h]h }(hj9hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj9hhhj9hMTubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hj:hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj:ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetj:modnameN classnameNj@ jC )}jF ]jI )}j< xbc_node_find_subkeysbc.xbc_node_find_subkeyasbuh1hhj9hhhj9hMTubjQ )}(h h]h }(hj$:hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj9hhhj9hMTubj )}(hj h]h*}(hj2:hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj9hhhj9hMTubjb )}(hxbc_node_find_subkeyh]j# )}(hj!:h]hxbc_node_find_subkey}(hjC:hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj?:ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hj9hhhj9hMTubj} )}(h*(struct xbc_node *parent, const char *key)h](j )}(hstruct xbc_node *parenth](j )}(hjh]hstruct}(hj^:hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjZ:ubjQ )}(h h]h }(hjk:hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjZ:ubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hj|:hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjy:ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetj~:modnameN classnameNj@ jC )}jF ]j:c.xbc_node_find_subkeyasbuh1hhjZ:ubjQ )}(h h]h }(hj:hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjZ:ubj )}(hj h]h*}(hj:hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjZ:ubj# )}(hparenth]hparent}(hj:hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjZ:ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjV:ubj )}(hconst char *keyh](j )}(hj h]hconst}(hj:hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:ubjQ )}(h h]h }(hj:hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj:ubj )}(hcharh]hchar}(hj:hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:ubjQ )}(h h]h }(hj:hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj:ubj )}(hj h]h*}(hj;hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj:ubj# )}(hkeyh]hkey}(hj;hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj:ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hjV:ubeh}(h]h ]h"]h$]h&]hhuh1j| hj9hhhj9hMTubeh}(h]h ]h"]h$]h&]hhj@uh1j jAjBhj9hhhj9hMTubah}(h]j9ah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hj9hMThj9hhubjO)}(hhh]j )}(h*Find a subkey node which matches given keyh]h*Find a subkey node which matches given key}(hj<;hhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMThj9;hhubah}(h]h ]h"]h$]h&]uh1jNhj9hhhj9hMTubeh}(h]h ](j: functioneh"]h$]h&]joj: jpjT;jqjT;jrjsjtuh1j hhhj hNhNubjv)}(hXE**Parameters** ``struct xbc_node *parent`` An XBC node. ``const char *key`` A key string. **Description** Search a key node under **parent** which matches **key**. The **key** can contain several words jointed with '.'. If **parent** is NULL, this searches the node from whole tree. Return NULL if no node is matched.h](j )}(h**Parameters**h]j)}(hj^;h]h Parameters}(hj`;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\;ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMXhjX;ubj)}(hhh](j)}(h)``struct xbc_node *parent`` An XBC node. h](j)}(h``struct xbc_node *parent``h]j)}(hj};h]hstruct xbc_node *parent}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{;ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMUhjw;ubj)}(hhh]j )}(h An XBC node.h]h An XBC node.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj;hMUhj;ubah}(h]h ]h"]h$]h&]uh1jhjw;ubeh}(h]h ]h"]h$]h&]uh1jhj;hMUhjt;ubj)}(h"``const char *key`` A key string. h](j)}(h``const char *key``h]j)}(hj;h]hconst char *key}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMVhj;ubj)}(hhh]j )}(h A key string.h]h A key string.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj;hMVhj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhj;hMVhjt;ubeh}(h]h ]h"]h$]h&]uh1jhjX;ubj )}(h**Description**h]j)}(hj;h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMXhjX;ubj )}(hSearch a key node under **parent** which matches **key**. The **key** can contain several words jointed with '.'. If **parent** is NULL, this searches the node from whole tree. Return NULL if no node is matched.h](hSearch a key node under }(hj<hhhNhNubj)}(h **parent**h]hparent}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubh which matches }(hj<hhhNhNubj)}(h**key**h]hkey}(hj!<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubh. The }(hj<hhhNhNubj)}(h**key**h]hkey}(hj3<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubh4 can contain several words jointed with ‘.’. If }(hj<hhhNhNubj)}(h **parent**h]hparent}(hjE<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubhT is NULL, this searches the node from whole tree. Return NULL if no node is matched.}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMWhjX;ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j xbc_node_find_value (C function)c.xbc_node_find_valuehNtauh1j hj hhhNhNubj )}(hhh](j )}(hdconst char * xbc_node_find_value (struct xbc_node *parent, const char *key, struct xbc_node **vnode)h]j )}(hbconst char *xbc_node_find_value(struct xbc_node *parent, const char *key, struct xbc_node **vnode)h](j )}(hj h]hconst}(hj~<hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjz<hhhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMsubjQ )}(h h]h }(hj<hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjz<hhhj<hMsubj )}(hcharh]hchar}(hj<hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjz<hhhj<hMsubjQ )}(h h]h }(hj<hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjz<hhhj<hMsubj )}(hj h]h*}(hj<hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjz<hhhj<hMsubjb )}(hxbc_node_find_valueh]j# )}(hxbc_node_find_valueh]hxbc_node_find_value}(hj<hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj<ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hjz<hhhj<hMsubj} )}(hC(struct xbc_node *parent, const char *key, struct xbc_node **vnode)h](j )}(hstruct xbc_node *parenth](j )}(hjh]hstruct}(hj<hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj<ubjQ )}(h h]h }(hj<hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj<ubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hj=hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj<ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetj=modnameN classnameNj@ jC )}jF ]jI )}j< j<sbc.xbc_node_find_valueasbuh1hhj<ubjQ )}(h h]h }(hj!=hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj<ubj )}(hj h]h*}(hj/=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj<ubj# )}(hparenth]hparent}(hj<=hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj<ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj<ubj )}(hconst char *keyh](j )}(hj h]hconst}(hjU=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjQ=ubjQ )}(h h]h }(hjb=hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjQ=ubj )}(hcharh]hchar}(hjp=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjQ=ubjQ )}(h h]h }(hj~=hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hjQ=ubj )}(hj h]h*}(hj=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjQ=ubj# )}(hkeyh]hkey}(hj=hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hjQ=ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj<ubj )}(hstruct xbc_node **vnodeh](j )}(hjh]hstruct}(hj=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj=ubjQ )}(h h]h }(hj=hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj=ubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hj=hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj=ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetj=modnameN classnameNj@ jC )}jF ]j=c.xbc_node_find_valueasbuh1hhj=ubjQ )}(h h]h }(hj=hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj=ubj )}(hj h]h*}(hj=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj=ubj )}(hj h]h*}(hj >hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj=ubj# )}(hvnodeh]hvnode}(hj>hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj=ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj<ubeh}(h]h ]h"]h$]h&]hhuh1j| hjz<hhhj<hMsubeh}(h]h ]h"]h$]h&]hhj@uh1j jAjBhjv<hhhj<hMsubah}(h]jq<ah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hj<hMshjs<hhubjO)}(hhh]j )}(h)Find a value node which matches given keyh]h)Find a value node which matches given key}(hj@>hhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMshj=>hhubah}(h]h ]h"]h$]h&]uh1jNhjs<hhhj<hMsubeh}(h]h ](j: functioneh"]h$]h&]joj: jpjX>jqjX>jrjsjtuh1j hhhj hNhNubjv)}(hX**Parameters** ``struct xbc_node *parent`` An XBC node. ``const char *key`` A key string. ``struct xbc_node **vnode`` A container pointer of found XBC node. **Description** Search a value node under **parent** whose (parent) key node matches **key**, store it in ***vnode**, and returns the value string. The **key** can contain several words jointed with '.'. If **parent** is NULL, this searches the node from whole tree. Return the value string if a matched key found, return NULL if no node is matched. Note that this returns 0-length string and stores NULL in ***vnode** if the key has no value. And also it will return the value of the first entry if the value is an array.h](j )}(h**Parameters**h]j)}(hjb>h]h Parameters}(hjd>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`>ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMwhj\>ubj)}(hhh](j)}(h)``struct xbc_node *parent`` An XBC node. h](j)}(h``struct xbc_node *parent``h]j)}(hj>h]hstruct xbc_node *parent}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMthj{>ubj)}(hhh]j )}(h An XBC node.h]h An XBC node.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj>hMthj>ubah}(h]h ]h"]h$]h&]uh1jhj{>ubeh}(h]h ]h"]h$]h&]uh1jhj>hMthjx>ubj)}(h"``const char *key`` A key string. h](j)}(h``const char *key``h]j)}(hj>h]hconst char *key}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMuhj>ubj)}(hhh]j )}(h A key string.h]h A key string.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj>hMuhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>hMuhjx>ubj)}(hC``struct xbc_node **vnode`` A container pointer of found XBC node. h](j)}(h``struct xbc_node **vnode``h]j)}(hj>h]hstruct xbc_node **vnode}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMvhj>ubj)}(hhh]j )}(h&A container pointer of found XBC node.h]h&A container pointer of found XBC node.}(hj ?hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj?hMvhj ?ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj?hMvhjx>ubeh}(h]h ]h"]h$]h&]uh1jhj\>ubj )}(h**Description**h]j)}(hj.?h]h Description}(hj0?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,?ubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMxhj\>ubj )}(hXSearch a value node under **parent** whose (parent) key node matches **key**, store it in ***vnode**, and returns the value string. The **key** can contain several words jointed with '.'. If **parent** is NULL, this searches the node from whole tree. Return the value string if a matched key found, return NULL if no node is matched. Note that this returns 0-length string and stores NULL in ***vnode** if the key has no value. And also it will return the value of the first entry if the value is an array.h](hSearch a value node under }(hjD?hhhNhNubj)}(h **parent**h]hparent}(hjL?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD?ubh! whose (parent) key node matches }(hjD?hhhNhNubj)}(h**key**h]hkey}(hj^?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD?ubh, store it in }(hjD?hhhNhNubj)}(h ***vnode**h]h*vnode}(hjp?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD?ubh$, and returns the value string. The }(hjD?hhhNhNubj)}(h**key**h]hkey}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD?ubh4 can contain several words jointed with ‘.’. If }(hjD?hhhNhNubj)}(h **parent**h]hparent}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD?ubh is NULL, this searches the node from whole tree. Return the value string if a matched key found, return NULL if no node is matched. Note that this returns 0-length string and stores NULL in }(hjD?hhhNhNubj)}(h ***vnode**h]h*vnode}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD?ubhh if the key has no value. And also it will return the value of the first entry if the value is an array.}(hjD?hhhNhNubeh}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMwhj\>ubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j 'xbc_node_compose_key_after (C function)c.xbc_node_compose_key_afterhNtauh1j hj hhhNhNubj )}(hhh](j )}(heint xbc_node_compose_key_after (struct xbc_node *root, struct xbc_node *node, char *buf, size_t size)h]j )}(hdint xbc_node_compose_key_after(struct xbc_node *root, struct xbc_node *node, char *buf, size_t size)h](j )}(hinth]hint}(hj?hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj?hhhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMubjQ )}(h h]h }(hj?hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj?hhhj?hMubjb )}(hxbc_node_compose_key_afterh]j# )}(hxbc_node_compose_key_afterh]hxbc_node_compose_key_after}(hj@hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj?ubah}(h]h ](jw jx eh"]h$]h&]hhuh1ja hj?hhhj?hMubj} )}(hF(struct xbc_node *root, struct xbc_node *node, char *buf, size_t size)h](j )}(hstruct xbc_node *rooth](j )}(hjh]hstruct}(hj@hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj@ubjQ )}(h h]h }(hj)@hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj@ubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hj:@hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj7@ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetj<@modnameN classnameNj@ jC )}jF ]jI )}j< j@sbc.xbc_node_compose_key_afterasbuh1hhj@ubjQ )}(h h]h }(hjZ@hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj@ubj )}(hj h]h*}(hjh@hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj@ubj# )}(hrooth]hroot}(hju@hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj@ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj@ubj )}(hstruct xbc_node *nodeh](j )}(hjh]hstruct}(hj@hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj@ubjQ )}(h h]h }(hj@hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj@ubh)}(hhh]j# )}(hxbc_nodeh]hxbc_node}(hj@hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj@ubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetj@modnameN classnameNj@ jC )}jF ]jV@c.xbc_node_compose_key_afterasbuh1hhj@ubjQ )}(h h]h }(hj@hhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj@ubj )}(hj h]h*}(hj@hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj@ubj# )}(hnodeh]hnode}(hj@hhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj@ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj@ubj )}(h char *bufh](j )}(hcharh]hchar}(hj@hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj@ubjQ )}(h h]h }(hj AhhhNhNubah}(h]h ]j] ah"]h$]h&]uh1jP hj@ubj )}(hj h]h*}(hjAhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj@ubj# )}(hbufh]hbuf}(hj'AhhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj@ubeh}(h]h ]h"]h$]h&]noemphhhuh1j hj@ubj )}(h size_t sizeh](h)}(hhh]j# )}(hsize_th]hsize_t}(hjCAhhhNhNubah}(h]h ]j/ ah"]h$]h&]uh1j" hj@Aubah}(h]h ]h"]h$]h&] refdomainj: reftypej< reftargetjEAmodnameN classnameNj@ jC )}jF ]jV@c.xbc_node_compose_key_afterasbuh1hhjMah ](jFjGeh"]h$]h&]jKjL)jMhuh1j hjYMhMyhj@MhhubjO)}(hhh]j )}(h0Parse given XBC file and build XBC internal treeh]h0Parse given XBC file and build XBC internal tree}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMyhjNhhubah}(h]h ]h"]h$]h&]uh1jNhj@MhhhjYMhMyubeh}(h]h ](j: functioneh"]h$]h&]joj: jpjOjqjOjrjsjtuh1j hhhj hNhNubjv)}(hX**Parameters** ``const char *data`` The boot config text original data ``size_t size`` The size of **data** ``const char **emsg`` A pointer of const char * to store the error message ``int *epos`` A pointer of int to store the error position **Description** This parses the boot config text in **data**. **size** must be smaller than XBC_DATA_MAX. Return the number of stored nodes (>0) if succeeded, or -errno if there is any error. In error cases, **emsg** will be updated with an error message and **epos** will be updated with the error position which is the byte offset of **buf**. If the error is not a parser error, **epos** will be -1.h](j )}(h**Parameters**h]j)}(hjOh]h Parameters}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Oubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chM}hjOubj)}(hhh](j)}(h8``const char *data`` The boot config text original data h](j)}(h``const char *data``h]j)}(hj-Oh]hconst char *data}(hj/OhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+Oubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMzhj'Oubj)}(hhh]j )}(h"The boot config text original datah]h"The boot config text original data}(hjFOhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjBOhMzhjCOubah}(h]h ]h"]h$]h&]uh1jhj'Oubeh}(h]h ]h"]h$]h&]uh1jhjBOhMzhj$Oubj)}(h%``size_t size`` The size of **data** h](j)}(h``size_t size``h]j)}(hjfOh]h size_t size}(hjhOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdOubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chM{hj`Oubj)}(hhh]j )}(hThe size of **data**h](h The size of }(hjOhhhNhNubj)}(h**data**h]hdata}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1j hj{OhM{hj|Oubah}(h]h ]h"]h$]h&]uh1jhj`Oubeh}(h]h ]h"]h$]h&]uh1jhj{OhM{hj$Oubj)}(hK``const char **emsg`` A pointer of const char * to store the error message h](j)}(h``const char **emsg``h]j)}(hjOh]hconst char **emsg}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chM|hjOubj)}(hhh]j )}(h4A pointer of const char * to store the error messageh]h4A pointer of const char * to store the error message}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjOhM|hjOubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jhjOhM|hj$Oubj)}(h;``int *epos`` A pointer of int to store the error position h](j)}(h ``int *epos``h]j)}(hjOh]h int *epos}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jhX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chM}hjOubj)}(hhh]j )}(h,A pointer of int to store the error positionh]h,A pointer of int to store the error position}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjOhM}hjOubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jhjOhM}hj$Oubeh}(h]h ]h"]h$]h&]uh1jhjOubj )}(h**Description**h]j)}(hj!Ph]h Description}(hj#PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chMhjOubj )}(hXThis parses the boot config text in **data**. **size** must be smaller than XBC_DATA_MAX. Return the number of stored nodes (>0) if succeeded, or -errno if there is any error. In error cases, **emsg** will be updated with an error message and **epos** will be updated with the error position which is the byte offset of **buf**. If the error is not a parser error, **epos** will be -1.h](h$This parses the boot config text in }(hj7PhhhNhNubj)}(h**data**h]hdata}(hj?PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7Pubh. }(hj7PhhhNhNubj)}(h**size**h]hsize}(hjQPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7Pubh must be smaller than XBC_DATA_MAX. Return the number of stored nodes (>0) if succeeded, or -errno if there is any error. In error cases, }(hj7PhhhNhNubj)}(h**emsg**h]hemsg}(hjcPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7Pubh+ will be updated with an error message and }(hj7PhhhNhNubj)}(h**epos**h]hepos}(hjuPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7PubhE will be updated with the error position which is the byte offset of }(hj7PhhhNhNubj)}(h**buf**h]hbuf}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7Pubh&. If the error is not a parser error, }(hj7PhhhNhNubj)}(h**epos**h]hepos}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7Pubh will be -1.}(hj7PhhhNhNubeh}(h]h ]h"]h$]h&]uh1j hX/var/lib/git/docbuild/linux/Documentation/admin-guide/bootconfig:415: ./lib/bootconfig.chM~hjOubeh}(h]h ] kernelindentah"]h$]h&]uh1juhj hhhNhNubeh}(h]functions-and-structuresah ]h"]functions and structuresah$]h&]uh1hhhhhhhhMubeh}(h](boot-configurationheh ]h"](boot configuration bootconfigeh$]h&]uh1hhhhhhhhKexpect_referenced_by_name}jPhsexpect_referenced_by_id}hhsubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjPerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}h]hasnameids}(jPhjPjPjgjdjjjcj`jjj}jzjjjp jm jjjsjpjh je j` j] j9 j6 j` j] j j jPjPu nametypes}(jPjPjgjjcjj}jjp jjsjh j` j9 j` j jPuh}(hhjPhjdjCjjjj`jjjfjzjjjjm jjjjpjje jvj] j j6 js j] j< j jc jPj j j jRjWjjjxj}j jjjjj#jjjjjjjjj j j1"j6"j#j#jJ%jO%j!(j&(jL*jQ*js+jx+j~-j-j/j/j0j0j2j2j\4ja4j*6j/6j8j!8j9j9jq<jv<j?j?jCjCj}FjFjIjIjKjLj>MjCMu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages]hsystem_message)}(hhh]j )}(hhh]h0Hyperlink target "bootconfig" is not referenced.}hj[Qsbah}(h]h ]h"]h$]h&]uh1j hjXQubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehnjlineKuh1jVQuba transformerN include_log] decorationNhhub.