mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 18:21:39 +01:00
In macros it is common to declare local variables using typeof(param) in order to ensure that side effects are only evaluated once. A consequence of this is double textural expansion of the parameter, which can get out of hand very quickly with nested macros. In C23, the auto keyword has been repurposed to perform type inference. A GCC extension, __auto_type, is now available in the new toolchain baseline and avoids the double textural expansion. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Nicola Vetrini <nicola.vetrini@bugseng.com> Reviewed-by: Frediano Ziglio <frediano.ziglio@cloud.com>
210 lines
6.0 KiB
Plaintext
210 lines
6.0 KiB
Plaintext
Coding Style for the Xen Hypervisor
|
|
===================================
|
|
|
|
The Xen coding style described below is the coding style used by the
|
|
Xen hypervisor itself (xen/*) as well as various associated low-level
|
|
libraries (e.g. tools/libxc/*).
|
|
|
|
An exception is made for files which are imported from an external
|
|
source. In these cases the prevailing coding style of the upstream
|
|
source is generally used (commonly the Linux coding style).
|
|
|
|
Other parts of the code base may use other coding styles, sometimes
|
|
explicitly (e.g. tools/libxl/CODING_STYLE) but often implicitly (Linux
|
|
coding style is fairly common). In general you should copy the style
|
|
of the surrounding code. If you are unsure please ask.
|
|
|
|
SPDX
|
|
----
|
|
|
|
New files should start with a single-line SPDX comment to express the
|
|
license, e.g.:
|
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
See LICENSES/ for a list of licenses and SPDX tags currently used.
|
|
|
|
MISRA C
|
|
-------
|
|
|
|
The Xen Hypervisor follows some MISRA C coding rules. See
|
|
docs/misra/rules.rst for details.
|
|
|
|
Indentation
|
|
-----------
|
|
|
|
Indenting uses spaces, not tabs - in contrast to Linux. An indent
|
|
level consists of four spaces. Code within blocks is indented by one
|
|
extra indent level. The enclosing braces of a block are indented the
|
|
same as the code _outside_ the block. e.g.
|
|
|
|
void fun(void)
|
|
{
|
|
/* One level of indent. */
|
|
|
|
{
|
|
/* A second level of indent. */
|
|
}
|
|
}
|
|
|
|
Due to the behavior of GNU diffutils "diff -p", labels should be
|
|
indented by at least one blank. Non-case labels inside switch() bodies
|
|
are preferred to be indented the same as the block's case labels.
|
|
|
|
White space
|
|
-----------
|
|
|
|
Space characters are used to spread out logical statements, such as in
|
|
the condition of an if or while. Spaces are placed between the
|
|
keyword and the brackets surrounding the condition, between the
|
|
brackets and the condition itself, and around binary operators (except
|
|
the structure access operators, '.' and '->'). e.g.
|
|
|
|
if ( (wibble & wombat) == 42 )
|
|
{
|
|
...
|
|
|
|
There should be no trailing white space at the end of lines (including
|
|
after the opening /* of a comment block).
|
|
|
|
Line Length
|
|
-----------
|
|
|
|
Lines should be less than 80 characters in length. Long lines should
|
|
be split at sensible places and the trailing portions indented.
|
|
|
|
User visible strings (e.g., printk() messages) should not be split so
|
|
they can searched for more easily.
|
|
|
|
Bracing
|
|
-------
|
|
|
|
Braces ('{' and '}') are usually placed on a line of their own, except
|
|
for
|
|
- the do/while loop
|
|
- the opening brace in definitions of enum, struct, and union
|
|
- the opening brace in initializers
|
|
- compound literals
|
|
This is unlike the Linux coding style and unlike K&R. do/while loops
|
|
are one exception. e.g.:
|
|
|
|
if ( condition )
|
|
{
|
|
/* Do stuff. */
|
|
}
|
|
else
|
|
{
|
|
/* Other stuff. */
|
|
}
|
|
|
|
while ( condition )
|
|
{
|
|
/* Do stuff. */
|
|
}
|
|
|
|
do {
|
|
/* Do stuff. */
|
|
} while ( condition );
|
|
|
|
etc.
|
|
|
|
Braces should be omitted for blocks with a single statement. e.g.,
|
|
|
|
if ( condition )
|
|
single_statement();
|
|
|
|
Identifiers
|
|
-----------
|
|
|
|
When giving names to identifiers (variables, functions, constants...), separate
|
|
words using underscores (for example, use "my_foo" instead of "myfoo").
|
|
|
|
Types
|
|
-----
|
|
|
|
Use basic C types and C standard mandated typedef-s where possible (and
|
|
with preference in this order). This in particular means to avoid u8,
|
|
u16, etc despite those types continuing to exist in our code base.
|
|
Fixed width types should only be used when a fixed width quantity is
|
|
meant (which for example may be a value read from or to be written to a
|
|
register).
|
|
|
|
Macros which otherwise would use "typeof(arg) newarg =" to avoid double
|
|
evaluation of side effects should use "auto newarg =" per it's C23 behaviour,
|
|
to also avoid double textural expansion. The use of "auto" outside of macros
|
|
is discouraged.
|
|
|
|
Especially with pointer types, whenever the pointed to object is not
|
|
(supposed to be) modified, qualify the pointed to type with "const".
|
|
|
|
Comments
|
|
--------
|
|
|
|
Only C style /* ... */ comments are to be used. C++ style // comments
|
|
should not be used. Multi-word comments should begin with a capital
|
|
letter. Comments containing a single sentence may end with a full
|
|
stop; comments containing several sentences must have a full stop
|
|
after each sentence.
|
|
|
|
Multi-line comment blocks should start and end with comment markers on
|
|
separate lines and each line should begin with a leading '*'.
|
|
|
|
/*
|
|
* Example, multi-line comment block.
|
|
*
|
|
* Note beginning and end markers on separate lines and leading '*'.
|
|
*/
|
|
|
|
Naming convention for files and command line options
|
|
----------------------------------------------------
|
|
|
|
'-' should be used to separate words in commandline options and filenames.
|
|
E.g. timer-works.
|
|
|
|
Note that some of the options and filenames are using '_'. This is now
|
|
deprecated.
|
|
|
|
Header inclusion guards
|
|
-----------------------
|
|
|
|
Unless otherwise specified, all header files should include proper
|
|
guards to prevent multiple inclusions. Guards need to be unique, and
|
|
this property is checked by static analysis.
|
|
|
|
Guards should be chosen based on the logical area, with enough
|
|
disambiguation when the same filename exits in multiple locations in
|
|
the source tree. Commonly there should be a XEN or <arch> prefix.
|
|
The guard should be spelt in ALL CAPITALS, ending with _H.
|
|
|
|
For example:
|
|
|
|
- Xen headers: XEN_<something>_H
|
|
- include/xen/something.h -> XEN_SOMETHING_H
|
|
|
|
- arch-specific headers: <arch>_<something>_H
|
|
- arch/x86/include/asm/something.h -> X86_SOMETHING_H
|
|
- arch/x86/include/asm/hvm/something.h -> X86_HVM_SOMETHING_H
|
|
- arch/x86/include/asm/pv/something.h -> X86_PV_SOMETHING_H
|
|
|
|
- Private headers: <something>_PRIVATE_H
|
|
- common/something/private.h -> <SOMETHING>_PRIVATE_H
|
|
- drivers/foo/something.h -> <SOMETHING>_H
|
|
|
|
A good choice of guard is one that wont become stale if the
|
|
driver/subsystem/etc is shuffled around the source tree.
|
|
|
|
Emacs local variables
|
|
---------------------
|
|
|
|
A comment block containing local variables for emacs is permitted at
|
|
the end of files. It should be:
|
|
|
|
/*
|
|
* Local variables:
|
|
* mode: C
|
|
* c-file-style: "BSD"
|
|
* c-basic-offset: 4
|
|
* indent-tabs-mode: nil
|
|
* End:
|
|
*/
|