Merge remote-tracking branch 'documentation/master'
Signed-off-by: Geoffroy Van Cutsem <geoffroy.vancutsem@intel.com>
6
.gitignore
vendored
@ -3,3 +3,9 @@ hypervisor/bsp/uefi/include/bsp/version.h
|
|||||||
hypervisor/bsp/sbl/include/bsp/version.h
|
hypervisor/bsp/sbl/include/bsp/version.h
|
||||||
devicemdodel/build/
|
devicemdodel/build/
|
||||||
devicemodel/include/version.h
|
devicemodel/include/version.h
|
||||||
|
doxygen
|
||||||
|
_build
|
||||||
|
*.bak
|
||||||
|
*.sav
|
||||||
|
*.log
|
||||||
|
*.warnings
|
||||||
|
55
.known-issues/README
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
This directory contains configuration files to ignore errors found in
|
||||||
|
the build and test process which are known to the developers and for
|
||||||
|
now can be safely ignored.
|
||||||
|
|
||||||
|
To use:
|
||||||
|
|
||||||
|
$ cd <build directory>
|
||||||
|
$ make SOMETHING >& result
|
||||||
|
$ scripts/filter-known-issues.py result
|
||||||
|
|
||||||
|
It is included in the source tree so if anyone has to submit anything
|
||||||
|
that triggers some kind of error that is a false positive, it can
|
||||||
|
include the "ignore me" file, properly documented.
|
||||||
|
|
||||||
|
Each file can contain one or more multiline Python regular expressions
|
||||||
|
(https://docs.python.org/2/library/re.html#regular-expression-syntax)
|
||||||
|
that match an error message. Multiple regular expressions are
|
||||||
|
separated by comment blocks (that start with #). Note that an empty
|
||||||
|
line still is considered part of the multiline regular expression.
|
||||||
|
|
||||||
|
For example
|
||||||
|
|
||||||
|
---beginning---
|
||||||
|
#
|
||||||
|
# This testcase always fails, pending fix ZEP-1234
|
||||||
|
#
|
||||||
|
.*/tests/kernel/grumpy .* FAIL
|
||||||
|
#
|
||||||
|
# Documentation issue, masks:
|
||||||
|
#
|
||||||
|
# /home/e/inaky/z/kernel.git/doc/api/io_interfaces.rst:28: WARNING: Invalid definition: Expected identifier in nested name. [error at 19]
|
||||||
|
# struct dev_config::@65 dev_config::bits
|
||||||
|
# -------------------^
|
||||||
|
#
|
||||||
|
^(?P<filename>.+/doc/api/io_interfaces.rst):(?P<lineno>[0-9]+): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^\s+struct dev_config::@[0-9]+ dev_config::bits.*
|
||||||
|
^\s+-+\^
|
||||||
|
---end---
|
||||||
|
|
||||||
|
Note you want to:
|
||||||
|
|
||||||
|
- use relateive paths; instead of
|
||||||
|
/home/me/mydir/zephyr/something/somewhere.c you will want
|
||||||
|
^.*/something/somewhere.c (as they will depend on where it is being
|
||||||
|
built)
|
||||||
|
|
||||||
|
- Replace line numbers with [0-9]+, as they will change
|
||||||
|
|
||||||
|
- (?P<filename>[-._/\w]+/something/somewhere.c) saves the match on
|
||||||
|
that file path in a "variable" called 'filename' that later you can
|
||||||
|
match with (?P=filename) if you want to match multiple lines of the
|
||||||
|
same error message.
|
||||||
|
|
||||||
|
Can get really twisted and interesting in terms of regexps; they are
|
||||||
|
powerful, so start small :)
|
59
.known-issues/doc/hypercall.conf
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#
|
||||||
|
# Hypercall
|
||||||
|
#
|
||||||
|
#
|
||||||
|
^(?P<filename>[-._/\w]+/api/hypercall_api.rst):(?P<lineno>[0-9]+): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^.*union vhm_request::\@0 vhm_request::\@1
|
||||||
|
^[- \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^.*union vhm_request::\@2 vhm_request::reqs
|
||||||
|
^[- \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^.*union vhm_request_buffer::\@3 vhm_request_buffer::\@4
|
||||||
|
^[- \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^[ \t]*
|
||||||
|
^[ \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^[ \t]*
|
||||||
|
^[ \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^[ \t]*
|
||||||
|
^[ \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^[ \t]*
|
||||||
|
^[ \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected end of definition. \[error at [0-9]+]
|
||||||
|
^.*vhm_request.reqs
|
||||||
|
^[- \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^.*union hc_ptdev_irq::\@5 hc_ptdev_irq::is
|
||||||
|
^[- \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^[ \t]*
|
||||||
|
^[ \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^[ \t]*
|
||||||
|
^[ \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected end of definition. \[error at [0-9]+]
|
||||||
|
^.*hc_ptdev_irq.is
|
||||||
|
^[- \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^[ \t]*
|
||||||
|
^[ \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^[ \t]*
|
||||||
|
^[ \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^[ \t]*
|
||||||
|
^[ \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected end of definition. \[error at [0-9]+]
|
||||||
|
^.*hc_ptdev_irq.is.intx
|
||||||
|
^[- \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected identifier in nested name. \[error at [0-9]+]
|
||||||
|
^[ \t]*
|
||||||
|
^[ \t]*\^
|
||||||
|
^(?P=filename):(?P=lineno): WARNING: Invalid definition: Expected end of definition. \[error at [0-9]+]
|
||||||
|
^.*hc_ptdev_irq.is.msix
|
||||||
|
^[- \t]*\^
|
||||||
|
#
|
6
CODEOWNERS
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# CODEOWNERS for autoreview assigning in github
|
||||||
|
|
||||||
|
# Get all docs reviewed
|
||||||
|
*.rst @dbkinder
|
||||||
|
|
||||||
|
* @dbkinder
|
3
LICENSE
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
ARCN Project Documentation is under a Creative Commons Attribution 4.0
|
||||||
|
International License (CC BY 4.0). For details, see
|
||||||
|
https://creativecommons.org/licenses/by/4.0/.
|
70
Makefile
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
# Minimal makefile for Sphinx documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
ifeq ($(VERBOSE),1)
|
||||||
|
Q =
|
||||||
|
else
|
||||||
|
Q = @
|
||||||
|
endif
|
||||||
|
|
||||||
|
# You can set these variables from the command line.
|
||||||
|
SPHINXOPTS ?= -q
|
||||||
|
SPHINXBUILD = sphinx-build
|
||||||
|
SPHINXPROJ = "Project ACRN"
|
||||||
|
SOURCEDIR = .
|
||||||
|
BUILDDIR = _build
|
||||||
|
|
||||||
|
DOC_TAG ?= development
|
||||||
|
RELEASE ?= latest
|
||||||
|
PUBLISHDIR = ../projectacrn.github.io/$(RELEASE)
|
||||||
|
|
||||||
|
# Put it first so that "make" without argument is like "make help".
|
||||||
|
help:
|
||||||
|
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||||
|
@echo ""
|
||||||
|
@echo "make pullsource"
|
||||||
|
@echo " fetch and merge upstream source for the project ACRN code repos"
|
||||||
|
@echo ""
|
||||||
|
@echo "make publish"
|
||||||
|
@echo " publish generated html to projectacrn.github.io site:"
|
||||||
|
@echo " specify RELEASE=name to publish as a tagged release version"
|
||||||
|
@echo " and placed in a version subfolder"
|
||||||
|
|
||||||
|
.PHONY: help Makefile
|
||||||
|
|
||||||
|
pullsource:
|
||||||
|
$(Q)scripts/pullsource.sh
|
||||||
|
|
||||||
|
|
||||||
|
# Generate the doxygen xml (for Sphinx) and copy the doxygen html to the
|
||||||
|
# api folder for publishing along with the Sphinx-generated API docs.
|
||||||
|
|
||||||
|
#doxy: pullsource
|
||||||
|
doxy:
|
||||||
|
$(Q)(cat acrn.doxyfile) | doxygen - > doc.log 2>&1
|
||||||
|
|
||||||
|
html: doxy
|
||||||
|
-$(Q)$(SPHINXBUILD) -t $(DOC_TAG) -b html -d $(BUILDDIR)/doctrees $(SOURCEDIR) $(BUILDDIR)/html $(SPHINXOPTS) $(O) >> doc.log 2>&1
|
||||||
|
$(Q)./scripts/filter-doc-log.sh doc.log
|
||||||
|
|
||||||
|
|
||||||
|
# Remove generated content (Sphinx and doxygen)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -fr $(BUILDDIR) doxygen
|
||||||
|
|
||||||
|
# Copy material over to the GitHub pages staging repo
|
||||||
|
# along with a README
|
||||||
|
|
||||||
|
publish:
|
||||||
|
rm -fr $(PUBLISHDIR)/*
|
||||||
|
cp -r $(BUILDDIR)/html/* $(PUBLISHDIR)
|
||||||
|
cp scripts/publish-README.md $(PUBLISHDIR)/../README.md
|
||||||
|
cp scripts/publish-index.html $(PUBLISHDIR)/../index.html
|
||||||
|
cd $(PUBLISHDIR)/..; git add -A; git commit -s -m "publish $(RELEASE)"; git push origin master;
|
||||||
|
|
||||||
|
|
||||||
|
# Catch-all target: route all unknown targets to Sphinx using the new
|
||||||
|
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
||||||
|
%: Makefile doxy
|
||||||
|
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
5
README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# Project ACRN Documentation Repo
|
||||||
|
|
||||||
|
This repository hold the source and configuration files used to generate the
|
||||||
|
Project ACRN documentation web site published to
|
||||||
|
https://projectacrn.github.io
|
22
_templates/breadcrumbs.html
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{% extends "!breadcrumbs.html" %}
|
||||||
|
{% block breadcrumbs_aside %}
|
||||||
|
|
||||||
|
<li class="wy-breadcrumbs-aside">
|
||||||
|
<div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="versions">
|
||||||
|
<span class="rst-current-version" data-toggle="rst-current-version">
|
||||||
|
<span class="fa fa-book"> Project ACRN</span>
|
||||||
|
version: {{ current_version }}
|
||||||
|
<span class="fa fa-caret-down"></span>
|
||||||
|
</span>
|
||||||
|
<div class="rst-other-versions">
|
||||||
|
<dl>
|
||||||
|
<dt>Versions</dt>
|
||||||
|
{% for slug, url in versions %}
|
||||||
|
<dd><a href="{{ url }}">{{ slug }}</a></dd>
|
||||||
|
{% endfor %}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{# {{ super() }} #}
|
||||||
|
{% endblock %}
|
8
_templates/footer.html
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{% extends "!footer.html" %}
|
||||||
|
{% block extrafooter %}
|
||||||
|
<p class="extrafooter">Documentation licensed under <a rel="license"
|
||||||
|
href="http://creativecommons.org/licenses/by/4.0/">(CC BY 4.0) <img
|
||||||
|
alt="Creative Commons License" style="border-width:0"
|
||||||
|
src="https://i.creativecommons.org/l/by/4.0/80x15.png" /></a></p>
|
||||||
|
{{ super() }}
|
||||||
|
{% endblock %}
|
2464
acrn.doxyfile
Normal file
13
api/devicemodel_api.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _devicemodel_apis:
|
||||||
|
|
||||||
|
Device Model APIs
|
||||||
|
#################
|
||||||
|
|
||||||
|
This section contains APIs for the SOS Device Model services. Sources
|
||||||
|
for the Device Model are found in the `ACRN Device Model GitHub repo`_
|
||||||
|
|
||||||
|
.. _ACRN Device Model GitHub repo:
|
||||||
|
https://github.com/projectacrn/acrn-devicemodel/
|
||||||
|
|
||||||
|
.. doxygengroup:: acrn_virtio
|
||||||
|
:project: Project ACRN
|
13
api/hypercall_api.rst
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.. _hypercall_apis:
|
||||||
|
|
||||||
|
Hypercall APIs
|
||||||
|
##############
|
||||||
|
|
||||||
|
This section contains APIs for the hypercall services. Sources
|
||||||
|
for the Device Model are found in the `ACRN Hypervisor GitHub repo`_
|
||||||
|
|
||||||
|
.. _ACRN Hypervisor GitHub repo:
|
||||||
|
https://github.com/projectacrn/acrn-hypervisor/
|
||||||
|
|
||||||
|
.. doxygengroup:: acrn_hypercall
|
||||||
|
:project: Project ACRN
|
18
api/index.rst
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
.. _acrn_apis:
|
||||||
|
|
||||||
|
API Documentation
|
||||||
|
#################
|
||||||
|
|
||||||
|
Welcome to Project ACRN :abbr:`API (Application Programing
|
||||||
|
Interface)` documentation.
|
||||||
|
|
||||||
|
This section contains the API documentation automatically extracted from
|
||||||
|
the code. If you are looking for a specific API, enter it on the search
|
||||||
|
box. The search results display all sections containing information
|
||||||
|
about that API.
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
|
||||||
|
hypercall_api.rst
|
||||||
|
devicemodel_api.rst
|
282
conf.py
Normal file
@ -0,0 +1,282 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Project ACRN documentation build configuration file, created by
|
||||||
|
# sphinx-quickstart on Wed Jan 10 20:51:29 2018.
|
||||||
|
#
|
||||||
|
# This file is execfile()d with the current directory set to its
|
||||||
|
# containing dir.
|
||||||
|
#
|
||||||
|
# Note that not all possible configuration values are present in this
|
||||||
|
# autogenerated file.
|
||||||
|
#
|
||||||
|
# All configuration values have a default; values that are commented out
|
||||||
|
# serve to show the default.
|
||||||
|
|
||||||
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
|
#
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
sys.path.insert(0, os.path.abspath('.'))
|
||||||
|
|
||||||
|
|
||||||
|
# -- General configuration ------------------------------------------------
|
||||||
|
|
||||||
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
|
#
|
||||||
|
# needs_sphinx = '1.0'
|
||||||
|
|
||||||
|
# Add any Sphinx extension module names here, as strings. They can be
|
||||||
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||||
|
# ones.
|
||||||
|
extensions = ['breathe']
|
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
|
templates_path = ['_templates']
|
||||||
|
|
||||||
|
# The suffix(es) of source filenames.
|
||||||
|
# You can specify multiple suffix as a list of string:
|
||||||
|
#
|
||||||
|
# source_suffix = ['.rst', '.md']
|
||||||
|
source_suffix = '.rst'
|
||||||
|
|
||||||
|
# The master toctree document.
|
||||||
|
master_doc = 'index'
|
||||||
|
|
||||||
|
# General information about the project.
|
||||||
|
project = u'Project ACRN™'
|
||||||
|
copyright = u'2018, Project ACRN'
|
||||||
|
author = u'Project ARCN developers'
|
||||||
|
|
||||||
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
|
# |version| and |release|, also used in various other places throughout the
|
||||||
|
# built documents.
|
||||||
|
|
||||||
|
# The following code tries to extract the information by reading the
|
||||||
|
# Makefile from the acrn-hypervisor repo by finding these lines:
|
||||||
|
# MAJOR_VERSION=0
|
||||||
|
# MINOR_VERSION=1
|
||||||
|
# RC_VERSION=1
|
||||||
|
|
||||||
|
try:
|
||||||
|
version_major = None
|
||||||
|
version_minor = None
|
||||||
|
version_rc = None
|
||||||
|
for line in open(os.path.normpath("../acrn-hypervisor/Makefile")) :
|
||||||
|
# remove comments
|
||||||
|
line = line.split('#', 1)[0]
|
||||||
|
line = line.rstrip()
|
||||||
|
if (line.count("=") == 1) :
|
||||||
|
key, val = [x.strip() for x in line.split('=', 2)]
|
||||||
|
if key == 'MAJOR_VERSION':
|
||||||
|
version_major = val
|
||||||
|
if key == 'MINOR_VERSION':
|
||||||
|
version_minor = val
|
||||||
|
if key == 'RC_VERSION':
|
||||||
|
version_rc = val
|
||||||
|
if version_major and version_minor and version_rc :
|
||||||
|
break
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
finally:
|
||||||
|
if version_major and version_minor and version_rc :
|
||||||
|
version = release = "v " + version_major + '.' + version_minor
|
||||||
|
if int(version_rc) > 0 :
|
||||||
|
version = release = version + '-rc' + version_rc
|
||||||
|
else:
|
||||||
|
sys.stderr.write('Warning: Could not extract hypervisor version from Makefile\n')
|
||||||
|
version = release = "unknown"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# The short X.Y version.
|
||||||
|
# version = u'0.1'
|
||||||
|
# The full version, including alpha/beta/rc tags.
|
||||||
|
# release = u'0.1'
|
||||||
|
|
||||||
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
|
# for a list of supported languages.
|
||||||
|
#
|
||||||
|
# This is also used if you do content translation via gettext catalogs.
|
||||||
|
# Usually you set "language" from the command line for these cases.
|
||||||
|
language = None
|
||||||
|
|
||||||
|
# List of patterns, relative to source directory, that match files and
|
||||||
|
# directories to ignore when looking for source files.
|
||||||
|
# This patterns also effect to html_static_path and html_extra_path
|
||||||
|
exclude_patterns = ['_build' ]
|
||||||
|
|
||||||
|
# The name of the Pygments (syntax highlighting) style to use.
|
||||||
|
pygments_style = 'sphinx'
|
||||||
|
|
||||||
|
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||||
|
todo_include_todos = False
|
||||||
|
|
||||||
|
# -- Options for HTML output ----------------------------------------------
|
||||||
|
|
||||||
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
|
# a list of builtin themes.
|
||||||
|
#
|
||||||
|
try:
|
||||||
|
import sphinx_rtd_theme
|
||||||
|
except ImportError:
|
||||||
|
html_theme = 'alabaster'
|
||||||
|
# This is required for the alabaster theme
|
||||||
|
# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
|
||||||
|
html_sidebars = {
|
||||||
|
'**': [
|
||||||
|
'relations.html', # needs 'show_related': True theme option to display
|
||||||
|
'searchbox.html',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
sys.stderr.write('Warning: sphinx_rtd_theme missing. Use pip to install it.\n')
|
||||||
|
else:
|
||||||
|
html_theme = "sphinx_rtd_theme"
|
||||||
|
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
|
||||||
|
html_theme_options = {
|
||||||
|
'canonical_url': '',
|
||||||
|
'analytics_id': '',
|
||||||
|
'logo_only': False,
|
||||||
|
'display_version': True,
|
||||||
|
'prev_next_buttons_location': 'None',
|
||||||
|
# Toc options
|
||||||
|
'collapse_navigation': False,
|
||||||
|
'sticky_navigation': True,
|
||||||
|
'navigation_depth': 4,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Here's where we (manually) list the document versions maintained on
|
||||||
|
# the published doc website. On a daily basis we publish to the
|
||||||
|
# /latest folder but when releases are made, we publish to a /<relnum>
|
||||||
|
# folder (specified via RELEASE=name on the make command).
|
||||||
|
|
||||||
|
if tags.has('release'):
|
||||||
|
current_version = version
|
||||||
|
else:
|
||||||
|
version = current_version = "latest"
|
||||||
|
|
||||||
|
html_context = {
|
||||||
|
'current_version': current_version,
|
||||||
|
'versions': ( ("latest", "/latest/"),
|
||||||
|
# ("0.1-rc4", "/0.1-rc4/"),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Theme options are theme-specific and customize the look and feel of a theme
|
||||||
|
# further. For a list of options available for each theme, see the
|
||||||
|
# documentation.
|
||||||
|
#
|
||||||
|
# html_theme_options = {}
|
||||||
|
|
||||||
|
html_logo = 'images/ACRN_Logo_300w.png'
|
||||||
|
html_favicon = 'images/ACRN-favicon-32x32.png'
|
||||||
|
|
||||||
|
numfig = True
|
||||||
|
#numfig_secnum_depth = (2)
|
||||||
|
numfig_format = {'figure': 'Figure %s', 'table': 'Table %s', 'code-block': 'Code Block %s'}
|
||||||
|
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
|
html_static_path = ['static']
|
||||||
|
|
||||||
|
def setup(app):
|
||||||
|
app.add_stylesheet("acrn-custom.css")
|
||||||
|
|
||||||
|
# Custom sidebar templates, must be a dictionary that maps document names
|
||||||
|
# to template names.
|
||||||
|
#
|
||||||
|
|
||||||
|
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||||
|
html_show_sphinx = False
|
||||||
|
|
||||||
|
# If true, links to the reST sources are added to the pages.
|
||||||
|
html_show_sourcelink = False
|
||||||
|
|
||||||
|
# If not '', a 'Last updated on:' timestamp is inserted at every page
|
||||||
|
# bottom,
|
||||||
|
# using the given strftime format.
|
||||||
|
html_last_updated_fmt = '%b %d, %Y'
|
||||||
|
|
||||||
|
# -- Options for HTMLHelp output ------------------------------------------
|
||||||
|
|
||||||
|
# Output file base name for HTML help builder.
|
||||||
|
htmlhelp_basename = 'ACRN Project Help'
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for LaTeX output ---------------------------------------------
|
||||||
|
|
||||||
|
latex_elements = {
|
||||||
|
# The paper size ('letterpaper' or 'a4paper').
|
||||||
|
#
|
||||||
|
# 'papersize': 'letterpaper',
|
||||||
|
|
||||||
|
# The font size ('10pt', '11pt' or '12pt').
|
||||||
|
#
|
||||||
|
# 'pointsize': '10pt',
|
||||||
|
|
||||||
|
# Additional stuff for the LaTeX preamble.
|
||||||
|
#
|
||||||
|
# 'preamble': '',
|
||||||
|
|
||||||
|
# Latex figure (float) alignment
|
||||||
|
#
|
||||||
|
# 'figure_align': 'htbp',
|
||||||
|
}
|
||||||
|
|
||||||
|
# Grouping the document tree into LaTeX files. List of tuples
|
||||||
|
# (source start file, target name, title,
|
||||||
|
# author, documentclass [howto, manual, or own class]).
|
||||||
|
latex_documents = [
|
||||||
|
(master_doc, 'acrn.tex', u'Project ACRN Documentation',
|
||||||
|
u'Project ACRN', 'manual'),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for manual page output ---------------------------------------
|
||||||
|
|
||||||
|
# One entry per manual page. List of tuples
|
||||||
|
# (source start file, name, description, authors, manual section).
|
||||||
|
man_pages = [
|
||||||
|
(master_doc, 'acrn', u'Project ACRN Documentation',
|
||||||
|
[author], 1)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for Texinfo output -------------------------------------------
|
||||||
|
|
||||||
|
# Grouping the document tree into Texinfo files. List of tuples
|
||||||
|
# (source start file, target name, title, author,
|
||||||
|
# dir menu entry, description, category)
|
||||||
|
texinfo_documents = [
|
||||||
|
(master_doc, 'Project ACRN', u'Project ACRN Documentation',
|
||||||
|
author, 'Project ACRN',
|
||||||
|
'IoT-Optimized Hypervisor for Intel Architecture',
|
||||||
|
'Miscellaneous'),
|
||||||
|
]
|
||||||
|
|
||||||
|
rst_epilog = """
|
||||||
|
.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGN
|
||||||
|
:ltrim:
|
||||||
|
.. |trade| unicode:: U+02122 .. TRADEMARK SIGN
|
||||||
|
:ltrim:
|
||||||
|
.. |reg| unicode:: U+000AE .. REGISTERED TRADEMARK SIGN
|
||||||
|
:ltrim:
|
||||||
|
.. |deg| unicode:: U+000B0 .. DEGREE SIGN
|
||||||
|
:ltrim:
|
||||||
|
.. |plusminus| unicode:: U+000B1 .. PLUS-MINUS SIGN
|
||||||
|
:rtrim:
|
||||||
|
.. |micro| unicode:: U+000B5 .. MICRO SIGN
|
||||||
|
:rtrim:
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
breathe_projects = {
|
||||||
|
"Project ACRN" : "doxygen/xml",
|
||||||
|
}
|
||||||
|
breathe_default_project = "Project ACRN"
|
||||||
|
breathe_default_members = ('members', 'undoc-members', 'content-only')
|
447
contribute.rst
Normal file
@ -0,0 +1,447 @@
|
|||||||
|
.. _contribute:
|
||||||
|
|
||||||
|
Contribution Guidelines
|
||||||
|
#######################
|
||||||
|
|
||||||
|
As an open-source project, we welcome and encourage the community to
|
||||||
|
submit patches directly to project ACRN. In our collaborative open
|
||||||
|
source environment, standards and methods for submitting changes help
|
||||||
|
reduce the chaos that can result from an active development community.
|
||||||
|
|
||||||
|
This document explains how to participate in project conversations, log
|
||||||
|
and track bugs and enhancement requests, and submit patches to the
|
||||||
|
project so your patch will be accepted quickly in the codebase.
|
||||||
|
|
||||||
|
Licensing
|
||||||
|
*********
|
||||||
|
|
||||||
|
Licensing is very important to open source projects. It helps ensure the
|
||||||
|
software continues to be available under the terms that the author
|
||||||
|
desired.
|
||||||
|
|
||||||
|
Project ACRN uses a BSD-3-Clause license, as found in the license_header in
|
||||||
|
the project's GitHub repo.
|
||||||
|
|
||||||
|
A license tells you what rights you have as a developer, as provided by
|
||||||
|
the copyright holder. It is important that the contributor fully
|
||||||
|
understands the licensing rights and agrees to them. Sometimes the
|
||||||
|
copyright holder isn't the contributor, such as when the contributor is
|
||||||
|
doing work on behalf of a company.
|
||||||
|
|
||||||
|
.. _DCO:
|
||||||
|
|
||||||
|
Developer Certification of Origin (DCO)
|
||||||
|
***************************************
|
||||||
|
|
||||||
|
To make a good faith effort to ensure licensing criteria are met,
|
||||||
|
project ACRN requires the Developer Certificate of Origin (DCO) process
|
||||||
|
to be followed.
|
||||||
|
|
||||||
|
The DCO is an attestation attached to every contribution made by every
|
||||||
|
developer. In the commit message of the contribution, (described more
|
||||||
|
fully later in this document), the developer simply adds a
|
||||||
|
``Signed-off-by`` statement and thereby agrees to the DCO.
|
||||||
|
|
||||||
|
When a developer submits a patch, it is a commitment that the
|
||||||
|
contributor has the right to submit the patch per the license. The DCO
|
||||||
|
agreement is shown below and at http://developercertificate.org/.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
Developer's Certificate of Origin 1.1
|
||||||
|
|
||||||
|
By making a contribution to this project, I certify that:
|
||||||
|
|
||||||
|
(a) The contribution was created in whole or in part by me and I
|
||||||
|
have the right to submit it under the open source license
|
||||||
|
indicated in the file; or
|
||||||
|
|
||||||
|
(b) The contribution is based upon previous work that, to the
|
||||||
|
best of my knowledge, is covered under an appropriate open
|
||||||
|
source license and I have the right under that license to
|
||||||
|
submit that work with modifications, whether created in whole
|
||||||
|
or in part by me, under the same open source license (unless
|
||||||
|
I am permitted to submit under a different license), as
|
||||||
|
Indicated in the file; or
|
||||||
|
|
||||||
|
(c) The contribution was provided directly to me by some other
|
||||||
|
person who certified (a), (b) or (c) and I have not modified
|
||||||
|
it.
|
||||||
|
|
||||||
|
(d) I understand and agree that this project and the contribution
|
||||||
|
are public and that a record of the contribution (including
|
||||||
|
all personal information I submit with it, including my
|
||||||
|
sign-off) is maintained indefinitely and may be redistributed
|
||||||
|
consistent with this project or the open source license(s)
|
||||||
|
involved.
|
||||||
|
|
||||||
|
DCO Sign-Off Methods
|
||||||
|
====================
|
||||||
|
|
||||||
|
The DCO requires that a sign-off message, in the following format,
|
||||||
|
appears on each commit in the pull request::
|
||||||
|
|
||||||
|
Signed-off-by: Acrnus Jones <acrnusj@gmail.com>
|
||||||
|
|
||||||
|
The DCO text can either be manually added to your commit body, or you can add
|
||||||
|
either ``-s`` or ``--signoff`` to your usual Git commit commands. If you forget
|
||||||
|
to add the sign-off you can also amend a previous commit with the sign-off by
|
||||||
|
running ``git commit --amend -s``. If you've pushed your changes to GitHub
|
||||||
|
already you'll need to force push your branch after this with ``git push -f``.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
The name and email address of the account you use to submit your PR must
|
||||||
|
match the name and email address on the ``Signed-off-by`` line in
|
||||||
|
your commit message.
|
||||||
|
|
||||||
|
Prerequisites
|
||||||
|
*************
|
||||||
|
|
||||||
|
.. _project ACRN website: https://projectacrn.org
|
||||||
|
|
||||||
|
As a contributor, you'll want to be familiar with project ACRN, how to
|
||||||
|
configure, install, and use it as explained on the
|
||||||
|
`project ACRN website`_, and how to set up your development environment
|
||||||
|
as introduced in the project ACRN `Getting Started Guide`_.
|
||||||
|
|
||||||
|
.. _Getting Started Guide:
|
||||||
|
https://projectacrn.github.io/getting_started/
|
||||||
|
|
||||||
|
You should be familiar with common developer tools such as Git, and
|
||||||
|
platforms such as GitHub.
|
||||||
|
|
||||||
|
If you haven't already done so, you'll need to create a (free) GitHub account
|
||||||
|
on https://github.com and have Git tools available on your development system.
|
||||||
|
|
||||||
|
Repository layout
|
||||||
|
*****************
|
||||||
|
|
||||||
|
To clone the ACRN hypervisor repository use::
|
||||||
|
|
||||||
|
git clone https://github.com/projectacrn/acrn-hypervisor
|
||||||
|
|
||||||
|
To clone the ACRN device model repository use::
|
||||||
|
|
||||||
|
git clone https://github.com/projectacrn/acrn-devicemodel
|
||||||
|
|
||||||
|
To clone the ACRN documentation repository use::
|
||||||
|
|
||||||
|
git clone https://github.com/projectacrn/acrn-documentation
|
||||||
|
|
||||||
|
The project ACRN directory structure is described in the `Hypervisor
|
||||||
|
Primer`_ document. In addition to the ACRN hypervisor and device model itself,
|
||||||
|
you'll also find the sources for technical documentation available from
|
||||||
|
the `ACRN documentation site`_. All of these are available for
|
||||||
|
developers to contribute to and enhance.
|
||||||
|
|
||||||
|
.. _ACRN documentation site:
|
||||||
|
https://projectacrn.github.io/
|
||||||
|
|
||||||
|
.. _Hypervisor Primer:
|
||||||
|
https://projectacrn.github.io/hypervisor_primer
|
||||||
|
|
||||||
|
Submitting Issues
|
||||||
|
******************
|
||||||
|
|
||||||
|
.. _ACRN-dev mailing list:
|
||||||
|
https://lists.projectacrn.org/g/acrn-dev
|
||||||
|
|
||||||
|
.. _ACRN hypervisor issues:
|
||||||
|
https://github.com/projectacrn/acrn-hypervisor/issues
|
||||||
|
|
||||||
|
Issue tracking for project ACRN bugs or enhancement requests is done using
|
||||||
|
GitHub issues in the `ACRN hypervisor issues`_ list. Before submitting a
|
||||||
|
bug or enhancement request, first check to see what's already been
|
||||||
|
reported, and add to that discussion if you have additional information.
|
||||||
|
(Be sure to check both the "open" and "closed" issues.)
|
||||||
|
You should also read through discusions in the `ACRN-dev mailing list`_
|
||||||
|
to see what's been reported on or discussed. You may find others that
|
||||||
|
have encountered the issue you're finding, or that have similar ideas
|
||||||
|
for changes or additions.
|
||||||
|
|
||||||
|
If you don't find an existing issue listed in the `ACRN hypervisor issues`_
|
||||||
|
list, then click on the "New Issue" button and provide a summary title
|
||||||
|
and more detailed description of your bug or enhancement request.
|
||||||
|
|
||||||
|
When you submit an issue (bug or feature request), the triage team will
|
||||||
|
review and comment on the submission, typically within a few business
|
||||||
|
days. Use the `ACRN hypervisor issues`_ list to track the status of
|
||||||
|
your submitted issues as well, or to add additional comments.
|
||||||
|
|
||||||
|
.. _Contribution Tools:
|
||||||
|
|
||||||
|
Contribution Tools and Git Setup
|
||||||
|
********************************
|
||||||
|
|
||||||
|
Signed-off-by
|
||||||
|
=============
|
||||||
|
|
||||||
|
The name in the commit message ``Signed-off-by:`` line and your email must
|
||||||
|
match the change authorship information. Make sure your :file:`.gitconfig`
|
||||||
|
is set up correctly by using:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
git config --global user.name "David Developer"
|
||||||
|
git config --global user.email "david.developer@company.com"
|
||||||
|
|
||||||
|
|
||||||
|
Coding Style
|
||||||
|
************
|
||||||
|
|
||||||
|
Use these coding guidelines to ensure that your development complies with the
|
||||||
|
project's style and naming conventions.
|
||||||
|
|
||||||
|
.. _Linux kernel coding style:
|
||||||
|
https://kernel.org/doc/html/latest/process/coding-style.html
|
||||||
|
|
||||||
|
In general, follow the `Linux kernel coding style`_, with the
|
||||||
|
following exceptions:
|
||||||
|
|
||||||
|
* Add braces to every ``if`` and ``else`` body, even for single-line code
|
||||||
|
blocks. Use the ``--ignore BRACES`` flag to make *checkpatch* stop
|
||||||
|
complaining.
|
||||||
|
* Use spaces instead of tabs to align comments after declarations, as needed.
|
||||||
|
* Use C89-style single line comments, ``/* */``. The C99-style single line
|
||||||
|
comment, ``//``, is not allowed.
|
||||||
|
* Use ``/** */`` for doxygen comments that need to appear in the documentation.
|
||||||
|
|
||||||
|
|
||||||
|
.. _Contribution workflow:
|
||||||
|
|
||||||
|
Contribution Workflow
|
||||||
|
*********************
|
||||||
|
|
||||||
|
One general practice we encourage, is to make small,
|
||||||
|
controlled changes. This practice simplifies review, makes merging and
|
||||||
|
rebasing easier, and keeps the change history clear and clean.
|
||||||
|
|
||||||
|
When contributing to project ACRN, it is also important you provide as much
|
||||||
|
information as you can about your change, update appropriate documentation,
|
||||||
|
and test your changes thoroughly before submitting.
|
||||||
|
|
||||||
|
The general GitHub workflow used by project ACRN developers uses a combination of
|
||||||
|
command line Git commands and browser interaction with GitHub. As it is with
|
||||||
|
Git, there are multiple ways of getting a task done. We'll describe a typical
|
||||||
|
workflow here for the acrn-hypervisor repo that can also be used for the
|
||||||
|
acrn-devicemodel and acrn-documentation repos:
|
||||||
|
|
||||||
|
.. _Create a Fork of acrn-hypervisor:
|
||||||
|
https://github.com/projectacrn/acrn-hypervisor#fork-destination-box
|
||||||
|
|
||||||
|
#. `Create a Fork of acrn-hypervisor`_
|
||||||
|
to your personal account on GitHub. (Click on the fork button in the top
|
||||||
|
right corner of the project acrn-hypervisor repo page in GitHub.)
|
||||||
|
|
||||||
|
#. On your development computer, clone the fork you just made::
|
||||||
|
|
||||||
|
git clone https://github.com/<your github id>/acrn-hypervisor
|
||||||
|
|
||||||
|
This would be a good time to let Git know about the upstream repo too::
|
||||||
|
|
||||||
|
git remote add upstream https://github.com/projectacrn/acrn-hypervisor.git
|
||||||
|
|
||||||
|
and verify the remote repos::
|
||||||
|
|
||||||
|
git remote -v
|
||||||
|
|
||||||
|
#. Create a topic branch (off of master) for your work (if you're addressing
|
||||||
|
an issue, we suggest including the issue number in the branch name)::
|
||||||
|
|
||||||
|
git checkout master
|
||||||
|
git checkout -b fix_comment_typo
|
||||||
|
|
||||||
|
#. Make changes, test locally, change, test, test again, ...
|
||||||
|
|
||||||
|
#. When things look good, start the pull request process by checking
|
||||||
|
which files have not been staged::
|
||||||
|
|
||||||
|
git status
|
||||||
|
|
||||||
|
Then add the changed files::
|
||||||
|
|
||||||
|
git add [file(s) that changed, add -p if you want to be more specific]
|
||||||
|
|
||||||
|
(or to have all changed files added use)::
|
||||||
|
|
||||||
|
git add -A
|
||||||
|
|
||||||
|
#. Verify changes to be committed look as you expected::
|
||||||
|
|
||||||
|
git diff --cached
|
||||||
|
|
||||||
|
#. Commit your changes to your local repo::
|
||||||
|
|
||||||
|
git commit -s
|
||||||
|
|
||||||
|
The ``-s`` option automatically adds your ``Signed-off-by:`` to your commit
|
||||||
|
message. Your commit will be rejected without this line that indicates your
|
||||||
|
agreement with the `DCO`_. See the `Commit Guidelines`_ section
|
||||||
|
below for specific guidelines for writing your commit messages.
|
||||||
|
|
||||||
|
#. Push your topic branch with your changes to your fork in your personal
|
||||||
|
GitHub account::
|
||||||
|
|
||||||
|
git push origin fix_comment_typo
|
||||||
|
|
||||||
|
#. In your web browser, go to your personal forked repo and click on the Compare & pull
|
||||||
|
request button for the branch you just worked on and you want to
|
||||||
|
submit to the upstream repo.
|
||||||
|
|
||||||
|
#. Review the pull request changes, and verify that you are opening a pull request
|
||||||
|
for the appropriate branch. The title and message from your commit message should
|
||||||
|
appear as well.
|
||||||
|
|
||||||
|
#. GitHub will assign one or more suggested reviewers (based on the CODEOWNERS file
|
||||||
|
in the repo). If you are a project member, you can select additional reviewers
|
||||||
|
now too.
|
||||||
|
|
||||||
|
#. Click on the submit button and your pull request is sent and awaits review.
|
||||||
|
Email will be sent as review comments are made, or you can check on your
|
||||||
|
pull request at https://github.com/projectacrn/acrn-hypervisor/pulls.
|
||||||
|
|
||||||
|
#. While you're waiting for your pull request to be accepted and merged, you can
|
||||||
|
create another branch to work on another issue. (Be sure to make your new branch
|
||||||
|
off of master and not the previous branch.)::
|
||||||
|
|
||||||
|
git checkout master
|
||||||
|
git checkout -b fix_another_issue
|
||||||
|
|
||||||
|
and use the same process described above to work on this new topic branch.
|
||||||
|
|
||||||
|
#. If reviewers do request changes to your patch, you can interactively rebase
|
||||||
|
commit(s) to fix review issues. In your development repo, make the
|
||||||
|
needed changes on the branch you made the initial submission::
|
||||||
|
|
||||||
|
git checkout fix-comment-typo
|
||||||
|
|
||||||
|
then::
|
||||||
|
|
||||||
|
git fetch --all
|
||||||
|
git rebase --ignore-whitespace upstream/master
|
||||||
|
|
||||||
|
The ``--ignore-whitespace`` option stops git apply (called by rebase) from changing
|
||||||
|
any whitespace. Continuing::
|
||||||
|
|
||||||
|
git rebase -i <offending-commit-id>
|
||||||
|
|
||||||
|
In the interactive rebase editor, replace pick with edit to select a specific
|
||||||
|
commit (if there's more than one in your pull request), or remove the line to
|
||||||
|
delete a commit entirely. Then edit files to fix the issues in the review.
|
||||||
|
|
||||||
|
As before, inspect and test your changes. When ready, continue the
|
||||||
|
patch submission::
|
||||||
|
|
||||||
|
git add [file(s)]
|
||||||
|
git rebase --continue
|
||||||
|
|
||||||
|
Update commit comment if needed, and continue::
|
||||||
|
|
||||||
|
git push --force origin fix_comment_typo
|
||||||
|
|
||||||
|
By force pushing your update, your original pull request will be updated with
|
||||||
|
your changes so you won't need to resubmit the pull request.
|
||||||
|
|
||||||
|
You can follow the same workflow for contributing to acrn-devicemodel
|
||||||
|
or acrn-documentation repos.
|
||||||
|
|
||||||
|
|
||||||
|
Commit Guidelines
|
||||||
|
*****************
|
||||||
|
|
||||||
|
Changes are submitted as Git commits. Each commit message must contain:
|
||||||
|
|
||||||
|
* A short and descriptive subject line that is less than 72 characters,
|
||||||
|
followed by a blank line. The subject line must include a prefix that
|
||||||
|
identifies the subsystem being changed, followed by a colon, and a short
|
||||||
|
title, for example: ``doc: update commit guidelines instructions``.
|
||||||
|
(If you're updating an existing file, you can use
|
||||||
|
``git log <filename>`` to see what developers used as the prefix for
|
||||||
|
previous patches of this file.)
|
||||||
|
|
||||||
|
* A change description with your logic or reasoning for the changes, followed
|
||||||
|
by a blank line.
|
||||||
|
|
||||||
|
* A Signed-off-by line, ``Signed-off-by: <name> <email>`` typically added
|
||||||
|
automatically by using ``git commit -s``
|
||||||
|
|
||||||
|
* If the change addresses an issue, include a line of the form::
|
||||||
|
|
||||||
|
Fixes #<issue number>
|
||||||
|
|
||||||
|
See `Closing issues using keywords
|
||||||
|
<https://help.github.com/articles/closing-issues-using-keywords>`_
|
||||||
|
for more information about this GitHub feature.
|
||||||
|
|
||||||
|
|
||||||
|
All changes and topics sent to GitHub must be well-formed, as described above.
|
||||||
|
|
||||||
|
Commit Message Body
|
||||||
|
===================
|
||||||
|
|
||||||
|
When editing the commit message, please briefly explain what your change
|
||||||
|
does and why it's needed. A change summary of ``"Fixes stuff"`` will be rejected.
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
An empty change summary body is not permitted. Even for trivial changes, please
|
||||||
|
include a summary body in the commmit message.
|
||||||
|
|
||||||
|
The description body of the commit message must include:
|
||||||
|
|
||||||
|
* **what** the change does,
|
||||||
|
* **why** you chose that approach,
|
||||||
|
* **what** assumptions were made, and
|
||||||
|
* **how** you know it works -- for example, which tests you ran.
|
||||||
|
|
||||||
|
For examples of accepted commit messages, you can refer to the acrn-hypervisor GitHub
|
||||||
|
`changelog <https://github.com/projectacrn/acrn-hypervisor/commits/master>`__.
|
||||||
|
|
||||||
|
Other Commit Expectations
|
||||||
|
=========================
|
||||||
|
|
||||||
|
* Commits must build cleanly when applied on top of each other, thus avoiding
|
||||||
|
breaking bisectability.
|
||||||
|
|
||||||
|
* Each commit must address a single identifiable issue and must be
|
||||||
|
logically self-contained. Unrelated changes should be submitted as
|
||||||
|
separate commits.
|
||||||
|
|
||||||
|
* You may submit pull request RFCs (requests for comments) to send work
|
||||||
|
proposals, progress snapshots of your work, or to get early feedback on
|
||||||
|
features or changes that will affect multiple areas in the code base.
|
||||||
|
|
||||||
|
Identifying Contribution Origin
|
||||||
|
===============================
|
||||||
|
|
||||||
|
When adding a new file to the tree, it is important to detail the source of
|
||||||
|
origin on the file, provide attributions, and detail the intended usage. In
|
||||||
|
cases where the file is an original to acrn-hypervisor, the commit message should
|
||||||
|
include the following ("Original" is the assumption if no Origin tag is
|
||||||
|
present)::
|
||||||
|
|
||||||
|
Origin: Original
|
||||||
|
|
||||||
|
In cases where the file is imported from an external project, the commit
|
||||||
|
message shall contain details regarding the original project, the location of
|
||||||
|
the project, the SHA-id of the origin commit for the file, the intended
|
||||||
|
purpose, and if the file will be maintained by the acrn-hypervisor project,
|
||||||
|
(whether or not project ACRN will contain a localized branch or if
|
||||||
|
it is a downstream copy).
|
||||||
|
|
||||||
|
For example, a copy of a locally maintained import::
|
||||||
|
|
||||||
|
Origin: Contiki OS
|
||||||
|
License: BSD 3-Clause
|
||||||
|
URL: http://www.contiki-os.org/
|
||||||
|
commit: 853207acfdc6549b10eb3e44504b1a75ae1ad63a
|
||||||
|
Purpose: Introduction of networking stack.
|
||||||
|
Maintained-by: acrn-hypervisor
|
||||||
|
|
||||||
|
For example, a copy of an externally maintained import::
|
||||||
|
|
||||||
|
Origin: Tiny Crypt
|
||||||
|
License: BSD 3-Clause
|
||||||
|
URL: https://github.com/01org/tinycrypt
|
||||||
|
commit: 08ded7f21529c39e5133688ffb93a9d0c94e5c6e
|
||||||
|
Purpose: Introduction of TinyCrypt
|
||||||
|
Maintained-by: External
|
194
custom-doxygen/DoxygenLayout.xml
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
<doxygenlayout version="1.0">
|
||||||
|
<!-- Generated by doxygen 1.8.13 -->
|
||||||
|
<!-- Navigation index tabs for HTML output -->
|
||||||
|
<navindex>
|
||||||
|
<tab type="mainpage" visible="yes" title=""/>
|
||||||
|
<tab type="pages" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="modules" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="namespaces" visible="yes" title="">
|
||||||
|
<tab type="namespacelist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="namespacemembers" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="classes" visible="yes" title="">
|
||||||
|
<tab type="classlist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/>
|
||||||
|
<tab type="hierarchy" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="classmembers" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="files" visible="yes" title="">
|
||||||
|
<tab type="filelist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="globals" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="examples" visible="yes" title="" intro=""/>
|
||||||
|
</navindex>
|
||||||
|
|
||||||
|
<!-- Layout definition for a class page -->
|
||||||
|
<class>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<includes visible="$SHOW_INCLUDE_FILES"/>
|
||||||
|
<inheritancegraph visible="$CLASS_GRAPH"/>
|
||||||
|
<collaborationgraph visible="$COLLABORATION_GRAPH"/>
|
||||||
|
<memberdecl>
|
||||||
|
<nestedclasses visible="yes" title=""/>
|
||||||
|
<publictypes title=""/>
|
||||||
|
<services title=""/>
|
||||||
|
<interfaces title=""/>
|
||||||
|
<publicslots title=""/>
|
||||||
|
<signals title=""/>
|
||||||
|
<publicmethods title=""/>
|
||||||
|
<publicstaticmethods title=""/>
|
||||||
|
<publicattributes title=""/>
|
||||||
|
<publicstaticattributes title=""/>
|
||||||
|
<protectedtypes title=""/>
|
||||||
|
<protectedslots title=""/>
|
||||||
|
<protectedmethods title=""/>
|
||||||
|
<protectedstaticmethods title=""/>
|
||||||
|
<protectedattributes title=""/>
|
||||||
|
<protectedstaticattributes title=""/>
|
||||||
|
<packagetypes title=""/>
|
||||||
|
<packagemethods title=""/>
|
||||||
|
<packagestaticmethods title=""/>
|
||||||
|
<packageattributes title=""/>
|
||||||
|
<packagestaticattributes title=""/>
|
||||||
|
<properties title=""/>
|
||||||
|
<events title=""/>
|
||||||
|
<privatetypes title=""/>
|
||||||
|
<privateslots title=""/>
|
||||||
|
<privatemethods title=""/>
|
||||||
|
<privatestaticmethods title=""/>
|
||||||
|
<privateattributes title=""/>
|
||||||
|
<privatestaticattributes title=""/>
|
||||||
|
<friends title=""/>
|
||||||
|
<related title="" subtitle=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<inlineclasses title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<services title=""/>
|
||||||
|
<interfaces title=""/>
|
||||||
|
<constructors title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<related title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
<properties title=""/>
|
||||||
|
<events title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<allmemberslink visible="yes"/>
|
||||||
|
<usedfiles visible="$SHOW_USED_FILES"/>
|
||||||
|
<authorsection visible="yes"/>
|
||||||
|
</class>
|
||||||
|
|
||||||
|
<!-- Layout definition for a namespace page -->
|
||||||
|
<namespace>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<memberdecl>
|
||||||
|
<nestednamespaces visible="yes" title=""/>
|
||||||
|
<constantgroups visible="yes" title=""/>
|
||||||
|
<classes visible="yes" title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<inlineclasses title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<authorsection visible="yes"/>
|
||||||
|
</namespace>
|
||||||
|
|
||||||
|
<!-- Layout definition for a file page -->
|
||||||
|
<file>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<includes visible="$SHOW_INCLUDE_FILES"/>
|
||||||
|
<includegraph visible="$INCLUDE_GRAPH"/>
|
||||||
|
<includedbygraph visible="$INCLUDED_BY_GRAPH"/>
|
||||||
|
<sourcelink visible="yes"/>
|
||||||
|
<memberdecl>
|
||||||
|
<classes visible="yes" title=""/>
|
||||||
|
<namespaces visible="yes" title=""/>
|
||||||
|
<constantgroups visible="yes" title=""/>
|
||||||
|
<defines title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<inlineclasses title=""/>
|
||||||
|
<defines title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<authorsection/>
|
||||||
|
</file>
|
||||||
|
|
||||||
|
<!-- Layout definition for a group page -->
|
||||||
|
<group>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<groupgraph visible="$GROUP_GRAPHS"/>
|
||||||
|
<memberdecl>
|
||||||
|
<nestedgroups visible="yes" title=""/>
|
||||||
|
<dirs visible="yes" title=""/>
|
||||||
|
<files visible="yes" title=""/>
|
||||||
|
<namespaces visible="yes" title=""/>
|
||||||
|
<classes visible="yes" title=""/>
|
||||||
|
<defines title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<enumvalues title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
<signals title=""/>
|
||||||
|
<publicslots title=""/>
|
||||||
|
<protectedslots title=""/>
|
||||||
|
<privateslots title=""/>
|
||||||
|
<events title=""/>
|
||||||
|
<properties title=""/>
|
||||||
|
<friends title=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<pagedocs/>
|
||||||
|
<inlineclasses title=""/>
|
||||||
|
<defines title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<enumvalues title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
<signals title=""/>
|
||||||
|
<publicslots title=""/>
|
||||||
|
<protectedslots title=""/>
|
||||||
|
<privateslots title=""/>
|
||||||
|
<events title=""/>
|
||||||
|
<properties title=""/>
|
||||||
|
<friends title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<authorsection visible="yes"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<!-- Layout definition for a directory page -->
|
||||||
|
<directory>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<directorygraph visible="yes"/>
|
||||||
|
<memberdecl>
|
||||||
|
<dirs visible="yes"/>
|
||||||
|
<files visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription title=""/>
|
||||||
|
</directory>
|
||||||
|
</doxygenlayout>
|
34
custom-doxygen/customdoxygen.css
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/* Custom CSS */
|
||||||
|
|
||||||
|
code {
|
||||||
|
font-family: Monaco,Menlo,Consolas,"Courier New",monospace;
|
||||||
|
background-color: #D8D8D8;
|
||||||
|
padding: 0 0.25em 0 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre.fragment {
|
||||||
|
display: block;
|
||||||
|
font-family: Monaco,Menlo,Consolas,"Courier New",monospace;
|
||||||
|
padding: 1rem;
|
||||||
|
word-break: break-all;
|
||||||
|
word-wrap: break-word;
|
||||||
|
white-space: pre;
|
||||||
|
background-color: #D8D8D8;
|
||||||
|
}
|
||||||
|
|
||||||
|
#projectlogo
|
||||||
|
{
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
#projectname
|
||||||
|
{
|
||||||
|
font: 200% Tahoma, Arial,sans-serif;
|
||||||
|
color: #006469;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#projectbrief
|
||||||
|
{
|
||||||
|
color: #006469;
|
||||||
|
}
|
21
custom-doxygen/footer.html
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<!-- HTML footer for doxygen 1.8.13-->
|
||||||
|
<!-- start footer part -->
|
||||||
|
<!--BEGIN GENERATE_TREEVIEW-->
|
||||||
|
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
||||||
|
<ul>
|
||||||
|
$navpath
|
||||||
|
<li class="footer">$generatedby
|
||||||
|
<a href="http://www.doxygen.org/index.html">
|
||||||
|
<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<!--END GENERATE_TREEVIEW-->
|
||||||
|
<!--BEGIN !GENERATE_TREEVIEW-->
|
||||||
|
<hr class="footer"/><address class="footer"><small>
|
||||||
|
$generatedby  <a href="http://www.doxygen.org/index.html">
|
||||||
|
<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/>
|
||||||
|
</a> $doxygenversion
|
||||||
|
</small></address>
|
||||||
|
<!--END !GENERATE_TREEVIEW-->
|
||||||
|
</body>
|
||||||
|
</html>
|
56
custom-doxygen/header.html
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<!-- HTML header for doxygen 1.8.13-->
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
|
<meta name="generator" content="Doxygen $doxygenversion"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
|
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
|
||||||
|
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="$relpath^jquery.js"></script>
|
||||||
|
<script type="text/javascript" src="$relpath^dynsections.js"></script>
|
||||||
|
$treeview
|
||||||
|
$search
|
||||||
|
$mathjax
|
||||||
|
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
|
$extrastylesheet
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||||
|
|
||||||
|
<!--BEGIN TITLEAREA-->
|
||||||
|
<div id="titlearea">
|
||||||
|
<table cellspacing="0" cellpadding="0">
|
||||||
|
<tbody>
|
||||||
|
<tr style="height: 56px;">
|
||||||
|
<!--BEGIN PROJECT_LOGO-->
|
||||||
|
<td id="projectlogo"><a href="/"><img alt="Logo" src="$relpath^$projectlogo"/></a></td>
|
||||||
|
<!--END PROJECT_LOGO-->
|
||||||
|
<!--BEGIN PROJECT_NAME-->
|
||||||
|
<td id="projectalign" style="padding-left: 0.5em;">
|
||||||
|
<div id="projectname">$projectname
|
||||||
|
<!--BEGIN PROJECT_NUMBER--> <span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER-->
|
||||||
|
</div>
|
||||||
|
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME-->
|
||||||
|
<!--BEGIN PROJECT_BRIEF-->
|
||||||
|
<td style="padding-left: 0.5em;">
|
||||||
|
<div id="projectbrief">$projectbrief</div>
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_BRIEF-->
|
||||||
|
<!--END !PROJECT_NAME-->
|
||||||
|
<!--BEGIN DISABLE_INDEX-->
|
||||||
|
<!--BEGIN SEARCHENGINE-->
|
||||||
|
<td>$searchbox</td>
|
||||||
|
<!--END SEARCHENGINE-->
|
||||||
|
<!--END DISABLE_INDEX-->
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--END TITLEAREA-->
|
||||||
|
<!-- end header part -->
|
9
custom-doxygen/mainpage.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# API Documentation {#index}
|
||||||
|
|
||||||
|
Project ACRN is a flexible and lighweight hypervisor, built with
|
||||||
|
real-time and safety-criticality in mind. It streamlines
|
||||||
|
embedded development through a scalable open source reference platform
|
||||||
|
that addresses embedded developers' needs.
|
||||||
|
|
||||||
|
You can get an alternate view this API material in the [Project ACRN
|
||||||
|
documentation](../).
|
1613
custom-doxygen/standard-doxygen.css
Normal file
BIN
getting_started/images/gsg-bootmenu.png
Normal file
After Width: | Height: | Size: 123 KiB |
BIN
getting_started/images/gsg-sos-console.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
getting_started/images/gsg-successful-boot.png
Normal file
After Width: | Height: | Size: 33 KiB |
387
getting_started/index.rst
Normal file
@ -0,0 +1,387 @@
|
|||||||
|
.. _getting_started:
|
||||||
|
|
||||||
|
Getting Started Guide
|
||||||
|
#####################
|
||||||
|
|
||||||
|
After reading the :ref:`introduction`, use this guide to get started
|
||||||
|
using ACRN in a reference setup. We'll show how to set up your
|
||||||
|
development and target hardware, and then how to boot up the ACRN
|
||||||
|
hypervisor and the `Clear Linux`_ Service OS and Guest OS on the Intel
|
||||||
|
|reg| NUC.
|
||||||
|
|
||||||
|
.. _Clear Linux: https://clearlinux.org
|
||||||
|
|
||||||
|
Hardware setup
|
||||||
|
**************
|
||||||
|
|
||||||
|
The Intel |reg| NUC (NUC6CAYH) is the supported reference target
|
||||||
|
platform for ACRN work, as described in :ref:`hardware`, and is the only
|
||||||
|
platform currently tested with these setup instructions.
|
||||||
|
|
||||||
|
The recommended NUC hardware configuration is:
|
||||||
|
|
||||||
|
- NUC: `NUC Kit
|
||||||
|
NUC6CAYH <https://www.intel.com/content/www/us/en/products/boards-kits/nuc/kits/nuc6cayh.html>`__
|
||||||
|
- `UEFI BIOS (version 0047) <https://downloadcenter.intel.com/product/95062/Intel-NUC-Kit-NUC6CAYH>`__.
|
||||||
|
- Memory: 8G DDR3
|
||||||
|
- SSD: 120G SATA
|
||||||
|
|
||||||
|
Software setup
|
||||||
|
**************
|
||||||
|
|
||||||
|
Firmware update on the NUC
|
||||||
|
==========================
|
||||||
|
|
||||||
|
You may need to update to the latest UEFI firmware for the NUC hardware.
|
||||||
|
Follow these `BIOS Update Instructions
|
||||||
|
<https://www.intel.com/content/www/us/en/support/articles/000005636.html>`__
|
||||||
|
for downloading and flashing an updated BIOS for the NUC.
|
||||||
|
|
||||||
|
Set up a Clear Linux Operating System
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
Currently, an installable version of ARCN does not exist. Therefore, you
|
||||||
|
need to setup a base Clear Linux OS to bootstrap ACRN on the NUC. You'll
|
||||||
|
need a network connection for your NUC to complete this setup.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
ACRN requires Clear Linux version 22140 or newer. The instructions below
|
||||||
|
have been validated with version 22140 and need some adjustment to work
|
||||||
|
with newer versions. You will see a note when the instruction needs to be
|
||||||
|
adjusted.
|
||||||
|
|
||||||
|
#. Download the compressed Clear installer image from
|
||||||
|
https://download.clearlinux.org/releases/22140/clear/clear-22140-installer.img.xz
|
||||||
|
and follow the `Clear Linux installation guide
|
||||||
|
<https://clearlinux.org/documentation/clear-linux/get-started/bare-metal-install>`__
|
||||||
|
as a starting point for installing Clear Linux onto your NUC. Follow the recommended
|
||||||
|
options for choosing an **Automatic** installation type, and using the NUC's
|
||||||
|
storage as the target device for installation (overwriting the existing data
|
||||||
|
and creating three partitions on the NUC's SSD drive).
|
||||||
|
|
||||||
|
#. After installation is complete, boot into Clear Linux, login as
|
||||||
|
**root**, and set a password.
|
||||||
|
|
||||||
|
#. Clear Linux is set to automatically update itself. We recommend that you disable
|
||||||
|
this feature to have more control over when the updates happen. Use this command
|
||||||
|
to disable the autoupdate feature:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# swupd autoupdate --disable
|
||||||
|
|
||||||
|
#. Use the ``swupd bundle-add`` command and add these Clear Linux bundles:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# swupd bundle-add vim network-basic service-os kernel-pk
|
||||||
|
|
||||||
|
.. table:: Clear Linux bundles
|
||||||
|
:widths: auto
|
||||||
|
:name: CL-bundles
|
||||||
|
|
||||||
|
+--------------------+---------------------------------------------------+
|
||||||
|
| Bundle | Description |
|
||||||
|
+====================+===================================================+
|
||||||
|
| vim | vim text editor |
|
||||||
|
+--------------------+---------------------------------------------------+
|
||||||
|
| network-basic | Run network utilities and modify network settings |
|
||||||
|
+--------------------+---------------------------------------------------+
|
||||||
|
| service-os | Add the acrn hypervisor, the acrn devicemodel and |
|
||||||
|
| | Service OS kernel |
|
||||||
|
+--------------------+---------------------------------------------------+
|
||||||
|
| kernel-pk | Run the Intel "PK" kernel(product kernel source) |
|
||||||
|
| | and enterprise-style kernel with backports |
|
||||||
|
+--------------------+---------------------------------------------------+
|
||||||
|
|
||||||
|
Add the ACRN hypervisor to the EFI Partition
|
||||||
|
============================================
|
||||||
|
|
||||||
|
In order to boot the ACRN SOS on the NUC, you'll need to add it to the EFI
|
||||||
|
partition. Follow these steps:
|
||||||
|
|
||||||
|
#. Mount the EFI partition and verify you have the following files:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# mount /dev/sda1 /mnt
|
||||||
|
|
||||||
|
# ls -1 /mnt/EFI/org.clearlinux
|
||||||
|
bootloaderx64.efi
|
||||||
|
kernel-org.clearlinux.native.4.16.6-563
|
||||||
|
kernel-org.clearlinux.pk414-sos.4.14.34-28
|
||||||
|
kernel-org.clearlinux.pk414-standard.4.14.34-28
|
||||||
|
loaderx64.efi
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
The Clear Linux project releases updates often, sometimes
|
||||||
|
twice a day, so make note of the specific kernel versions (``*-sos``
|
||||||
|
and ``*-standard``) listed on your system,
|
||||||
|
as you will need them later.
|
||||||
|
|
||||||
|
#. Put the ``acrn.efi`` hypervisor application (included in the Clear
|
||||||
|
Linux release) on the EFI partition with:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# mkdir /mnt/EFI/acrn
|
||||||
|
# cp /usr/share/acrn/acrn.efi /mnt/EFI/acrn/
|
||||||
|
|
||||||
|
#. Configure the EFI firmware to boot the ACRN hypervisor by default
|
||||||
|
|
||||||
|
The ACRN hypervisor (``acrn.efi``) is an EFI executable
|
||||||
|
loaded directly by the platform EFI firmware. It then in turns loads the
|
||||||
|
Service OS bootloader. Use the ``efibootmgr`` utility to configure the EFI
|
||||||
|
firmware and add a new entry that loads the ACRN hypervisor.
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# efibootmgr -c -l "\EFI\acrn\acrn.efi" -d /dev/sda1 -p 1 -L ACRN
|
||||||
|
# cd /mnt/EFI/org.clearlinux/
|
||||||
|
# cp bootloaderx64.efi bootloaderx64_origin.efi
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
Be aware that a Clearlinux update that includes a kernel upgrade will
|
||||||
|
reset the boot option changes you just made.. A Clearlinux update could
|
||||||
|
happen automatically (if you have
|
||||||
|
not disabled it as described above), if you later install a new
|
||||||
|
bundle to your system, or simply if you decide to trigger an update
|
||||||
|
manually. Whenever that happens, double-check the platform boot order
|
||||||
|
using ``efibootmgr -v`` and modify it if needed.
|
||||||
|
|
||||||
|
#. Create a boot entry for the ACRN Service OS by copying a provided ``acrn.conf``
|
||||||
|
and editing it to account for the kernel versions noted in a previous step.
|
||||||
|
|
||||||
|
It must contain these settings:
|
||||||
|
|
||||||
|
+-----------+----------------------------------------------------------------+
|
||||||
|
| Setting | Description |
|
||||||
|
+===========+================================================================+
|
||||||
|
| title | Text to show in the boot menu |
|
||||||
|
+-----------+----------------------------------------------------------------+
|
||||||
|
| linux | Linux kernel for the Service OS (\*-sos) |
|
||||||
|
+-----------+----------------------------------------------------------------+
|
||||||
|
| options | Options to pass to the Service OS kernel (kernel parameters) |
|
||||||
|
+-----------+----------------------------------------------------------------+
|
||||||
|
|
||||||
|
A starter acrn.conf configuration file is included in the Clear Linux release and is
|
||||||
|
also available in the acrn-hypervisor GitHub repo as `acrn.conf
|
||||||
|
<https://github.com/projectacrn/acrn-hypervisor/tree/master/bsp/uefi/clearlinux/acrn.conf>`__
|
||||||
|
as shown here:
|
||||||
|
|
||||||
|
.. literalinclude:: ../../acrn-hypervisor/bsp/uefi/clearlinux/acrn.conf
|
||||||
|
:caption: acrn-hypervisor/bsp/uefi/clearlinux/acrn.conf
|
||||||
|
|
||||||
|
On the NUC, copy the ``acrn.conf`` file to the EFI partition we mounted earlier:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# cp /usr/share/acrn/demo/acrn.conf /mnt/loader/entries/
|
||||||
|
|
||||||
|
You will need to edit this file to adjust the kernel version (``linux`` section)
|
||||||
|
and also insert the ``PARTUUID`` of your ``/dev/sda3`` partition
|
||||||
|
(``root=PARTUUID=<><UUID of rootfs partition>``) in the ``options`` section.
|
||||||
|
|
||||||
|
Use ``blkid`` to find out what your ``/dev/sda3`` ``PARTUUID`` value is.
|
||||||
|
|
||||||
|
#. Add a timeout period for Systemd-Boot to wait, otherwise it will not
|
||||||
|
present the boot menu and will always boot the base Clear Linux
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# clr-boot-manager set-timeout 20
|
||||||
|
# clr-boot-manager update
|
||||||
|
|
||||||
|
#. Reboot and select "The ACRN Service OS" to boot, as shown in
|
||||||
|
:numref:`gsg-bootmenu`:
|
||||||
|
|
||||||
|
.. figure:: images/gsg-bootmenu.png
|
||||||
|
:align: center
|
||||||
|
:width: 650px
|
||||||
|
:name: gsg-bootmenu
|
||||||
|
|
||||||
|
ACRN Service OS Boot menu
|
||||||
|
|
||||||
|
#. After booting up the ACRN hypervisor, the Service OS will be launched
|
||||||
|
automatically by default, as shown in :numref:`gsg-sos-console`:
|
||||||
|
|
||||||
|
.. figure:: images/gsg-sos-console.png
|
||||||
|
:align: center
|
||||||
|
:name: gsg-sos-console
|
||||||
|
|
||||||
|
Service OS Console
|
||||||
|
|
||||||
|
.. note:: You may need to hit ``Enter`` to get a clean login prompt
|
||||||
|
|
||||||
|
#. From here you can login as root using the password you set previously when
|
||||||
|
you installed Clear Linux.
|
||||||
|
|
||||||
|
Create a Network Bridge
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Without a network bridge, the SOS and UOS are not able to talk to each
|
||||||
|
other.
|
||||||
|
|
||||||
|
A sample `bridge.sh
|
||||||
|
<https://github.com/projectacrn/acrn-devicemodel/tree/master/samples/bridge.sh>`__
|
||||||
|
is included in the Clear Linux release, and
|
||||||
|
is also available in the acrn-devicemodel GitHub repo (in the samples
|
||||||
|
folder) as shown here:
|
||||||
|
|
||||||
|
.. literalinclude:: ../../acrn-devicemodel/samples/bridge.sh
|
||||||
|
:caption: acrn-devicemodel/samples/bridge.sh
|
||||||
|
:language: bash
|
||||||
|
|
||||||
|
By default, the script is located in the ``/usr/share/acrn/demo/``
|
||||||
|
directory. Run it to create a network bridge:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# cd /usr/share/acrn/demo/
|
||||||
|
# ./bridge.sh
|
||||||
|
# cd
|
||||||
|
|
||||||
|
Set up Reference UOS
|
||||||
|
====================
|
||||||
|
|
||||||
|
#. On your NUC, download the pre-built reference Clear Linux UOS image into your
|
||||||
|
(root) home directory:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# cd ~
|
||||||
|
# curl -O https://download.clearlinux.org/releases/22140/clear/clear-22140-kvm.img.xz
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
In case you want to use or try out a newer version of Clear Linux as the UOS, you can
|
||||||
|
download the latest from http://download.clearlinux.org/image. Make sure to adjust the steps
|
||||||
|
described below accordingly (image file name and kernel modules version).
|
||||||
|
|
||||||
|
#. Uncompress it:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# unxz clear-22140-kvm.img.xz
|
||||||
|
|
||||||
|
#. Deploy the UOS kernel modules to UOS virtual disk image (note: you'll need to use
|
||||||
|
the same **standard** image version number noted in step 1 above):
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# losetup -f -P --show /root/clear-22140-kvm.img
|
||||||
|
# mount /dev/loop0p3 /mnt
|
||||||
|
# cp -r /usr/lib/modules/4.14.34-28.pk414-standard /mnt/lib/modules/
|
||||||
|
# umount /mnt
|
||||||
|
# sync
|
||||||
|
|
||||||
|
#. Edit and Run the launch_uos.sh script to launch the UOS.
|
||||||
|
|
||||||
|
A sample `launch_uos.sh
|
||||||
|
<https://github.com/projectacrn/acrn-devicemodel/tree/master/samples/launch_uos.sh>`__
|
||||||
|
is included in the Clear Linux release, and
|
||||||
|
is also available in the acrn-devicemodel GitHub repo (in the samples
|
||||||
|
folder) as shown here:
|
||||||
|
|
||||||
|
.. literalinclude:: ../../acrn-devicemodel/samples/launch_uos.sh
|
||||||
|
:caption: acrn-devicemodel/samples/launch_uos.sh
|
||||||
|
:language: bash
|
||||||
|
:emphasize-lines: 22,24
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
In case you have downloaded a different Clear Linux image than the one above
|
||||||
|
(``clear-22140-kvm.img.xz``), you will need to modify the Clear Linux file name
|
||||||
|
and version number highlighted above (the ``-s 3,virtio-blk`` argument) to match
|
||||||
|
what you have downloaded above. Likewise, you may need to adjust the kernel file
|
||||||
|
name on the second line highlighted (check the exact name to be used using:
|
||||||
|
``ls /usr/lib/kernel/org.clearlinux*-standard*``).
|
||||||
|
|
||||||
|
By default, the script is located in the ``/usr/share/acrn/demo/``
|
||||||
|
directory. You can edit it there, and then run it to launch the User OS:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# cd /usr/share/acrn/demo/
|
||||||
|
# ./launch_uos.sh
|
||||||
|
|
||||||
|
#. At this point, you've successfully booted the ACRN hypervisor,
|
||||||
|
SOS, and UOS:
|
||||||
|
|
||||||
|
.. figure:: images/gsg-successful-boot.png
|
||||||
|
:align: center
|
||||||
|
:name: gsg-successful-boot
|
||||||
|
|
||||||
|
|
||||||
|
Build ACRN from Source
|
||||||
|
**********************
|
||||||
|
|
||||||
|
If you would like to build ACRN hypervisor and device model from source,
|
||||||
|
follow these steps.
|
||||||
|
|
||||||
|
Install build tools and dependencies
|
||||||
|
====================================
|
||||||
|
|
||||||
|
ARCN development is supported on popular Linux distributions,
|
||||||
|
each with their own way to install development tools:
|
||||||
|
|
||||||
|
* On a Clear Linux development system, install the ``os-clr-on-clr`` bundle to get
|
||||||
|
the necessary tools:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ sudo swupd bundle-add os-clr-on-clr
|
||||||
|
|
||||||
|
* On a Ubuntu/Debian development system:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ sudo apt install git \
|
||||||
|
gnu-efi \
|
||||||
|
libssl-dev \
|
||||||
|
libpciaccess-dev \
|
||||||
|
uuid-dev
|
||||||
|
|
||||||
|
* On a Fedora/Redhat development system:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ sudo dnf install gcc \
|
||||||
|
gnu-efi-devel \
|
||||||
|
libuuid-devel \
|
||||||
|
openssl-devel \
|
||||||
|
libpciaccess-devel
|
||||||
|
|
||||||
|
* On a CentOS development system:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ sudo yum install gcc \
|
||||||
|
gnu-efi-devel \
|
||||||
|
libuuid-devel \
|
||||||
|
openssl-devel \
|
||||||
|
libpciaccess-devel
|
||||||
|
|
||||||
|
Build the hypervisor and device model
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
#. Download the ACRN hypervisor and build it.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ git clone https://github.com/projectacrn/acrn-hypervisor
|
||||||
|
$ cd acrn-hypervisor
|
||||||
|
$ make PLATFORM=uefi
|
||||||
|
|
||||||
|
The build results are found in the ``build`` directory.
|
||||||
|
|
||||||
|
#. Download the ACRN device model and build it.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ git clone https://github.com/projectacrn/acrn-devicemodel
|
||||||
|
$ cd acrn-devicemodel
|
||||||
|
$ make
|
||||||
|
|
||||||
|
The build results are found in the ``build`` directory.
|
||||||
|
|
||||||
|
Follow the same instructions to boot and test the images you created
|
||||||
|
from your build.
|
114
glossary.rst
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
:orphan:
|
||||||
|
|
||||||
|
.. _glossary:
|
||||||
|
|
||||||
|
Glossary of Terms
|
||||||
|
#################
|
||||||
|
|
||||||
|
.. glossary::
|
||||||
|
:sorted:
|
||||||
|
|
||||||
|
API
|
||||||
|
Application Program Interface: A defined set of routines and protocols for
|
||||||
|
building application software.
|
||||||
|
|
||||||
|
ACPI
|
||||||
|
Advanced Configuration and Power Interface
|
||||||
|
|
||||||
|
BIOS
|
||||||
|
Basic Input/Output System.
|
||||||
|
|
||||||
|
GPU
|
||||||
|
Graphics Processing Unit
|
||||||
|
|
||||||
|
I2C
|
||||||
|
Inter-Integrated Circuit
|
||||||
|
|
||||||
|
IC
|
||||||
|
Instrument Cluster
|
||||||
|
|
||||||
|
IVE
|
||||||
|
In-Vehicle Experience
|
||||||
|
|
||||||
|
IVI
|
||||||
|
In-vehicle Infotainment
|
||||||
|
|
||||||
|
OS
|
||||||
|
Operating System
|
||||||
|
|
||||||
|
OSPM
|
||||||
|
Operating System Power Management
|
||||||
|
|
||||||
|
PCI
|
||||||
|
Peripheral Component Interface.
|
||||||
|
|
||||||
|
PM
|
||||||
|
Power Management
|
||||||
|
|
||||||
|
Pass-Through Devices
|
||||||
|
Physical devices (typically PCI) exclusively assigned to a guest. In
|
||||||
|
the Project ACRN architecture, pass-through devices are owned by the
|
||||||
|
foreground OS.
|
||||||
|
|
||||||
|
PV
|
||||||
|
Para-virtualization (See
|
||||||
|
https://en.wikipedia.org/wiki/Paravirtualization)
|
||||||
|
|
||||||
|
RSE
|
||||||
|
Rear Seat Entertainment
|
||||||
|
|
||||||
|
SDC
|
||||||
|
Software Defined Cockpit
|
||||||
|
|
||||||
|
SOS
|
||||||
|
Service OS
|
||||||
|
|
||||||
|
UEFI
|
||||||
|
Unified Extensible Firmare Interface. UEFI replaces the
|
||||||
|
traditional BIOS on PCs, while also providing BIOS emulation for
|
||||||
|
backward compatibility. UEFI can run in 32-bit or 64-bit mode and, more
|
||||||
|
important, support Secure Boot, checking the OS validity to ensure no
|
||||||
|
malware has tampered with the boot process.
|
||||||
|
|
||||||
|
UOS
|
||||||
|
User OS (also known as Guest OS)
|
||||||
|
|
||||||
|
VHM
|
||||||
|
Virtio and Hypervisor Service Module
|
||||||
|
|
||||||
|
VM
|
||||||
|
Virtual Machine
|
||||||
|
|
||||||
|
VMM
|
||||||
|
Virtual Machine Monitor
|
||||||
|
|
||||||
|
VMX
|
||||||
|
Virtual Machine Extension
|
||||||
|
|
||||||
|
Virtio-BE
|
||||||
|
Back-End, VirtIO framework provides front-end driver and back-end driver
|
||||||
|
for IO mediators, developer has habit of using Shorthand. So they say
|
||||||
|
Virtio-BE and Virtio-FE
|
||||||
|
|
||||||
|
Virtio-FE
|
||||||
|
Front-End, VirtIO framework provides front-end driver and back-end
|
||||||
|
driver for IO mediators, developer has habit of using Shorthand. So
|
||||||
|
they say Virtio-BE and Virtio-FE
|
||||||
|
|
||||||
|
VT
|
||||||
|
Intel Virtualization Technology
|
||||||
|
|
||||||
|
VT-d
|
||||||
|
Virtualization Technology for Directed I/O
|
||||||
|
|
||||||
|
IDT
|
||||||
|
Interrupt Descriptor Table: a data structure used by the x86
|
||||||
|
architecture to implement an interrupt vector table. The IDT is used
|
||||||
|
to determine the correct response to interrupts and exceptions.
|
||||||
|
|
||||||
|
ISR
|
||||||
|
Interrupt Service Routine: Also known as an interrupt handler, an ISR
|
||||||
|
is a callback function whose execution is triggered by a hardware
|
||||||
|
interrupt (or software interrupt instructions) and is used to handle
|
||||||
|
high-priority conditions that require interrupting the current code
|
||||||
|
executing on the processor.
|
32
hardware.rst
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
.. _hardware:
|
||||||
|
|
||||||
|
Supported Hardware
|
||||||
|
##################
|
||||||
|
|
||||||
|
We welcome community contributions to help build Project ACRN support
|
||||||
|
for a broad collection of architectures and platforms.
|
||||||
|
|
||||||
|
This initial release of Project ACRN has been tested on the following
|
||||||
|
hardware platform.
|
||||||
|
|
||||||
|
Intel Apollo Lake NUC
|
||||||
|
*********************
|
||||||
|
|
||||||
|
* `Intel NUC Kit NUC6CAYH Reference
|
||||||
|
<https://www.intel.com/content/www/us/en/products/boards-kits/nuc/kits/nuc6cayh.html>`_
|
||||||
|
* Intel |reg| Celeron |reg| Processor J3455
|
||||||
|
* Tested NUC with 8GB of RAM and using an 128GB SSD
|
||||||
|
|
||||||
|
You can read a full `AnandTech review`_ of the NUC6CAYH NUC Kit and
|
||||||
|
search online for where to purchase this NUC from `Amazon`_,
|
||||||
|
`SimplyNUC`_, and other vendors. Be sure to purchase the NUC with the
|
||||||
|
recommended memory and storage options noted above.
|
||||||
|
|
||||||
|
.. _AnandTech review:
|
||||||
|
https://www.anandtech.com/show/12295/intel-nuc6cayh-arches-canyon-apollo-lake-ucff-pc-review
|
||||||
|
|
||||||
|
.. _Amazon:
|
||||||
|
https://www.amazon.com/s/ref=nb_sb_noss_2?url=search-alias%3Daps&field-keywords=NUC6CAYH
|
||||||
|
|
||||||
|
.. _SimplyNUC:
|
||||||
|
https://www.simplynuc.com/?s=NUC6CAYH&post_type=product
|
27
howtos/index.rst
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
.. _howtos:
|
||||||
|
|
||||||
|
How-Tos
|
||||||
|
#######
|
||||||
|
|
||||||
|
Our technical documentation for Project ACRN is being developed right
|
||||||
|
along with the features. Here are some how-to technical notes that help
|
||||||
|
explain how you can use ACRN capabilities.
|
||||||
|
|
||||||
|
|
||||||
|
Technical Notes
|
||||||
|
===============
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
tech/*
|
||||||
|
|
||||||
|
Process Notes
|
||||||
|
=============
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
process/*
|
BIN
howtos/process/acrn-doc-fork.png
Normal file
After Width: | Height: | Size: 54 KiB |
219
howtos/process/docbuild.rst
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
.. _acrn_doc:
|
||||||
|
|
||||||
|
ACRN documentation generation
|
||||||
|
#############################
|
||||||
|
|
||||||
|
These instructions will walk you through generating the Project ACRN's
|
||||||
|
documentation and publishing it to https://projectacrn.github.io.
|
||||||
|
You can also use these instructions to generate the ARCN documentation
|
||||||
|
on your local system.
|
||||||
|
|
||||||
|
Documentation overview
|
||||||
|
**********************
|
||||||
|
|
||||||
|
Project ACRN content is written using the reStructuredText markup
|
||||||
|
language (.rst file extension) with Sphinx extensions, and processed
|
||||||
|
using Sphinx to create a formatted stand-alone website. Developers can
|
||||||
|
view this content either in its raw form as .rst markup files, or you
|
||||||
|
can generate the HTML content and view it with a web browser directly on
|
||||||
|
your workstation.
|
||||||
|
|
||||||
|
You can read details about `reStructuredText`_, and `Sphinx`_ from
|
||||||
|
their respective websites.
|
||||||
|
|
||||||
|
The project's documentation contains the following items:
|
||||||
|
|
||||||
|
* ReStructuredText source files used to generate documentation found at the
|
||||||
|
http://projectacrn.github.io website. All of the reStructuredText sources
|
||||||
|
are found in this acrn-documentation repo.
|
||||||
|
|
||||||
|
* Doxygen-generated material used to create all API-specific documents
|
||||||
|
found at http://projectacrn.github.io/api/. Clones of the
|
||||||
|
acrn-hypervisor and acrn-devicemodel repos are also used to access the
|
||||||
|
header files for the the public APIs, but more about that later.
|
||||||
|
|
||||||
|
The reStructuredText files are processed by the Sphinx documentation system,
|
||||||
|
and make use of the breathe extension for including the doxygen-generated API
|
||||||
|
material.
|
||||||
|
|
||||||
|
|
||||||
|
Set up the documentation working folders
|
||||||
|
****************************************
|
||||||
|
|
||||||
|
You'll need git installed to get the working folders set up:
|
||||||
|
|
||||||
|
* For an Ubuntu development system use:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
sudo apt-get install git
|
||||||
|
|
||||||
|
* For a Fedora development system use
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
sudo dnf install git
|
||||||
|
|
||||||
|
Because we need up-to-date header files to generate API docs, doc
|
||||||
|
generation assumes the three repos are cloned as sibling folders.
|
||||||
|
Here's the recommended folder setup for documentation contributions and
|
||||||
|
generation:
|
||||||
|
|
||||||
|
.. code-block: none
|
||||||
|
|
||||||
|
projectacrn/
|
||||||
|
acrn-documentation/
|
||||||
|
acrn-hypervisor/
|
||||||
|
acrn-devicemodel/
|
||||||
|
|
||||||
|
It's best if these folders are ssh clones of your personal forks of the
|
||||||
|
upstream project ACRN repos (though https clones work too):
|
||||||
|
|
||||||
|
#. Use your browser to visit https://github.com/projectacrn. One at a
|
||||||
|
time, visit the **acrn-documentation**, **acrn-hypervisor**, and
|
||||||
|
**acrn-devicemodel** repos and do a fork to your personal GitHub account.
|
||||||
|
|
||||||
|
.. image:: acrn-doc-fork.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
#. At a command prompt, create the working folder and clone the three
|
||||||
|
repositories to your local computer:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
cd ~
|
||||||
|
mkdir projectacrn && cd projectacrn
|
||||||
|
git clone git@github.com:<github-username>/acrn-documentation.git
|
||||||
|
git clone git@github.com:<github-username>/acrn-hypervisor.git
|
||||||
|
git clone git@github.com:<github-username>/acrn-devicemodel.git
|
||||||
|
|
||||||
|
#. For each of the cloned local repos, tell git about the upstream repos:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
cd acrn-documentation
|
||||||
|
git remote add upstream git@github.com:projectacrn/acrn-documentation.git
|
||||||
|
cd ../acrn-hypervisor
|
||||||
|
git remote add upstream git@github.com:projectacrn/acrn-hypervisor.git
|
||||||
|
cd ../acrn-devicemodel
|
||||||
|
git remote add upstream git@github.com:projectacrn/acrn-devicemodel.git
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
#. If you haven't do so already, be sure to configure git with your name
|
||||||
|
and email address for the signed-off-by line in your commit messages:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
git config --global user.name "David Developer"
|
||||||
|
git config --global user.email "david.developer@company.com"
|
||||||
|
|
||||||
|
Installing the documentation tools
|
||||||
|
**********************************
|
||||||
|
|
||||||
|
Our documentation processing has been tested to run with:
|
||||||
|
|
||||||
|
* Python 3.6.3
|
||||||
|
* Doxygen version 1.8.13
|
||||||
|
* Sphinx version 1.6.7
|
||||||
|
* Breathe version 4.7.3
|
||||||
|
* docutils version 0.14
|
||||||
|
* sphinx_rtd_theme version 0.2.4
|
||||||
|
|
||||||
|
Depending on your Linux version, install the needed tools:
|
||||||
|
|
||||||
|
* For Ubuntu use:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
sudo apt-get install doxygen python3-pip python3-wheel make
|
||||||
|
|
||||||
|
* For Fedora use:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
sudo dnf install doxygen python3-pip python3-wheel make
|
||||||
|
|
||||||
|
And for either Linux environment, install the remaining python-based
|
||||||
|
tools:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
cd ~/projectacrn/acrn-documentation
|
||||||
|
pip3 install --user -r scripts/requirements.txt
|
||||||
|
|
||||||
|
And with that you're ready to generate the documentation.
|
||||||
|
|
||||||
|
Documentation presentation theme
|
||||||
|
********************************
|
||||||
|
|
||||||
|
Sphinx supports easy customization of the generated documentation
|
||||||
|
appearance through the use of themes. Replace the theme files and do
|
||||||
|
another ``make htmldocs`` and the output layout and style is changed.
|
||||||
|
The ``read-the-docs`` theme is installed as part of the
|
||||||
|
``requirements.txt`` list above.
|
||||||
|
|
||||||
|
Running the documentation processors
|
||||||
|
************************************
|
||||||
|
|
||||||
|
The acrn-documentation directory has all the .rst source files, extra tools, and Makefile for
|
||||||
|
generating a local copy of the ACRN technical documentation.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
cd ~/projectacrn/acrn-documentation
|
||||||
|
make html
|
||||||
|
|
||||||
|
Depending on your development system, it will take about 15 seconds to
|
||||||
|
collect and generate the HTML content. When done, you can view the HTML
|
||||||
|
output with your browser started at ``~/projectacrn/acrn-documentation/_build/html/index.html``
|
||||||
|
|
||||||
|
Publishing content
|
||||||
|
******************
|
||||||
|
|
||||||
|
If you have push rights to the projectacrn repo called
|
||||||
|
projectacrn.github.io, you can update the public project documentation
|
||||||
|
found at https://projectacrn.github.io.
|
||||||
|
|
||||||
|
You'll need to do a one-time clone the upstream repo:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
git clone git@github.com:projectacrn/projectacrn.github.io.git
|
||||||
|
|
||||||
|
Then, after you've verified the generated HTML from ``make html`` looks
|
||||||
|
good, you can push directly to the publishing site with:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
make publish
|
||||||
|
|
||||||
|
This will delete everything in the publishing repo (in case the new version has
|
||||||
|
deleted files) and push a copy of the newly-generated HTML content
|
||||||
|
directly to the GitHub pages publishing repo. The public site at
|
||||||
|
https://projectacrn.github.io will be updated (nearly) immediately
|
||||||
|
so it's best to verify the locally generated html before publishing.
|
||||||
|
|
||||||
|
Filtering expected warnings
|
||||||
|
***************************
|
||||||
|
|
||||||
|
Alas, there are some known issues with the doxygen/Sphinx/Breathe
|
||||||
|
processing that generates warnings for some constructs, in particular
|
||||||
|
around unnamed structures in nested unions or structs.
|
||||||
|
While these issues are being considered for fixing in
|
||||||
|
Sphinx/Breathe, we've added a post-processing filter on the output of
|
||||||
|
the documentation build process to check for "expected" messages from the
|
||||||
|
generation process output.
|
||||||
|
|
||||||
|
The output from the Sphinx build is processed by the python script
|
||||||
|
``scripts/filter-known-issues.py`` together with a set of filter
|
||||||
|
configuration files in the ``.known-issues/doc`` folder. (This
|
||||||
|
filtering is done as part of the ``Makefile``.)
|
||||||
|
|
||||||
|
If you're contributing components included in the ACRN API
|
||||||
|
documentation and run across these warnings, you can include filtering
|
||||||
|
them out as "expected" warnings by adding a conf file to the
|
||||||
|
``.known-issues/doc`` folder, following the example of other conf files
|
||||||
|
found there.
|
||||||
|
|
||||||
|
.. _reStructuredText: http://sphinx-doc.org/rest.html
|
||||||
|
.. _Sphinx: http://sphinx-doc.org/
|
6
howtos/tech/placeholder.rst
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.. _wip:
|
||||||
|
|
||||||
|
Work in Progress
|
||||||
|
################
|
||||||
|
|
||||||
|
This is a placeholder doc for technical how-to articles in-progress.
|
BIN
images/ACRN-favicon-32x32.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
images/ACRN_Logo_300w.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
images/ACRN_Logo_56h.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
images/ACRNlogo.png
Normal file
After Width: | Height: | Size: 6.5 KiB |
40
index.rst
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
.. _ACRN_home:
|
||||||
|
|
||||||
|
Project ACRN documentation
|
||||||
|
##########################
|
||||||
|
|
||||||
|
Welcome to the Project ACRN (version |version|) documentation.
|
||||||
|
|
||||||
|
For information about the changes and additions for releases, please
|
||||||
|
consult the published :ref:`release_notes` documentation.
|
||||||
|
|
||||||
|
Source code for Project ACRN is maintained in the
|
||||||
|
`Project ACRN GitHub repo`_, and is provided under the BSD 3-clause
|
||||||
|
license.
|
||||||
|
|
||||||
|
.. _BSD 3-clause license:
|
||||||
|
https://github.com/projectacrn/acrn-hypervisor/blob/master/LICENSE
|
||||||
|
|
||||||
|
.. _Project ACRN GitHub repo: https://github.com/projectacrn
|
||||||
|
|
||||||
|
|
||||||
|
Sections
|
||||||
|
********
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
|
||||||
|
introduction/index.rst
|
||||||
|
hardware.rst
|
||||||
|
getting_started/index.rst
|
||||||
|
primer/index.rst
|
||||||
|
howtos/index.rst
|
||||||
|
release_notes.rst
|
||||||
|
contribute.rst
|
||||||
|
api/index.rst
|
||||||
|
|
||||||
|
Indices and Tables
|
||||||
|
******************
|
||||||
|
|
||||||
|
* :ref:`glossary`
|
||||||
|
* :ref:`genindex`
|
BIN
introduction/images/IVI-block.png
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
introduction/images/VMX-brief.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
introduction/images/architecture.png
Normal file
After Width: | Height: | Size: 61 KiB |
BIN
introduction/images/boot-flow.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
introduction/images/device-model.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
introduction/images/device-passthrough.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
introduction/images/io-emulation-path.png
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
introduction/images/virtio-architecture.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
introduction/images/virtio-framework-kernel.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
introduction/images/virtio-framework-userland.png
Normal file
After Width: | Height: | Size: 66 KiB |
573
introduction/index.rst
Normal file
@ -0,0 +1,573 @@
|
|||||||
|
.. _introduction:
|
||||||
|
|
||||||
|
Introduction to Project ACRN
|
||||||
|
############################
|
||||||
|
|
||||||
|
The open source project ACRN defines a device hypervisor reference stack
|
||||||
|
and an architecture for running multiple software subsystems, managed
|
||||||
|
securely, on a consolidated system by means of a virtual machine
|
||||||
|
manager. It also defines a reference framework implementation for
|
||||||
|
virtual device emulation, called the "ACRN Device Model".
|
||||||
|
|
||||||
|
The ACRN Hypervisor is a Type 1 reference hypervisor stack, running
|
||||||
|
directly on the bare-metal hardware, and is suitable for a variety of
|
||||||
|
IoT and embedded device solutions. The ACRN hypervisor addresses the gap
|
||||||
|
that currently exists between datacenter hypervisors, and hard
|
||||||
|
partitioning hypervisors. The ACRN hypervisor architecture partitions
|
||||||
|
the system into different functional domains, with carefully selected
|
||||||
|
guest OS sharing optimizations for IoT and embedded devices.
|
||||||
|
|
||||||
|
Automotive Use Case Example
|
||||||
|
***************************
|
||||||
|
|
||||||
|
An interesting use case example for the ACRN Hypervisor is in an automotive
|
||||||
|
scenario. The ACRN hypervisor can be used for building a Software
|
||||||
|
Defined Cockpit (SDC) or an In-Vehicle Experience (IVE) solution. As a
|
||||||
|
reference implementation, ACRN provides the basis for embedded
|
||||||
|
hypervisor vendors to build solutions with a reference I/O mediation
|
||||||
|
solution.
|
||||||
|
|
||||||
|
In this scenario, an automotive SDC system consists of the Instrument
|
||||||
|
Cluster (IC) system, the In-Vehicle Infotainment (IVI) system, and one
|
||||||
|
or more Rear Seat Entertainment (RSE) systems. Each system is running as
|
||||||
|
an isolated Virtual Machine (VM) for overall system safety
|
||||||
|
considerations.
|
||||||
|
|
||||||
|
An **Instrument Cluster (IC)** system is used to show the driver operational
|
||||||
|
information about the vehicle, such as:
|
||||||
|
|
||||||
|
- the speed, the fuel level, trip mile and other driving information of
|
||||||
|
the car;
|
||||||
|
- projecting heads-up images on the windshield, with alerts for low
|
||||||
|
fuel or tire pressure;
|
||||||
|
- showing rear-view camera, and surround-view for parking assistance.
|
||||||
|
|
||||||
|
An **In-Vehicle Infotainment (IVI)** system's capabilities can include:
|
||||||
|
|
||||||
|
- navigation systems, radios, and other entertainment systems;
|
||||||
|
- connection to mobile devices for phone calls, music, and applications
|
||||||
|
via voice recognition;
|
||||||
|
- control interaction by gesture recognition or touch.
|
||||||
|
|
||||||
|
A **Rear Seat Entertainment (RSE)** system could run:
|
||||||
|
|
||||||
|
- entertainment system;
|
||||||
|
- virtual office;
|
||||||
|
- connection to the front-seat IVI system and mobile devices (cloud
|
||||||
|
connectivity).
|
||||||
|
- connection to mobile devices for phone calls, music, and
|
||||||
|
applications via voice recognition;
|
||||||
|
- control interaction by gesture recognition or touch
|
||||||
|
|
||||||
|
The ACRN hypervisor can support both Linux\* VM and Android\* VM as a
|
||||||
|
User OS, with the User OS managed by the ACRN hypervisor. Developers and
|
||||||
|
OEMs can use this reference stack to run their own VMs, together with
|
||||||
|
IC, IVI, and RSE VMs. The Service OS runs as VM0 (also known as Dom0 in
|
||||||
|
other hypervisors) and the User OS runs as VM1, (also known as DomU).
|
||||||
|
|
||||||
|
:numref:`ivi-block` shows an example block diagram of using the ACRN
|
||||||
|
hypervisor.
|
||||||
|
|
||||||
|
.. figure:: images/IVI-block.png
|
||||||
|
:align: center
|
||||||
|
:name: ivi-block
|
||||||
|
|
||||||
|
Service OS and User OS on top of ACRN hypervisor
|
||||||
|
|
||||||
|
This ACRN hypervisor block diagram shows:
|
||||||
|
|
||||||
|
- The ACRN hypervisor sits right on top of the bootloader for fast
|
||||||
|
booting capabilities.
|
||||||
|
- Partitioning of resources to ensure safety-critical and non-safety
|
||||||
|
critical domains are able to coexist on one platform.
|
||||||
|
- Rich I/O mediators allows various I/O devices shared across VMs, and
|
||||||
|
thus delivers a comprehensive user experience
|
||||||
|
- Multiple operating systems are supported by one SoC through efficient
|
||||||
|
virtualization.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
The yellow color parts in :numref:`ivi-block` are part of the project
|
||||||
|
ACRN software stack. This is a reference architecture diagram and not
|
||||||
|
all features mentioned are fully functional. Other blocks will come from
|
||||||
|
other (open source) projects and are listed here for reference only.
|
||||||
|
|
||||||
|
For example: the Service OS and Linux Guest can come from the Clear
|
||||||
|
Linux project at https://clearlinux.org and (in later updates) the
|
||||||
|
Android as a Guest support can come from https://01.org/android-ia.
|
||||||
|
|
||||||
|
For the current ACRN-supported feature list, please see
|
||||||
|
:ref:`release_notes`.
|
||||||
|
|
||||||
|
Licensing
|
||||||
|
*********
|
||||||
|
.. _BSD-3-Clause: https://opensource.org/licenses/BSD-3-Clause
|
||||||
|
|
||||||
|
Both the ACRN hypervisor and ACRN Device model software are provided
|
||||||
|
under the permissive `BSD-3-Clause`_ license, which allows
|
||||||
|
*"redistribution and use in source and binary forms, with or without
|
||||||
|
modification"* together with the intact copyright notice and
|
||||||
|
disclaimers noted in the license.
|
||||||
|
|
||||||
|
|
||||||
|
ACRN Device Model, Service OS, and User OS
|
||||||
|
******************************************
|
||||||
|
|
||||||
|
To keep the hypervisor code base as small and efficient as possible, the
|
||||||
|
bulk of the device model implementation resides in the Service OS to
|
||||||
|
provide sharing and other capabilities. The details of which devices are
|
||||||
|
shared and the mechanism used for their sharing is described in
|
||||||
|
`pass-through`_ section below.
|
||||||
|
|
||||||
|
The Service OS runs with the system's highest virtual machine priority
|
||||||
|
to ensure required device time-sensitive requirements and system quality
|
||||||
|
of service (QoS). Service OS tasks run with mixed priority. Upon a
|
||||||
|
callback servicing a particular User OS request, the corresponding
|
||||||
|
software (or mediator) in the Service OS inherits the User OS priority.
|
||||||
|
There may also be additional low-priority background tasks within the
|
||||||
|
Service OS.
|
||||||
|
|
||||||
|
In the automotive example we described above, the User OS is the central
|
||||||
|
hub of vehicle control and in-vehicle entertainment. It provides support
|
||||||
|
for radio and entertainment options, control of the vehicle climate
|
||||||
|
control, and vehicle navigation displays. It also provides connectivity
|
||||||
|
options for using USB, Bluetooth, and WiFi for third-party device
|
||||||
|
interaction with the vehicle, such as Android Auto\* or Apple CarPlay*,
|
||||||
|
and many other features.
|
||||||
|
|
||||||
|
Boot Sequence
|
||||||
|
*************
|
||||||
|
|
||||||
|
In :numref:`boot-flow` we show a verified Boot Sequence with UEFI
|
||||||
|
on an Intel |reg| Architecture platform NUC (see :ref:`hardware`).
|
||||||
|
|
||||||
|
.. figure:: images/boot-flow.png
|
||||||
|
:align: center
|
||||||
|
:name: boot-flow
|
||||||
|
|
||||||
|
ACRN Hypervisor Boot Flow
|
||||||
|
|
||||||
|
The Boot process proceeds as follows:
|
||||||
|
|
||||||
|
#. UEFI verifies and boots the ACRN hypervisor and Service OS Bootloader
|
||||||
|
#. UEFI (or Service OS Bootloader) verifies and boots Service OS kernel
|
||||||
|
#. Service OS kernel verifies and loads ACRN Device Model and Virtual
|
||||||
|
bootloader through dm-verity
|
||||||
|
#. Virtual bootloader starts the User-side verified boot process
|
||||||
|
|
||||||
|
|
||||||
|
ACRN Hypervisor Architecture
|
||||||
|
****************************
|
||||||
|
|
||||||
|
ACRN hypervisor is a Type 1 hypervisor, running directly on bare-metal
|
||||||
|
hardware. It implements a hybrid VMM architecture, using a privileged
|
||||||
|
service VM, running the Service OS that manages the I/O devices and
|
||||||
|
provides I/O mediation. Multiple User VMs are supported, with each of
|
||||||
|
them running Linux\* or Android\* OS as the User OS .
|
||||||
|
|
||||||
|
Running systems in separate VMs provides isolation between other VMs and
|
||||||
|
their applications, reducing potential attack surfaces and minimizing
|
||||||
|
safety interference. However, running the systems in separate VMs may
|
||||||
|
introduce additional latency for applications.
|
||||||
|
|
||||||
|
:numref:`ACRN-architecture` shows the ACRN hypervisor architecture, with
|
||||||
|
the automotive example IC VM and service VM together. The Service OS
|
||||||
|
(SOS) owns most of the devices including the platform devices, and
|
||||||
|
provides I/O mediation. Some of the PCIe devices may be passed through
|
||||||
|
to the User OSes via the VM configuration. The SOS runs the IC
|
||||||
|
applications and hypervisor-specific applications together, such as the
|
||||||
|
ACRN device model, and ACRN VM manager.
|
||||||
|
|
||||||
|
ACRN hypervisor also runs the ACRN VM manager to collect running
|
||||||
|
information of the User OS, and controls the User VM such as starting,
|
||||||
|
stopping, and pausing a VM, pausing or resuming a virtual CPU.
|
||||||
|
|
||||||
|
.. figure:: images/architecture.png
|
||||||
|
:align: center
|
||||||
|
:name: ACRN-architecture
|
||||||
|
|
||||||
|
ACRN Hypervisor Architecture
|
||||||
|
|
||||||
|
ACRN hypervisor takes advantage of Intel Virtualization Technology
|
||||||
|
(Intel VT), and ACRN hypervisor runs in Virtual Machine Extension (VMX)
|
||||||
|
root operation, or host mode, or VMM mode. All the guests, including
|
||||||
|
UOS and SOS, run in VMX non-root operation, or guest mode. (Hereafter,
|
||||||
|
we use the terms VMM mode and Guest mode for simplicity).
|
||||||
|
|
||||||
|
The VMM mode has 4 protection rings, but runs the ACRN hypervisor in
|
||||||
|
ring 0 privilege only, leaving rings 1-3 unused. The guest (including
|
||||||
|
SOS & UOS), running in Guest mode, also has its own four protection
|
||||||
|
rings (ring 0 to 3). The User kernel runs in ring 0 of guest mode, and
|
||||||
|
user land applications run in ring 3 of User mode (ring 1 & 2 are
|
||||||
|
usually not used by commercial OSes).
|
||||||
|
|
||||||
|
.. figure:: images/VMX-brief.png
|
||||||
|
:align: center
|
||||||
|
:name: VMX-brief
|
||||||
|
|
||||||
|
VMX Brief
|
||||||
|
|
||||||
|
As shown in :numref:`VMX-brief`, VMM mode and guest mode are switched
|
||||||
|
through VM Exit and VM Entry. When the bootloader hands off control to
|
||||||
|
the ACRN hypervisor, the processor hasn't enabled VMX operation yet. The
|
||||||
|
ACRN hypervisor needs to enable VMX operation thru a VMXON instruction
|
||||||
|
first. Initially, the processor stays in VMM mode when the VMX operation
|
||||||
|
is enabled. It enters guest mode thru a VM resume instruction (or first
|
||||||
|
time VM launch), and returns back to VMM mode thru a VM exit event. VM
|
||||||
|
exit occurs in response to certain instructions and events.
|
||||||
|
|
||||||
|
The behavior of processor execution in guest mode is controlled by a
|
||||||
|
virtual machine control structure (VMCS). VMCS contains the guest state
|
||||||
|
(loaded at VM Entry, and saved at VM Exit), the host state, (loaded at
|
||||||
|
the time of VM exit), and the guest execution controls. ACRN hypervisor
|
||||||
|
creates a VMCS data structure for each virtual CPU, and uses the VMCS to
|
||||||
|
configure the behavior of the processor running in guest mode.
|
||||||
|
|
||||||
|
When the execution of the guest hits a sensitive instruction, a VM exit
|
||||||
|
event may happen as defined in the VMCS configuration. Control goes back
|
||||||
|
to the ACRN hypervisor when the VM exit happens. The ACRN hypervisor
|
||||||
|
emulates the guest instruction (if the exit was due to privilege issue)
|
||||||
|
and resumes the guest to its next instruction, or fixes the VM exit
|
||||||
|
reason (for example if a guest memory page is not mapped yet) and resume
|
||||||
|
the guest to re-execute the instruction.
|
||||||
|
|
||||||
|
Note that the address space used in VMM mode is different from that in
|
||||||
|
guest mode. The guest mode and VMM mode use different memory mapping
|
||||||
|
tables, and therefore the ACRN hypervisor is protected from guest
|
||||||
|
access. The ACRN hypervisor uses EPT to map the guest address, using the
|
||||||
|
guest page table to map from guest linear address to guest physical
|
||||||
|
address, and using the EPT table to map from guest physical address to
|
||||||
|
machine physical address or host physical address (HPA).
|
||||||
|
|
||||||
|
ACRN Device Model Architecture
|
||||||
|
******************************
|
||||||
|
|
||||||
|
Because devices may need to be shared between VMs, device emulation is
|
||||||
|
used to give VM applications (and OSes) access to these shared devices.
|
||||||
|
Traditionally there are three architectural approaches to device
|
||||||
|
emulation:
|
||||||
|
|
||||||
|
* The first architecture is **device emulation within the hypervisor** which
|
||||||
|
is a common method implemented within the VMware\* workstation product
|
||||||
|
(an operating system-based hypervisor). In this method, the hypervisor
|
||||||
|
includes emulations of common devices that the various guest operating
|
||||||
|
systems can share, including virtual disks, virtual network adapters,
|
||||||
|
and other necessary platform elements.
|
||||||
|
|
||||||
|
* The second architecture is called **user space device emulation**. As the
|
||||||
|
name implies, rather than the device emulation being embedded within
|
||||||
|
the hypervisor, it is instead implemented in a separate user space
|
||||||
|
application. QEMU, for example, provides this kind of device emulation
|
||||||
|
also used by a large number of independent hypervisors. This model is
|
||||||
|
advantageous, because the device emulation is independent of the
|
||||||
|
hypervisor and can therefore be shared for other hypervisors. It also
|
||||||
|
permits arbitrary device emulation without having to burden the
|
||||||
|
hypervisor (which operates in a privileged state) with this
|
||||||
|
functionality.
|
||||||
|
|
||||||
|
* The third variation on hypervisor-based device emulation is
|
||||||
|
**paravirtualized (PV) drivers**. In this model introduced by the `XEN
|
||||||
|
project`_ the hypervisor includes the physical drivers, and each guest
|
||||||
|
operating system includes a hypervisor-aware driver that works in
|
||||||
|
concert with the hypervisor drivers.
|
||||||
|
|
||||||
|
.. _XEN project:
|
||||||
|
https://wiki.xenproject.org/wiki/Understanding_the_Virtualization_Spectrum
|
||||||
|
|
||||||
|
In the device emulation models discussed above, there's a price to pay
|
||||||
|
for sharing devices. Whether device emulation is performed in the
|
||||||
|
hypervisor, or in user space within an independent VM, overhead exists.
|
||||||
|
This overhead is worthwhile as long as the devices need to be shared by
|
||||||
|
multiple guest operating systems. If sharing is not necessary, then
|
||||||
|
there are more efficient methods for accessing devices, for example
|
||||||
|
"pass-through".
|
||||||
|
|
||||||
|
ACRN device model is a placeholder of the UOS. It allocates memory for
|
||||||
|
the User OS, configures and initializes the devices used by the UOS,
|
||||||
|
loads the virtual firmware, initializes the virtual CPU state, and
|
||||||
|
invokes the ACRN hypervisor service to execute the guest instructions.
|
||||||
|
ACRN Device model is an application running in the Service OS that
|
||||||
|
emulates devices based on command line configuration, as shown in
|
||||||
|
the architecture diagram :numref:`device-model` below:
|
||||||
|
|
||||||
|
.. figure:: images/device-model.png
|
||||||
|
:align: center
|
||||||
|
:name: device-model
|
||||||
|
|
||||||
|
ACRN Device Model
|
||||||
|
|
||||||
|
ACRN Device model incorporates these three aspects:
|
||||||
|
|
||||||
|
**Device Emulation**:
|
||||||
|
ACRN Device model provides device emulation routines that register
|
||||||
|
their I/O handlers to the I/O dispatcher. When there is an I/O request
|
||||||
|
from the User OS device, the I/O dispatcher sends this request to the
|
||||||
|
corresponding device emulation routine.
|
||||||
|
|
||||||
|
**I/O Path**:
|
||||||
|
see `ACRN-io-mediator`_ below
|
||||||
|
|
||||||
|
**VHM**:
|
||||||
|
The Virtio and Hypervisor Service Module is a kernel module in the
|
||||||
|
Service OS acting as a middle layer to support the device model. The VHM
|
||||||
|
and its client handling flow is described below:
|
||||||
|
|
||||||
|
#. ACRN hypervisor IOREQ is forwarded to the VHM by an upcall
|
||||||
|
notification to the SOS.
|
||||||
|
#. VHM will mark the IOREQ as "in process" so that the same IOREQ will
|
||||||
|
not pick up again. The IOREQ will be sent to the client for handling.
|
||||||
|
Meanwhile, the VHM is ready for another IOREQ.
|
||||||
|
#. IOREQ clients are either an SOS Userland application or a Service OS
|
||||||
|
Kernel space module. Once the IOREQ is processed and completed, the
|
||||||
|
Client will issue an IOCTL call to the VHM to notify an IOREQ state
|
||||||
|
change. The VHM then checks and hypercalls to ACRN hypervisor
|
||||||
|
notifying it that the IOREQ has completed.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
Userland: dm as ACRN Device Model.
|
||||||
|
|
||||||
|
Kernel space: VBS-K, MPT Service, VHM itself
|
||||||
|
|
||||||
|
.. _pass-through:
|
||||||
|
|
||||||
|
Device pass through
|
||||||
|
*******************
|
||||||
|
|
||||||
|
At the highest level, device pass-through is about providing isolation
|
||||||
|
of a device to a given guest operating system so that the device can be
|
||||||
|
used exclusively by that guest.
|
||||||
|
|
||||||
|
.. figure:: images/device-passthrough.png
|
||||||
|
:align: center
|
||||||
|
:name: device-passthrough
|
||||||
|
|
||||||
|
Device Passthrough
|
||||||
|
|
||||||
|
Near-native performance can be achieved by using device passthrough.
|
||||||
|
This is ideal for networking applications (or those with high disk I/O
|
||||||
|
needs) that have not adopted virtualization because of contention and
|
||||||
|
performance degradation through the hypervisor (using a driver in the
|
||||||
|
hypervisor or through the hypervisor to a user space emulation).
|
||||||
|
Assigning devices to specific guests is also useful when those devices
|
||||||
|
inherently wouldn't be shared. For example, if a system includes
|
||||||
|
multiple video adapters, those adapters could be passed through to
|
||||||
|
unique guest domains.
|
||||||
|
|
||||||
|
Finally, there may be specialized PCI devices that only one guest domain
|
||||||
|
uses, so they should be passed through to the guest. Individual USB
|
||||||
|
ports could be isolated to a given domain too, or a serial port (which
|
||||||
|
is itself not shareable) could be isolated to a particular guest. In
|
||||||
|
ACRN hypervisor, we support USB controller Pass through only and we
|
||||||
|
don't support pass through for a legacy serial port, (for example
|
||||||
|
0x3f8).
|
||||||
|
|
||||||
|
|
||||||
|
Hardware support for device passthrough
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
Intel's current processor architectures provides support for device
|
||||||
|
pass-through with VT-d. VT-d maps guest physical address to machine
|
||||||
|
physical address, so device can use guest physical address directly.
|
||||||
|
When this mapping occurs, the hardware takes care of access (and
|
||||||
|
protection), and the guest operating system can use the device as if it
|
||||||
|
were a non-virtualized system. In addition to mapping guest to physical
|
||||||
|
memory, isolation prevents this device from accessing memory belonging
|
||||||
|
to other guests or the hypervisor.
|
||||||
|
|
||||||
|
Another innovation that helps interrupts scale to large numbers of VMs
|
||||||
|
is called Message Signaled Interrupts (MSI). Rather than relying on
|
||||||
|
physical interrupt pins to be associated with a guest, MSI transforms
|
||||||
|
interrupts into messages that are more easily virtualized (scaling to
|
||||||
|
thousands of individual interrupts). MSI has been available since PCI
|
||||||
|
version 2.2 but is also available in PCI Express (PCIe), where it allows
|
||||||
|
fabrics to scale to many devices. MSI is ideal for I/O virtualization,
|
||||||
|
as it allows isolation of interrupt sources (as opposed to physical pins
|
||||||
|
that must be multiplexed or routed through software).
|
||||||
|
|
||||||
|
Hypervisor support for device passthrough
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
By using the latest virtualization-enhanced processor architectures,
|
||||||
|
hypervisors and virtualization solutions can support device
|
||||||
|
pass-through (using VT-d), including Xen, KVM, and ACRN hypervisor.
|
||||||
|
In most cases, the guest operating system (User
|
||||||
|
OS) must be compiled to support pass-through, by using
|
||||||
|
kernel build-time options. Hiding the devices from the host VM may also
|
||||||
|
be required (as is done with Xen using pciback). Some restrictions apply
|
||||||
|
in PCI, for example, PCI devices behind a PCIe-to-PCI bridge must be
|
||||||
|
assigned to the same guest OS. PCIe does not have this restriction.
|
||||||
|
|
||||||
|
.. _ACRN-io-mediator:
|
||||||
|
|
||||||
|
ACRN I/O mediator
|
||||||
|
*****************
|
||||||
|
|
||||||
|
:numref:`io-emulation-path` shows the flow of an example I/O emulation path.
|
||||||
|
|
||||||
|
.. figure:: images/io-emulation-path.png
|
||||||
|
:align: center
|
||||||
|
:name: io-emulation-path
|
||||||
|
|
||||||
|
I/O Emulation Path
|
||||||
|
|
||||||
|
Following along with the numbered items in :numref:`io-emulation-path`:
|
||||||
|
|
||||||
|
1. When a guest execute an I/O instruction (PIO or MMIO), a VM exit happens.
|
||||||
|
ACRN hypervisor takes control, and analyzes the the VM
|
||||||
|
exit reason, which is a VMX_EXIT_REASON_IO_INSTRUCTION for PIO access.
|
||||||
|
2. ACRN hypervisor fetches and analyzes the guest instruction, and
|
||||||
|
notices it is a PIO instruction (``in AL, 20h`` in this example), and put
|
||||||
|
the decoded information (including the PIO address, size of access,
|
||||||
|
read/write, and target register) into the shared page, and
|
||||||
|
notify/interrupt the SOS to process.
|
||||||
|
3. The Virtio and hypervisor service module (VHM) in SOS receives the
|
||||||
|
interrupt, and queries the IO request ring to get the PIO instruction
|
||||||
|
details.
|
||||||
|
4. It checks to see if any kernel device claims
|
||||||
|
ownership of the IO port: if a kernel module claimed it, the kernel
|
||||||
|
module is activated to execute its processing APIs. Otherwise, the VHM
|
||||||
|
module leaves the IO request in the shared page and wakes up the
|
||||||
|
device model thread to process.
|
||||||
|
5. The ACRN device model follow the same mechanism as the VHM. The I/O
|
||||||
|
processing thread of device model queries the IO request ring to get the
|
||||||
|
PIO instruction details and checks to see if any (guest) device emulation
|
||||||
|
module claims ownership of the IO port: if a module claimed it,
|
||||||
|
the module is invoked to execute its processing APIs.
|
||||||
|
6. After the ACRN device module completes the emulation (port IO 20h access
|
||||||
|
in this example), (say uDev1 here), uDev1 puts the result into the
|
||||||
|
shared page (in register AL in this example).
|
||||||
|
7. ACRN device model then returns control to ACRN hypervisor to indicate the
|
||||||
|
completion of an IO instruction emulation, typically thru VHM/hypercall.
|
||||||
|
8. The ACRN hypervisor then knows IO emulation is complete, and copies
|
||||||
|
the result to the guest register context.
|
||||||
|
9. The ACRN hypervisor finally advances the guest IP to
|
||||||
|
indicate completion of instruction execution, and resumes the guest.
|
||||||
|
|
||||||
|
The MMIO path is very similar, except the VM exit reason is different. MMIO
|
||||||
|
access usually is trapped thru VMX_EXIT_REASON_EPT_VIOLATION in
|
||||||
|
the hypervisor.
|
||||||
|
|
||||||
|
Virtio framework architecture
|
||||||
|
*****************************
|
||||||
|
|
||||||
|
.. _Virtio spec:
|
||||||
|
http://docs.oasis-open.org/virtio/virtio/v1.0/virtio-v1.0.html
|
||||||
|
|
||||||
|
Virtio is an abstraction for a set of common emulated devices in any
|
||||||
|
type of hypervisor. In the ACRN reference stack, our
|
||||||
|
implementation is compatible with `Virtio spec`_ 0.9 and 1.0. By
|
||||||
|
following this spec, virtual environments and guests
|
||||||
|
should have a straightforward, efficient, standard and extensible
|
||||||
|
mechanism for virtual devices, rather than boutique per-environment or
|
||||||
|
per-OS mechanisms.
|
||||||
|
|
||||||
|
Virtio provides a common frontend driver framework which not only
|
||||||
|
standardizes device interfaces, but also increases code reuse across
|
||||||
|
different virtualization platforms.
|
||||||
|
|
||||||
|
.. figure:: images/virtio-architecture.png
|
||||||
|
:align: center
|
||||||
|
:name: virtio-architecture
|
||||||
|
|
||||||
|
Virtio Architecture
|
||||||
|
|
||||||
|
To better understand Virtio, especially its usage in
|
||||||
|
the ACRN project, several key concepts of Virtio are highlighted
|
||||||
|
here:
|
||||||
|
|
||||||
|
**Front-End Virtio driver** (a.k.a. frontend driver, or FE driver in this document)
|
||||||
|
Virtio adopts a frontend-backend architecture, which enables a simple
|
||||||
|
but flexible framework for both frontend and backend Virtio driver. The
|
||||||
|
FE driver provides APIs to configure the interface, pass messages, produce
|
||||||
|
requests, and notify backend Virtio driver. As a result, the FE driver
|
||||||
|
is easy to implement and the performance overhead of emulating device is
|
||||||
|
eliminated.
|
||||||
|
|
||||||
|
**Back-End Virtio driver** (a.k.a. backend driver, or BE driver in this document)
|
||||||
|
Similar to FE driver, the BE driver, runs either in user-land or
|
||||||
|
kernel-land of host OS. The BE driver consumes requests from FE driver
|
||||||
|
and send them to the host's native device driver. Once the requests are
|
||||||
|
done by the host native device driver, the BE driver notifies the FE
|
||||||
|
driver about the completeness of the requests.
|
||||||
|
|
||||||
|
**Straightforward**: Virtio devices as standard devices on existing Buses
|
||||||
|
Instead of creating new device buses from scratch, Virtio devices are
|
||||||
|
built on existing buses. This gives a straightforward way for both FE
|
||||||
|
and BE drivers to interact with each other. For example, FE driver could
|
||||||
|
read/write registers of the device, and the virtual device could
|
||||||
|
interrupt FE driver, on behalf of the BE driver, in case of something is
|
||||||
|
happening. Currently Virtio supports PCI/PCIe bus and MMIO bus. In
|
||||||
|
ACRN project, only PCI/PCIe bus is supported, and all the Virtio devices
|
||||||
|
share the same vendor ID 0x1AF4.
|
||||||
|
|
||||||
|
**Efficient**: batching operation is encouraged
|
||||||
|
Batching operation and deferred notification are important to achieve
|
||||||
|
high-performance I/O, since notification between FE and BE driver
|
||||||
|
usually involves an expensive exit of the guest. Therefore batching
|
||||||
|
operating and notification suppression are highly encouraged if
|
||||||
|
possible. This will give an efficient implementation for the performance
|
||||||
|
critical devices.
|
||||||
|
|
||||||
|
**Standard: virtqueue**
|
||||||
|
All the Virtio devices share a standard ring buffer and descriptor
|
||||||
|
mechanism, called a virtqueue, shown in Figure 6. A virtqueue
|
||||||
|
is a queue of scatter-gather buffers. There are three important
|
||||||
|
methods on virtqueues:
|
||||||
|
|
||||||
|
* ``add_buf`` is for adding a request/response buffer in a virtqueue
|
||||||
|
* ``get_buf`` is for getting a response/request in a virtqueue, and
|
||||||
|
* ``kick`` is for notifying the other side for a virtqueue to
|
||||||
|
consume buffers.
|
||||||
|
|
||||||
|
The virtqueues are created in guest physical memory by the FE drivers.
|
||||||
|
The BE drivers only need to parse the virtqueue structures to obtain
|
||||||
|
the requests and get the requests done. How virtqueue is organized is
|
||||||
|
specific to the User OS. In the implementation of Virtio in Linux, the
|
||||||
|
virtqueue is implemented as a ring buffer structure called vring.
|
||||||
|
|
||||||
|
In ACRN, the virtqueue APIs can be leveraged
|
||||||
|
directly so users don't need to worry about the details of the
|
||||||
|
virtqueue. Refer to the User OS for
|
||||||
|
more details about the virtqueue implementations.
|
||||||
|
|
||||||
|
**Extensible: feature bits**
|
||||||
|
A simple extensible feature negotiation mechanism exists for each virtual
|
||||||
|
device and its driver. Each virtual device could claim its
|
||||||
|
device specific features while the corresponding driver could respond to
|
||||||
|
the device with the subset of features the driver understands. The
|
||||||
|
feature mechanism enables forward and backward compatibility for the
|
||||||
|
virtual device and driver.
|
||||||
|
|
||||||
|
In the ACRN reference stack, we implement user-land and kernel
|
||||||
|
space as shown in :numref:`virtio-framework-userland`:
|
||||||
|
|
||||||
|
.. figure:: images/virtio-framework-userland.png
|
||||||
|
:align: center
|
||||||
|
:name: virtio-framework-userland
|
||||||
|
|
||||||
|
Virtio Framework - User Land
|
||||||
|
|
||||||
|
In the Virtio user-land framework, the implementation is compatible with
|
||||||
|
Virtio Spec 0.9/1.0. The VBS-U is statically linked with Device Model,
|
||||||
|
and communicates with Device Model through the PCIe interface: PIO/MMIO
|
||||||
|
or MSI/MSIx. VBS-U accesses Virtio APIs through user space vring service
|
||||||
|
API helpers. User space vring service API helpers access shared ring
|
||||||
|
through remote memory map (mmap). VHM maps UOS memory with the help of
|
||||||
|
ACRN Hypervisor.
|
||||||
|
|
||||||
|
.. figure:: images/virtio-framework-kernel.png
|
||||||
|
:align: center
|
||||||
|
:name: virtio-framework-kernel
|
||||||
|
|
||||||
|
Virtio Framework - Kernel Space
|
||||||
|
|
||||||
|
VBS-U offloads data plane processing to VBS-K. VBS-U initializes VBS-K
|
||||||
|
at the right timings, for example. The FE driver sets
|
||||||
|
VIRTIO_CONFIG_S_DRIVER_OK to avoid unnecessary device configuration
|
||||||
|
changes while running. VBS-K can access shared rings through VBS-K
|
||||||
|
virtqueue APIs. VBS-K virtqueue APIs are similar to VBS-U virtqueue
|
||||||
|
APIs. VBS-K registers as VHM client(s) to handle a continuous range of
|
||||||
|
registers
|
||||||
|
|
||||||
|
There may be one or more VHM-clients for each VBS-K, and there can be a
|
||||||
|
single VHM-client for all VBS-Ks as well. VBS-K notifies FE through VHM
|
||||||
|
interrupt APIs.
|
66
introduction/index.rst.sav
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
.. _introduction:
|
||||||
|
|
||||||
|
Introducing Project ACRN
|
||||||
|
########################
|
||||||
|
|
||||||
|
The open source project ACRN, defines a device hypervisor reference
|
||||||
|
stack and an architecture for running multiple software subsystems,
|
||||||
|
managed securely, on a consolidated system by means of a virtual machine
|
||||||
|
manager. It also defines a reference framework implementation for
|
||||||
|
virtual device emulation, called the “ACRN Device Model”.
|
||||||
|
|
||||||
|
The ACRN Hypervisor is a Type 1 reference hypervisor stack, running
|
||||||
|
directly on the bare-metal hardware, and is suitable for a variety of
|
||||||
|
IoT and embedded device solutions. The ACRN hypervisor addresses the gap
|
||||||
|
that currently exists between datacenter hypervisors, and hard
|
||||||
|
partitioning hypervisors. The ACRN hypervisor architecture partitions
|
||||||
|
the system into different functional domains, with carefully selected
|
||||||
|
guest OS sharing optimiztionsfor IoT and embedded devices.
|
||||||
|
|
||||||
|
Automotive use case scenario
|
||||||
|
****************************
|
||||||
|
|
||||||
|
A good use case example for the ACRN Hypervisor is in an automotive
|
||||||
|
scenario. The ACRN hypervisor can be used for building a Software
|
||||||
|
Defined Cockpit (SDC) or an In-Vehicle Experience (IVE) solution. As a
|
||||||
|
reference implementation, Project ACRN provides the basis for embedded
|
||||||
|
hypervisor vendors to build solutions with a reference I/O mediation
|
||||||
|
solution.
|
||||||
|
|
||||||
|
For example, an automotive SDC system consists of the Instrument Cluster
|
||||||
|
(IC) system, the In-Vehicle Infotainment (IVI) system, and one or more
|
||||||
|
Rear Seat Entertainment (RSE) systems. Each system can run on the same
|
||||||
|
hardware as isolated Virtual Machines (VM), for overall system safety
|
||||||
|
considerations.
|
||||||
|
|
||||||
|
An **Instrument Cluster (IC)** system is used to show the driver operational
|
||||||
|
information about the vehicle, such as:
|
||||||
|
|
||||||
|
* the speed, the fuel level, trip mile and other driving information
|
||||||
|
of the car;
|
||||||
|
* projecting heads-up images on the windshield, with alerts for low
|
||||||
|
fuel or tire pressure;
|
||||||
|
* showing rear-view camera, and surround-view for parking assistance.
|
||||||
|
|
||||||
|
An **In-Vehicle Infotainment (IVI)** system's capabilities can include:
|
||||||
|
|
||||||
|
* navigation systems, radios, and other entertainment systems;
|
||||||
|
* connection to mobile devices for phone calls, music, and
|
||||||
|
applications via voice recognition;
|
||||||
|
* control interaction by gesture recognition or touch.
|
||||||
|
|
||||||
|
A **Rear Seat Entertainment (RSE)** system could run:
|
||||||
|
|
||||||
|
* entertainment system;
|
||||||
|
* virtual office;
|
||||||
|
* connection to the front-seat IVI system and mobile devices (cloud
|
||||||
|
connectivity).
|
||||||
|
* connection to mobile devices for phone calls, music, and
|
||||||
|
applications via voice recognition;
|
||||||
|
* control interaction by gesture recognition or touch
|
||||||
|
|
||||||
|
The ACRN hypervisor supports both Linux* VM and Android* VM as a User
|
||||||
|
OS, with the User OS managed by the ACRN hypervisor. Developers and OEMs
|
||||||
|
can use this reference stack to run their own VMs, together with the IC,
|
||||||
|
IVI, and RSE VMs. The Service OS runs as VM0, (also known as Dom0 in
|
||||||
|
other hypervisors), and the User OS runs as VM1, (also known as DomU).
|
BIN
primer/images/primer-dma-address-mapping.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
primer/images/primer-host-gdt.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
primer/images/primer-hypervisor-interrupt.png
Normal file
After Width: | Height: | Size: 85 KiB |
BIN
primer/images/primer-mem-layout.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
primer/images/primer-pirq-routing.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
primer/images/primer-pv-mapping.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
primer/images/primer-sos-ept-mapping.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
primer/images/primer-symmetric-io.png
Normal file
After Width: | Height: | Size: 89 KiB |
BIN
primer/images/primer-uos-ept-mapping.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
primer/images/primer-virtio-net.png
Normal file
After Width: | Height: | Size: 73 KiB |
903
primer/index.rst
Normal file
@ -0,0 +1,903 @@
|
|||||||
|
.. _primer:
|
||||||
|
|
||||||
|
Developer Primer
|
||||||
|
################
|
||||||
|
|
||||||
|
This Developer Primer introduces the fundamental components of ACRN and
|
||||||
|
the virtualization technology used by this open source reference stack.
|
||||||
|
Code level documentation and additional details can be found by
|
||||||
|
consulting the :ref:`acrn_apis` documentation and the `source code in
|
||||||
|
GitHub`_.
|
||||||
|
|
||||||
|
.. _source code in GitHub: https://github.com/projectacrn
|
||||||
|
|
||||||
|
The ACRN Hypervisor acts as a host with full control of the processor(s)
|
||||||
|
and the hardware (physical memory, interrupt management and I/O). It
|
||||||
|
provides the User OS with an abstraction of a virtual platform, allowing
|
||||||
|
the guest to behave as if were executing directly on a logical
|
||||||
|
processor.
|
||||||
|
|
||||||
|
.. _source tree structure:
|
||||||
|
|
||||||
|
Source Tree Structure
|
||||||
|
*********************
|
||||||
|
|
||||||
|
Understanding the ACRN hypervisor and the ACRN device model source tree
|
||||||
|
structure is helpful for locating the code associated with a particular
|
||||||
|
hypervisor and device emulation feature. The ACRN hypervisor and the
|
||||||
|
ACRN device model source tree provides the following top-level
|
||||||
|
directories:
|
||||||
|
|
||||||
|
ACRN hypervisor source tree
|
||||||
|
===========================
|
||||||
|
|
||||||
|
**arch/x86/**
|
||||||
|
hypervisor architecture, which includes arch x86 related source files
|
||||||
|
to run the hypervisor, such as CPU, memory, interrupt, and VMX.
|
||||||
|
|
||||||
|
**boot/**
|
||||||
|
boot stuff mainly including ACPI related
|
||||||
|
|
||||||
|
**bsp/**
|
||||||
|
board support package, used to support NUC with UEFI
|
||||||
|
|
||||||
|
**common/**
|
||||||
|
common source files for hypervisor, which including VM hypercall
|
||||||
|
definition, VM main loop, and VM software loader
|
||||||
|
|
||||||
|
**debug/**
|
||||||
|
all debug related source files, which will not be compiled for
|
||||||
|
release version, mainly including console, uart, logmsg and shell
|
||||||
|
|
||||||
|
**include/**
|
||||||
|
include files for all public APIs (doxygen comments in these source
|
||||||
|
files are used to generate the :ref:`acrn_apis` documentation)
|
||||||
|
|
||||||
|
**lib/**
|
||||||
|
runtime service libraries
|
||||||
|
|
||||||
|
ACRN Device Model source tree
|
||||||
|
=============================
|
||||||
|
|
||||||
|
**core/**
|
||||||
|
ACRN Device model core logic (main loop, SOS interface, etc.)
|
||||||
|
|
||||||
|
**hw/**
|
||||||
|
Hardware emulation code, with the following subdirectories:
|
||||||
|
|
||||||
|
**acpi/**
|
||||||
|
ACPI table generator.
|
||||||
|
|
||||||
|
**pci/**
|
||||||
|
PCI devices, including VBS-Us (Virtio backend drivers in user-space).
|
||||||
|
|
||||||
|
**platform/**
|
||||||
|
platform devices such as uart, and keyboard.
|
||||||
|
|
||||||
|
**include/**
|
||||||
|
include files for all public APIs (doxygen comments in these source
|
||||||
|
files are used to generate the :ref:`acrn_apis` documentation)
|
||||||
|
|
||||||
|
**samples/**
|
||||||
|
include files for all public APIs (doxygen comments in these source
|
||||||
|
|
||||||
|
ACRN documentation source tree
|
||||||
|
==============================
|
||||||
|
|
||||||
|
Project ACRN documentation is written using the reStructuredText markup
|
||||||
|
language (.rst file extension) with Sphinx extensions, and processed
|
||||||
|
using Sphinx to create a formatted stand-alone website, (the one you're
|
||||||
|
reading now.) Developers can view this content either in its raw form as
|
||||||
|
.rst markup files in the acrn-documentation repo, or you can generate
|
||||||
|
the HTML content and view it with a web browser directly on your
|
||||||
|
workstation, useful if you're contributing documentation to the project.
|
||||||
|
|
||||||
|
**api/**
|
||||||
|
ReST files for API document generation
|
||||||
|
|
||||||
|
**custom-doxygen/**
|
||||||
|
Customization files for doxygen-generated html output (while
|
||||||
|
generated, we currently don't include the doxygen html output but do use
|
||||||
|
the XML output to feed into the Sphinx-generation process)
|
||||||
|
|
||||||
|
**getting_started/**
|
||||||
|
ReST files and images for the Getting Started Guide
|
||||||
|
|
||||||
|
**primer/**
|
||||||
|
ReST files and images for the Developer Primer
|
||||||
|
|
||||||
|
**images/**
|
||||||
|
Image files not specific to a document (logos, and such)
|
||||||
|
|
||||||
|
**introduction/**
|
||||||
|
ReST files and images for the Introduction to Project ACRN
|
||||||
|
|
||||||
|
**scripts/**
|
||||||
|
Files used to assist building the documentation set
|
||||||
|
|
||||||
|
**static/**
|
||||||
|
Sphinx folder for extras added to the generated output (such as custom
|
||||||
|
CSS additions)
|
||||||
|
|
||||||
|
CPU virtualization
|
||||||
|
******************
|
||||||
|
|
||||||
|
The ACRN hypervisor uses static partitioning of the physical CPU cores,
|
||||||
|
providing each User OS a virtualized environment containing at least one
|
||||||
|
statically assigned physical CPU core. The CPUID features for a
|
||||||
|
partitioned physical core is the same as the native CPU features. CPU
|
||||||
|
power management (Cx/Px) is managed by the User OS.
|
||||||
|
|
||||||
|
The supported Intel |reg| NUC platform (see :ref:`hardware`) has a CPU
|
||||||
|
with four cores. The Service OS is assigned one core and the other three
|
||||||
|
cores are assigned to the User OS. ``XSAVE`` and ``XRSTOR`` instructions
|
||||||
|
(used to perform a full save/restore of the extended state in the
|
||||||
|
processor to/from memory) are currently not supported in the User OS.
|
||||||
|
(The kernel boot parameters must specify ``noxsave``). Processor core
|
||||||
|
sharing among User OSes is planned for a future release.
|
||||||
|
|
||||||
|
The following sections introduce CPU virtualization related
|
||||||
|
concepts and technologies.
|
||||||
|
|
||||||
|
Host GDT
|
||||||
|
========
|
||||||
|
|
||||||
|
The ACRN hypervisor initializes the host Global Descriptor Table (GDT),
|
||||||
|
used to define the characteristics of the various memory areas during
|
||||||
|
program execution. Code Segment ``CS:0x8`` and Data Segment ``DS:0x10``
|
||||||
|
are configured as Hypervisor selectors, with their settings in host the
|
||||||
|
GDT as shown in :numref:`host-gdt`:
|
||||||
|
|
||||||
|
.. figure:: images/primer-host-gdt.png
|
||||||
|
:align: center
|
||||||
|
:name: host-gdt
|
||||||
|
|
||||||
|
Host GDT
|
||||||
|
|
||||||
|
Host IDT
|
||||||
|
========
|
||||||
|
|
||||||
|
The ACRN hypervisor installs interrupt gates for both Exceptions and
|
||||||
|
Vectors. That means exceptions and interrupts will automatically disable
|
||||||
|
interrupts. The ``HOST_GDT_RING0_CODE_SEL`` is used in the Host IDT
|
||||||
|
table.
|
||||||
|
|
||||||
|
Guest SMP Booting
|
||||||
|
=================
|
||||||
|
|
||||||
|
The Bootstrap Processor (BSP) vCPU for the User OS boots into x64 long
|
||||||
|
mode directly, while the Application Processors (AP) vCPU boots into
|
||||||
|
real mode. The virtualized Local Advanced Programmable Interrupt
|
||||||
|
Controller (vLAPIC) for the User OS in the hypervisor emulates the
|
||||||
|
INIT/STARTUP signals.
|
||||||
|
|
||||||
|
The AP vCPU belonging to the User OS begins in an infinite loop, waiting
|
||||||
|
for an INIT signal. Once the User OS issues a Startup IPI (SIPI) signal
|
||||||
|
to another vCPU, the vLAPIC traps the request, resets the target vCPU,
|
||||||
|
and then enters the ``INIT->STARTUP#1->STARTUP#2`` cycle to boot the
|
||||||
|
vCPUs for the User OS.
|
||||||
|
|
||||||
|
VMX configuration
|
||||||
|
=================
|
||||||
|
|
||||||
|
ACRN hypervisor has the Virtual Machine configuration (VMX) shown in
|
||||||
|
:numref:`VMX_MSR` below. (These configuration settings may change in the future, according to
|
||||||
|
virtualization policies.)
|
||||||
|
|
||||||
|
.. table:: VMX Configuration
|
||||||
|
:align: center
|
||||||
|
:widths: auto
|
||||||
|
:name: VMX_MSR
|
||||||
|
|
||||||
|
+----------------------------------------+----------------+---------------------------------------+
|
||||||
|
| **VMX MSR** | **Bits** | **Description** |
|
||||||
|
+========================================+================+=======================================+
|
||||||
|
| **MSR\_IA32\_VMX\_PINBASED\_CTLS** | Bit0 set | Enable External IRQ VM Exit |
|
||||||
|
+ +----------------+---------------------------------------+
|
||||||
|
| | Bit6 set | Enable HV pre-40ms Preemption timer |
|
||||||
|
+ +----------------+---------------------------------------+
|
||||||
|
| | Bit7 clr | Post interrupt did not support |
|
||||||
|
+----------------------------------------+----------------+---------------------------------------+
|
||||||
|
| **MSR\_IA32\_VMX\_PROCBASED\_CTLS** | Bit25 set | Enable I/O bitmap |
|
||||||
|
+ +----------------+---------------------------------------+
|
||||||
|
| | Bit28 set | Enable MSR bitmap |
|
||||||
|
+ +----------------+---------------------------------------+
|
||||||
|
| | Bit19,20 set | Enable CR8 store/load |
|
||||||
|
+----------------------------------------+----------------+---------------------------------------+
|
||||||
|
| **MSR\_IA32\_VMX\_PROCBASED\_CTLS2** | Bit1 set | Enable EPT |
|
||||||
|
+ +----------------+---------------------------------------+
|
||||||
|
| | Bit7 set | Allow guest real mode |
|
||||||
|
+----------------------------------------+----------------+---------------------------------------+
|
||||||
|
| **MSR\_IA32\_VMX\_EXIT\_CTLS** | Bit15 | VMX Exit auto ack vector |
|
||||||
|
+ +----------------+---------------------------------------+
|
||||||
|
| | Bit18,19 | MSR IA32\_PAT save/load |
|
||||||
|
+ +----------------+---------------------------------------+
|
||||||
|
| | Bit20,21 | MSR IA32\_EFER save/load |
|
||||||
|
+ +----------------+---------------------------------------+
|
||||||
|
| | Bit9 | 64-bit mode after VM Exit |
|
||||||
|
+----------------------------------------+----------------+---------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
CPUID and Guest TSC calibration
|
||||||
|
===============================
|
||||||
|
|
||||||
|
User OS access to CPUID will be trapped by ACRN hypervisor, however
|
||||||
|
the ACRN hypervisor will pass through most of the native CPUID
|
||||||
|
information to the guest, except the virtualized CPUID 0x1 (to
|
||||||
|
provide fake x86_model).
|
||||||
|
|
||||||
|
The Time Stamp Counter (TSC) is a 64-bit register present on all x86
|
||||||
|
processors that counts the number of cycles since reset. ACRN hypervisor
|
||||||
|
also virtualizes ``MSR_PLATFORM_INFO`` and ``MSR_ATOM_FSB_FREQ``.
|
||||||
|
|
||||||
|
RDTSC/RDTSCP
|
||||||
|
============
|
||||||
|
|
||||||
|
User OS vCPU reads of ``RDTSC``, ``RDTSCP``, or ``MSR_IA32_TSC_AUX``
|
||||||
|
will not make the VM Exit to the hypervisor. Thus the vCPUID provided by
|
||||||
|
``MSR_IA32_TSC_AUX`` can be changed via the User OS.
|
||||||
|
|
||||||
|
The ``RDTSCP`` instruction is widely used by the ACRN hypervisor to
|
||||||
|
identify the current CPU (and read the current value of the processor's
|
||||||
|
time-stamp counter). Because there is no VM Exit for
|
||||||
|
``MSR_IA32_TSC_AUX`` msr register, the hypervisor will save and restore
|
||||||
|
the ``MSR_IA32_TSC_AUX`` value on every VM Exit and Enter. Before the
|
||||||
|
hypervisor restores the host CPU ID, we must not use a ``RDTSCP``
|
||||||
|
instruction because it would return the vCPU ID instead of host CPU ID.
|
||||||
|
|
||||||
|
CR Register virtualization
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Guest CR8 access will make the VM Exit, and is emulated in the
|
||||||
|
hypervisor for vLAPIC to update its PPR register. Guest access to CR3
|
||||||
|
will not make the VM Exit.
|
||||||
|
|
||||||
|
MSR BITMAP
|
||||||
|
==========
|
||||||
|
|
||||||
|
In the ACRN hypervisor, only these module-specific registers (MSR) are
|
||||||
|
supported:
|
||||||
|
|
||||||
|
**MSR_IA32_TSC_DEADLINE**
|
||||||
|
emulates Guest TSC timer program
|
||||||
|
|
||||||
|
**MSR_PLATFORM_INFO**
|
||||||
|
emulates a fake X86 module
|
||||||
|
|
||||||
|
**MSR_ATOM_FSB_FREQ**
|
||||||
|
provides the CPU frequency directly via this MSR to avoid TSC calibration
|
||||||
|
|
||||||
|
I/O BITMAP
|
||||||
|
==========
|
||||||
|
|
||||||
|
All User OS I/O port accesses are trapped into the ACRN hypervisor by
|
||||||
|
default. Most of the Service OS I/O port accesses are not trapped into
|
||||||
|
the ACRN hypervisor, allowing the Service OS direct access to the
|
||||||
|
hardware port.
|
||||||
|
|
||||||
|
The Service OS I/O trap policy is:
|
||||||
|
|
||||||
|
**0x3F8/0x3FC**
|
||||||
|
for emulated vUART inside hypervisor for SOS only, will be trapped
|
||||||
|
|
||||||
|
**0x20/0xA0/0x460**
|
||||||
|
for vPIC emulation in hypervisor, will be trapped
|
||||||
|
|
||||||
|
**0xCF8/0xCFC**
|
||||||
|
for hypervisor PCI device interception, will be trapped
|
||||||
|
|
||||||
|
Exceptions
|
||||||
|
==========
|
||||||
|
|
||||||
|
The User OS handles its exceptions inside the VM, including page fault,
|
||||||
|
GP, etc. A #MC and #DB exception causes a VM Exit to the ACRN hypervisor
|
||||||
|
console.
|
||||||
|
|
||||||
|
Memory virtualization
|
||||||
|
*********************
|
||||||
|
|
||||||
|
ACRN hypervisor provides memory virtualization by using a static
|
||||||
|
partition of system memory. Each virtual machine owns its own contiguous
|
||||||
|
partition of memory, with the Service OS staying in lower memory and the
|
||||||
|
User OS instances in high memory. (High memory is memory which is not
|
||||||
|
permanently mapped in the kernel address space, while Low Memory is
|
||||||
|
always mapped, so you can access it in the kernel simply by
|
||||||
|
dereferencing a pointer.) In future implementations, this will evolve to
|
||||||
|
utilize EPT/VT-d.
|
||||||
|
|
||||||
|
ACRN hypervisor memory is not visible to any User OS. In the ACRN
|
||||||
|
hypervisor, there are a few memory accesses that need to work
|
||||||
|
efficiently:
|
||||||
|
|
||||||
|
- ACRN hypervisor to access host memory
|
||||||
|
- vCPU per VM to access guest memory
|
||||||
|
- vCPU per VM to access host memory
|
||||||
|
- vCPU per VM to access MMIO memory
|
||||||
|
|
||||||
|
The rest of this section introduces how these kinds of memory accesses
|
||||||
|
are managed. It gives an overview of physical memory layout,
|
||||||
|
Paravirtualization (MMU) memory mapping in the hypervisor and VMs, and
|
||||||
|
Host-Guest Extended Page Table (EPT) memory mapping for each VM.
|
||||||
|
|
||||||
|
Physical Memory Layout
|
||||||
|
======================
|
||||||
|
|
||||||
|
The Physical Memory Layout Example for Service OS & User OS is shown in
|
||||||
|
:numref:`primer-mem-layout` below:
|
||||||
|
|
||||||
|
.. figure:: images/primer-mem-layout.png
|
||||||
|
:align: center
|
||||||
|
:name: primer-mem-layout
|
||||||
|
|
||||||
|
Memory Layout
|
||||||
|
|
||||||
|
:numref:`primer-mem-layout` shows an example of physical memory layout
|
||||||
|
of the Service and User OS. The Service OS accepts the whole e820 table
|
||||||
|
(all usable memory address ranges not reserved for use by the BIOS)
|
||||||
|
after filtering out the Hypervisor memory too. From the SOS's point of
|
||||||
|
view, it takes control of all available physical memory, including User
|
||||||
|
OS memory, not used by the hypervisor (or BIOS). Each User OSes memory
|
||||||
|
is allocated from (High) SOS memory and the User OS only owns this
|
||||||
|
section of memory control.
|
||||||
|
|
||||||
|
Some of the physical memory of a 32-bit machine, needs to be sacrificed
|
||||||
|
by making it hidden so memory-mapped I/O (MMIO) devices have room to
|
||||||
|
communicate. This creates an MMIO hole for VMs to access some range of
|
||||||
|
MMIO addresses directly for communicating to devices; or they may need
|
||||||
|
the hypervisor to trap some range of MMIO to do device emulation. This
|
||||||
|
access control is done through EPT mapping.
|
||||||
|
|
||||||
|
PV (MMU) Memory Mapping in the Hypervisor
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
.. figure:: images/primer-pv-mapping.png
|
||||||
|
:align: center
|
||||||
|
:name: primer-pv-mapping
|
||||||
|
|
||||||
|
ACRN Hypervisor PV Mapping Example
|
||||||
|
|
||||||
|
The ACRN hypervisor is trusted and can access and control all system
|
||||||
|
memory, as shown in :numref:`primer-pv-mapping`. Because the hypervisor
|
||||||
|
is running in protected mode, an MMU page table must be prepared for its
|
||||||
|
PV translation. To simplify things, the PV translation page table is set
|
||||||
|
as a 1:1 mapping. Some MMIO range mappings could be removed if they are
|
||||||
|
not needed. This PV page table is created when the hypervisor memory is
|
||||||
|
first initialized.
|
||||||
|
|
||||||
|
PV (MMU) Memory Mapping in VMs
|
||||||
|
==============================
|
||||||
|
|
||||||
|
As mentioned earlier, the Primary vCPU starts to run in protected mode
|
||||||
|
when its VM is started. But before it begins, a temporary PV (MMU) page
|
||||||
|
table must be prepared..
|
||||||
|
|
||||||
|
This page table is a 1:1 mapping for 4 Gb, and only lives for a short
|
||||||
|
time when the vCPU first runs. After the vCPU starts to run its kernel
|
||||||
|
image (for example Linux\*), the kernel will create its own PV page
|
||||||
|
tables, after which, the temporary page table will be obsoleted.
|
||||||
|
|
||||||
|
Host-Guest (EPT) Memory Mapping
|
||||||
|
===============================
|
||||||
|
|
||||||
|
The VMs (both SOS and UOS) need to create an Extended Page Table (EPT) to
|
||||||
|
access the host physical memory based on its guest physical memory. The
|
||||||
|
guest VMs also need to set an MMIO trap to trigger EPT violations for
|
||||||
|
device emulation (such as IOAPIC, and LAPIC). This memory layout is
|
||||||
|
shown in :numref:`primer-sos-ept-mapping`:
|
||||||
|
|
||||||
|
.. figure:: images/primer-sos-ept-mapping.png
|
||||||
|
:align: center
|
||||||
|
:name: primer-sos-ept-mapping
|
||||||
|
|
||||||
|
SOS EPT Mapping Example
|
||||||
|
|
||||||
|
The SOS takes control of all the host physical memory space: its EPT
|
||||||
|
mapping covers almost all of the host memory except that reserved for
|
||||||
|
the hypervisor (HV) and a few MMIO trap ranges for IOAPIC & LAPIC
|
||||||
|
emulation. The guest to host mapping for SOS is 1:1.
|
||||||
|
|
||||||
|
.. figure:: images/primer-uos-ept-mapping.png
|
||||||
|
:align: center
|
||||||
|
:name: primer-uos-ept-mapping
|
||||||
|
|
||||||
|
UOS EPT Mapping Example
|
||||||
|
|
||||||
|
However, for the UOS, its memory EPT mapping is linear but with an
|
||||||
|
offset (as shown in :numref:`primer-uos-ept-mapping`). The MMIO hole is
|
||||||
|
not mapped to trap all MMIO accesses from the UOS (and do emulating in
|
||||||
|
the device model). To support pass through devices in the future, some
|
||||||
|
MMIO range mapping may be added.
|
||||||
|
|
||||||
|
Graphic mediation
|
||||||
|
*****************
|
||||||
|
|
||||||
|
Intel |reg| Graphics Virtualization Technology –g (Intel |reg| GVT-g)
|
||||||
|
provides GPU sharing capability to multiple VMs by using a mediated
|
||||||
|
pass-through technique. This allows a VM to access performance critical
|
||||||
|
I/O resources (usually partitioned) directly, without intervention from
|
||||||
|
the hypervisor in most cases.
|
||||||
|
|
||||||
|
Privileged operations from this VM are trap-and-emulated to provide
|
||||||
|
secure isolation among VMs. The Hypervisor must ensure that no
|
||||||
|
vulnerability is exposed when assigning performance-critical resource to
|
||||||
|
each VM. When a performance-critical resource cannot be partitioned, a
|
||||||
|
scheduler must be implemented (either in software or hardware) to allow
|
||||||
|
time-based sharing among multiple VMs. In this case, the device must
|
||||||
|
allow the hypervisor to save and restore the hardware state associated
|
||||||
|
with the shared resource, either through direct I/O register read/write
|
||||||
|
(when there is no software invisible state) or through a device-specific
|
||||||
|
context save/restore mechanism (where there is a software invisible
|
||||||
|
state).
|
||||||
|
|
||||||
|
In the initial release of Project ACRN, graphic mediation is not
|
||||||
|
enabled, and is planned for a future release.
|
||||||
|
|
||||||
|
I/O emulation
|
||||||
|
*************
|
||||||
|
|
||||||
|
The I/O path is explained in the :ref:`ACRN-io-mediator` section of the
|
||||||
|
:ref:`introduction`. The following sections, provide additional device
|
||||||
|
assignment management and PIO/MMIO trap flow introduction.
|
||||||
|
|
||||||
|
Device Assignment Management
|
||||||
|
============================
|
||||||
|
|
||||||
|
ACRN hypervisor provides major device assignment management. Since the
|
||||||
|
hypervisor owns all native vectors and IRQs, there must be a mapping
|
||||||
|
table to handle the Guest IRQ/Vector to Host IRQ/Vector. Currently we
|
||||||
|
assign all devices to VM0 except the UART.
|
||||||
|
|
||||||
|
If a PCI device (with MSI/MSI-x) is assigned to Guest, the User OS will
|
||||||
|
program the PCI config space and set the guest vector to this device. A
|
||||||
|
Hypercall ``CWP_VM_PCI_MSIX_FIXUP`` is provided. Once the guest programs
|
||||||
|
the guest vector, the User OS may call this hypercall to notify the ACRN
|
||||||
|
hypervisor. The hypervisor allocates a host vector, creates a guest-host
|
||||||
|
mapping relation, and replaces the guest vector with a real native
|
||||||
|
vector for the device:
|
||||||
|
|
||||||
|
**PCI MSI/MSI-X**
|
||||||
|
PCI Message Signaled Interrupts (MSI/MSX-x) from
|
||||||
|
devices can be triggered from a hypercall when a guest program
|
||||||
|
vectors. All PCI devices are programed with real vectors
|
||||||
|
allocated by the Hypervisor.
|
||||||
|
|
||||||
|
**PCI/INTx**
|
||||||
|
Device assignment is triggered when the guest programs
|
||||||
|
the virtual Advanced I/O Programmable Interrupt Controller
|
||||||
|
(vIOAPC) Redirection Table Entries (RTE).
|
||||||
|
|
||||||
|
**Legacy**
|
||||||
|
Legacy devices are assigned to VM0.
|
||||||
|
|
||||||
|
User OS device assignment is similar to the above, except the User OS
|
||||||
|
doesn't call hypercall. Instead, the Guest program PCI configuration
|
||||||
|
space will be trapped into the Device Module, and Device Module may
|
||||||
|
issue hypercall to notify hypervisor the guest vector is changing.
|
||||||
|
|
||||||
|
Currently, there are two types of I/O Emulation supported: MMIO and
|
||||||
|
PORTIO trap handling. MMIO emulation is triggered by an EPT violation
|
||||||
|
VMExit only. If there is an EPT misconfiguration and VMExit occurs, the
|
||||||
|
hypervisor will halt the system. (Because the hypervisor set up all EPT
|
||||||
|
page table mapping at the beginning of the Guest boot, there should not
|
||||||
|
be an EPT misconfiguration.)
|
||||||
|
|
||||||
|
There are multiple places where I/O emulation can happen - in ACRN
|
||||||
|
hypervisor, Service OS Kernel VHM module, or in the Service OS Userland
|
||||||
|
ACRN Device Module.
|
||||||
|
|
||||||
|
PIO/MMIO trap Flow
|
||||||
|
==================
|
||||||
|
|
||||||
|
Here is a description of the PIO/MMIO trap flow:
|
||||||
|
|
||||||
|
#. Instruction decoder: get the Guest Physical Address (GPA) from VM
|
||||||
|
Exit, go through gla2gpa() page walker if necessary.
|
||||||
|
|
||||||
|
#. Emulate the instruction. Here the hypervisor will have an address
|
||||||
|
range check to see if the hypervisor is interested in this IO
|
||||||
|
port or MMIO GPA access.
|
||||||
|
|
||||||
|
#. Hypervisor emulates vLAPIC, vIOAPIC, vPIC, and vUART only (for
|
||||||
|
Service OS only). Any other emulation request are forwarded to
|
||||||
|
the SOS for handling. The vCPU raising the I/O request will
|
||||||
|
halt until this I/O request is processed successfully. An IPI will
|
||||||
|
send to vCPU0 of SOS to notify there is an I/O request waiting for
|
||||||
|
service.
|
||||||
|
|
||||||
|
#. Service OS VHM module takes the I/O request and dispatches the request
|
||||||
|
to multiple clients. These clients could be SOS kernel space
|
||||||
|
VBS-K, MPT, or User-land Device model. VHM I/O request server
|
||||||
|
selects a default fallback client responsible to handle any I/O
|
||||||
|
request not handled by other clients. (The Device Manager is the
|
||||||
|
default fallback client.) Each client needs to register its I/O
|
||||||
|
range or specific PCI bus/device/function (BDF) numbers. If an I/O
|
||||||
|
request falls into the client range, the I/O request server will
|
||||||
|
send the request to that client.
|
||||||
|
|
||||||
|
#. Multiple clients - fallback client (Device Model in user-land),
|
||||||
|
VBS-K client, MPT client.
|
||||||
|
Once the I/O request emulation completes, the client updates the
|
||||||
|
request status and notifies the hypervisor by a hypercall.
|
||||||
|
Hypervisor picks up that request, do any necessary cleanup,
|
||||||
|
and resume the Guest vCPU.
|
||||||
|
|
||||||
|
Most I/O emulation tasks are done by the SOS CPU, and requests come from
|
||||||
|
UOS vCPUs.
|
||||||
|
|
||||||
|
Virtual interrupt
|
||||||
|
*****************
|
||||||
|
|
||||||
|
All interrupts received by the User OS comes from a virtual interrupt
|
||||||
|
injected by a virtual vLAPIC, vIOAPIC, or vPIC. All device emulation is
|
||||||
|
done inside the SOS Userspace device model. However for performance
|
||||||
|
consideration, vLAPIC, vIOAPIC, and vPIC devices are emulated inside the
|
||||||
|
ACRN hypervisor directly. From the guest point of view, vPIC uses
|
||||||
|
Virtual Wire Mode via vIOAPIC.
|
||||||
|
|
||||||
|
The symmetric I/O Mode is shown in :numref:`primer-symmetric-io`:
|
||||||
|
|
||||||
|
.. figure:: images/primer-symmetric-io.png
|
||||||
|
:align: center
|
||||||
|
:name: primer-symmetric-io
|
||||||
|
|
||||||
|
Symmetric I/O Mode
|
||||||
|
|
||||||
|
|
||||||
|
**Kernel boot param with vPIC**
|
||||||
|
add "maxcpu=0" to User OS to use PIC
|
||||||
|
|
||||||
|
**Kernel boot param with vIOAPIC**
|
||||||
|
add "maxcpu=1" (as long as not "0") User OS will use IOAPIC. Keep
|
||||||
|
IOAPIC pin2 as source of PIC.
|
||||||
|
|
||||||
|
Virtual LAPIC
|
||||||
|
=============
|
||||||
|
|
||||||
|
The LAPIC (Local Advanced Programmable interrupt Controller) is
|
||||||
|
virtualized for SOS or UOS. The vLAPIC is currently emulated by a Guest
|
||||||
|
MMIO trap to GPA address range: 0xFEE00000 - 0xFEE100000 (1MB). ACRN
|
||||||
|
hypervisor will support APIC-v and Post interrupts in a future release.
|
||||||
|
|
||||||
|
vLAPIC provides the same feature as a native LAPIC:
|
||||||
|
|
||||||
|
- Mask/Unmask vectors
|
||||||
|
- Inject virtual vectors (Level or Edge trigger mode) to vCPU
|
||||||
|
- Notify vIOAPIC of EOI processing
|
||||||
|
- Provide TSC Timer service
|
||||||
|
- vLAPIC support CR8 to update TPR
|
||||||
|
- INIT/STARTUP handling
|
||||||
|
|
||||||
|
Virtual IOAPIC
|
||||||
|
==============
|
||||||
|
|
||||||
|
A vIOAPIC is emulated by the hypervisor when the Guest accesses MMIO GPA
|
||||||
|
Range: 0xFEC00000 - 0xFEC01000. The vIOAPIC for the SOS will match the
|
||||||
|
same pin numbers as the native HW IOAPIC. The vIOAPIC for UOS only
|
||||||
|
provides 24 Pins. When a vIOAPIC PIN is asserted, the vIOAPIC calls
|
||||||
|
vLAPIC APIs to inject the vector to the Guest.
|
||||||
|
|
||||||
|
Virtual PIC
|
||||||
|
===========
|
||||||
|
|
||||||
|
A vPIC is required for TSC calculation. Normally the UOS boots with a
|
||||||
|
vIOAPIC. A vPIC is a source of external interrupts to the Guest. On
|
||||||
|
every VMExit, the hypervisor checks if there are pending external PIC
|
||||||
|
interrupts.
|
||||||
|
|
||||||
|
Virtual Interrupt Injection
|
||||||
|
===========================
|
||||||
|
|
||||||
|
The source of virtual interrupts comes from either the Device Module or
|
||||||
|
from assigned devices:
|
||||||
|
|
||||||
|
**SOS assigned devices**
|
||||||
|
As we assigned all devices to SOS directly whenever a devices'
|
||||||
|
physical interrupts come, we inject the corresponding virtual interrupts
|
||||||
|
to SOS via the vLAPIC/vIOAPIC. In this case, the SOS doesn't use the
|
||||||
|
vPIC and does not have emulated devices.
|
||||||
|
|
||||||
|
**UOS assigned devices**
|
||||||
|
Only PCI devices are assigned to UOS, and virtual interrupt injection
|
||||||
|
follows the same way as the SOS. A virtual interrupt injection operation
|
||||||
|
is triggered when a device's physical interrupt is triggered.
|
||||||
|
|
||||||
|
**UOS emulated devices**
|
||||||
|
Device Module (user-land Device Model) is responsible for UOS emulated
|
||||||
|
devices' interrupt lifecycle management. The Device Model knows when an
|
||||||
|
emulated device needs to assert a virtual IOPAIC/PIC Pin or needs to
|
||||||
|
send a virtual MSI vector to the Guest. This logic is entirely handled
|
||||||
|
by the Device Model.
|
||||||
|
|
||||||
|
:numref:`primer-hypervisor-interrupt` shows how the hypervisor handles
|
||||||
|
interrupt processing and pending interrupts (acrn_do_intr_process):
|
||||||
|
|
||||||
|
.. figure:: images/primer-hypervisor-interrupt.png
|
||||||
|
:align: center
|
||||||
|
:name: primer-hypervisor-interrupt
|
||||||
|
|
||||||
|
Hypervisor Interrupt handler
|
||||||
|
|
||||||
|
There are many cases where the Guest RFLAG.IF is cleared and interrupts
|
||||||
|
are disabled. The hypervisor will check if the Guest IRQ window is
|
||||||
|
available before injection. NMI is unmasked interrupt injection
|
||||||
|
regardless of existing guest IRQ window status. If the current IRQ
|
||||||
|
windows is not available, hypervisor enables
|
||||||
|
``MSR_IA32_VMX_PROCBASED_CTLS_IRQ_WIN`` (PROCBASED_CTRL.bit[2]) and
|
||||||
|
VMEnter directly. The injection will be done on next VMExit once the
|
||||||
|
Guest issues STI (GuestRFLAG.IF=1).
|
||||||
|
|
||||||
|
VT-x and VT-d
|
||||||
|
*************
|
||||||
|
|
||||||
|
Since 2006, Intel CPUs have supported hardware assist - VT-x
|
||||||
|
instructions, where the CPU itself traps specific guest instructions and
|
||||||
|
register accesses directly into the VMM without need for binary
|
||||||
|
translation (and modification) of the guest operating system. Guest
|
||||||
|
operating systems can be run natively without modification, although it
|
||||||
|
is common to still install virtualization-aware para-virtualized drivers
|
||||||
|
into the guests to improve functionality. One common example is access
|
||||||
|
to storage via emulated SCSI devices.
|
||||||
|
|
||||||
|
Intel CPUs and chipsets support various Virtualization Technology (VT)
|
||||||
|
features - such as VT-x and VT-d. Physical events on the platform
|
||||||
|
trigger CPU **VM Exits** (a trap into the VMM) to handle physical
|
||||||
|
events such as physical device interrupts,
|
||||||
|
|
||||||
|
In the ACRN hypervisor design, VT-d can be used to do DMA Remapping,
|
||||||
|
such as Address translation and Isolation.
|
||||||
|
:numref:`primer-dma-address-mapping` is an example of address
|
||||||
|
translation:
|
||||||
|
|
||||||
|
.. figure:: images/primer-dma-address-mapping.png
|
||||||
|
:align: center
|
||||||
|
:name: primer-dma-address-mapping
|
||||||
|
|
||||||
|
DMA address mapping
|
||||||
|
|
||||||
|
Hypercall
|
||||||
|
*********
|
||||||
|
|
||||||
|
ACRN hypervisor currently supports less than a dozen
|
||||||
|
:ref:`hypercall_apis` and VHM upcall APIs to support the necessary VM
|
||||||
|
management, IO request distribution and guest memory mappings. The
|
||||||
|
hypervisor and Service OS (SOS) reserve vector 0xF4 for hypervisor
|
||||||
|
notification to the SOS. This upcall is necessary whenever device
|
||||||
|
emulation is required by the SOS. The upcall vector 0xF4 is injected to
|
||||||
|
SOS vCPU0.
|
||||||
|
|
||||||
|
Refer to the :ref:`acrn_apis` documentation for details.
|
||||||
|
|
||||||
|
Device emulation
|
||||||
|
****************
|
||||||
|
|
||||||
|
The ACRN Device Model emulates different kinds of platform devices, such as
|
||||||
|
RTC, LPC, UART, PCI device, and Virtio block device. The most important
|
||||||
|
thing about device emulation is to handle the I/O request from different
|
||||||
|
devices. The I/O request could be PIO, MMIO, or PCI CFG SPACE access. For
|
||||||
|
example:
|
||||||
|
|
||||||
|
- a CMOS RTC device may access 0x70/0x71 PIO to get the CMOS time,
|
||||||
|
- a GPU PCI device may access its MMIO or PIO BAR space to complete
|
||||||
|
its frame buffer rendering, or
|
||||||
|
- the bootloader may access PCI devices' CFG
|
||||||
|
SPACE for BAR reprogramming.
|
||||||
|
|
||||||
|
ACRN Device Model injects interrupts/MSIs to its frontend devices when
|
||||||
|
necessary as well, for example, a RTC device needs to get its ALARM
|
||||||
|
interrupt or a PCI device with MSI capability needs to get its MSI. The
|
||||||
|
Data Model also provides a PIRQ routing mechanism for platform devices.
|
||||||
|
|
||||||
|
Virtio Devices
|
||||||
|
**************
|
||||||
|
|
||||||
|
This section introduces the Virtio devices supported by ACRN. Currently
|
||||||
|
all the Back-end Virtio drivers are implemented using the Virtio APIs
|
||||||
|
and the FE drivers are re-using Linux standard Front-end Virtio drivers.
|
||||||
|
|
||||||
|
Virtio-rnd
|
||||||
|
==========
|
||||||
|
|
||||||
|
The Virtio-rnd entropy device supplies high-quality randomness for guest
|
||||||
|
use. The Virtio device ID of the Virtio-rnd device is 4, and supports
|
||||||
|
one virtqueue of 64 entries (configurable in the source code). No
|
||||||
|
feature bits are defined.
|
||||||
|
|
||||||
|
When the FE driver requires random bytes, the BE device places bytes of
|
||||||
|
random data onto the virtqueue.
|
||||||
|
|
||||||
|
To launch the Virtio-rnd device, you can use the following command:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
./acrn-dm -A -m 1168M \
|
||||||
|
-s 0:0,hostbridge \
|
||||||
|
-s 1,virtio-blk,./uos.img \
|
||||||
|
-s 2,virtio-rnd \
|
||||||
|
-k bzImage \
|
||||||
|
-B "root=/dev/vda rw rootwait noxsave maxcpus=0 nohpet \
|
||||||
|
console=hvc0 no_timer_check ignore_loglevel \
|
||||||
|
log_buf_len=16M consoleblank=0 tsc=reliable" vm1
|
||||||
|
|
||||||
|
To verify the result in user OS side, you can use the following command:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
od /dev/random
|
||||||
|
|
||||||
|
Virtio-blk
|
||||||
|
==========
|
||||||
|
|
||||||
|
The Virtio-blk device is a simple virtual block device. The FE driver
|
||||||
|
will place read, write, and other requests onto the virtqueue, so that
|
||||||
|
the BE driver can process them accordingly.
|
||||||
|
|
||||||
|
The Virtio device ID of the Virtio-blk is 2, and it supports one
|
||||||
|
virtqueue with 64 entries, configurable in the source code. The feature
|
||||||
|
bits supported by the BE device are as follows:
|
||||||
|
|
||||||
|
**VTBLK\_F\_SEG\_MAX(bit 2)**
|
||||||
|
Maximum number of segments in a request is in seg_max.
|
||||||
|
|
||||||
|
**VTBLK\_F\_BLK\_SIZE(bit 6)**
|
||||||
|
block size of disk is in blk\_size.
|
||||||
|
|
||||||
|
**VTBLK\_F\_FLUSH(bit 9)**
|
||||||
|
cache flush command support.
|
||||||
|
|
||||||
|
**VTBLK\_F\_TOPOLOGY(bit 10)**
|
||||||
|
device exports information on optimal I/O alignment.
|
||||||
|
|
||||||
|
To use the Virtio-blk device, use the following command:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
./acrn-dm -A -m 1168M \
|
||||||
|
-s 0:0,hostbridge \
|
||||||
|
-s 1,virtio-blk,./uos.img** \
|
||||||
|
-k bzImage -B "root=/dev/vda rw rootwait noxsave maxcpus=0 \
|
||||||
|
nohpet console=hvc0 no_timer_check ignore_loglevel \
|
||||||
|
log_buf_len=16M consoleblank=0 tsc=reliable" vm1
|
||||||
|
|
||||||
|
To verify the result, you should expect the user OS to boot
|
||||||
|
successfully.
|
||||||
|
|
||||||
|
Virtio-net
|
||||||
|
==========
|
||||||
|
|
||||||
|
The Virtio-net device is a virtual Ethernet device. The Virtio device ID
|
||||||
|
of the Virtio-net is 1. The Virtio-net device supports two virtqueues,
|
||||||
|
one for transmitting packets and the other for receiving packets. The
|
||||||
|
FE driver will place empty buffers onto one virtqueue for receiving
|
||||||
|
packets, and enqueue outgoing packets onto the other virtqueue for
|
||||||
|
transmission. Currently the size of each virtqueue is 1000, configurable
|
||||||
|
in the source code.
|
||||||
|
|
||||||
|
To access the external network from user OS, a L2 virtual switch should
|
||||||
|
be created in the service OS, and the BE driver is bonded to a tap/tun
|
||||||
|
device linking under the L2 virtual switch. See
|
||||||
|
:numref:`primer-virtio-net`:
|
||||||
|
|
||||||
|
.. figure:: images/primer-virtio-net.png
|
||||||
|
:align: center
|
||||||
|
:name: primer-virtio-net
|
||||||
|
|
||||||
|
Accessing external network from User OS
|
||||||
|
|
||||||
|
Currently the feature bits supported by the BE device are:
|
||||||
|
|
||||||
|
**VIRTIO\_NET\_F\_MAC(bit 5)**
|
||||||
|
device has given MAC address.
|
||||||
|
|
||||||
|
**VIRTIO\_NET\_F\_MRG\_RXBUF(bit 15)**
|
||||||
|
BE driver can merge receive buffers.
|
||||||
|
|
||||||
|
**VIRTIO\_NET\_F\_STATUS(bit 16)**
|
||||||
|
configuration status field is available.
|
||||||
|
|
||||||
|
**VIRTIO\_F\_NOTIFY\_ON\_EMPTY(bit 24)**
|
||||||
|
device will issue an interrupt if it runs out of available
|
||||||
|
descriptors on a virtqueue.
|
||||||
|
|
||||||
|
To enable the Virtio-net device, use the following command:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
./acrn-dm -A -m 1168M \
|
||||||
|
-s 0:0,hostbridge \
|
||||||
|
-s 1,virtio-blk,./uos.img \
|
||||||
|
-s 2,virtio-net,tap0 \
|
||||||
|
-k bzImage -B "root=/dev/vda rw rootwait noxsave maxcpus=0 \
|
||||||
|
nohpet console=hvc0 no_timer_check ignore_loglevel \
|
||||||
|
log_buf_len=16M consoleblank=0 tsc=reliable" vm1
|
||||||
|
|
||||||
|
To verify the correctness of the device, the external
|
||||||
|
network should be accessible from the user OS.
|
||||||
|
|
||||||
|
Virtio-console
|
||||||
|
==============
|
||||||
|
|
||||||
|
The Virtio-console device is a simple device for data input and output.
|
||||||
|
The Virtio device ID of the Virtio-console device is 3. A device could
|
||||||
|
have from one to 16 ports. Each port has a pair of input and output
|
||||||
|
virtqueues used to communicate information between the FE and BE
|
||||||
|
drivers. Currently the size of each virtqueue is 64, configurable in the
|
||||||
|
source code.
|
||||||
|
|
||||||
|
Similar to Virtio-net device, the two virtqueues specific to a port are
|
||||||
|
for transmitting virtqueue and receiving virtqueue. The FE driver will
|
||||||
|
place empty buffers onto the receiving virtqueue for incoming data, and
|
||||||
|
enqueue outgoing characters onto transmitting virtqueue.
|
||||||
|
|
||||||
|
Currently the feature bits supported by the BE device are:
|
||||||
|
|
||||||
|
**VTCON\_F\_SIZE(bit 0)**
|
||||||
|
configuration columns and rows are valid.
|
||||||
|
|
||||||
|
**VTCON\_F\_MULTIPORT(bit 1)**
|
||||||
|
device supports multiple ports, and control virtqueues will be used.
|
||||||
|
|
||||||
|
**VTCON\_F\_EMERG\_WRITE(bit 2)**
|
||||||
|
device supports emergency write.
|
||||||
|
|
||||||
|
Virtio-console supports redirecting guest output to various backend
|
||||||
|
devices, including stdio/pty/tty. Users could follow the syntax below to
|
||||||
|
specify which backend to use:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
virtio-console,[@]stdio\|tty\|pty:portname[=portpath][,[@]stdio\|tty\|pty:portname[=portpath]]
|
||||||
|
|
||||||
|
For example, to use stdio as a Virtio-console backend, use the following
|
||||||
|
command:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
./acrn-dm -A -m 1168M \
|
||||||
|
-s 0:0,hostbridge \
|
||||||
|
-s 1,virtio-blk,./uos.img \
|
||||||
|
-s 3,virtio-console,@stdio:stdio\_port \
|
||||||
|
-k bzImage -B "root=/dev/vda rw rootwait noxsave maxcpus=0 \
|
||||||
|
nohpet console=hvc0 no_timer_check ignore_loglevel \
|
||||||
|
log_buf_len=16M consoleblank=0 tsc=reliable" vm1
|
||||||
|
|
||||||
|
Then user could login into user OS:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
Ubuntu 17.04 xubuntu hvc0
|
||||||
|
xubuntu login: root
|
||||||
|
Password:
|
||||||
|
|
||||||
|
To use pty as a virtio-console backend, use the following command:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
./acrn-dm -A -m 1168M \
|
||||||
|
-s 0:0,hostbridge \
|
||||||
|
-s 1,virtio-blk,./uos.img \
|
||||||
|
-s 2,virtio-net,tap0 \
|
||||||
|
-s 3,virtio-console,@pty:pty\_port \
|
||||||
|
-k ./bzImage -B "root=/dev/vda rw rootwait noxsave maxcpus=0 \
|
||||||
|
nohpet console=hvc0 no_timer_check ignore_loglevel \
|
||||||
|
log_buf_len=16M consoleblank=0 tsc=reliable" vm1 &
|
||||||
|
|
||||||
|
When ACRN-DM boots User OS successfully, a similar log will be shown
|
||||||
|
as below:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
**************************************************************
|
||||||
|
virt-console backend redirected to /dev/pts/0
|
||||||
|
**************************************************************
|
||||||
|
|
||||||
|
You can then use the following command to login the User OS:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
minicom -D /dev/pts/0
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
screen /dev/pts/0
|
58
release_notes.rst
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
.. _release_notes:
|
||||||
|
|
||||||
|
Release Notes
|
||||||
|
#############
|
||||||
|
|
||||||
|
Version 0.1 release (March 2018)
|
||||||
|
********************************
|
||||||
|
|
||||||
|
In March 2018, Intel announced the open source Project ACRN at the
|
||||||
|
`Embedded Linux Conference and OpenIoT Summit North America 2018
|
||||||
|
<ELC18>`_.
|
||||||
|
|
||||||
|
.. _ELC18:
|
||||||
|
https://events.linuxfoundation.org/events/elc-openiot-north-america-2018/
|
||||||
|
|
||||||
|
ACRN is a flexible, lightweight reference hypervisor, built with
|
||||||
|
real-time and safety-criticality in mind, optimized to streamline
|
||||||
|
embedded development through an open source platform. Check out the
|
||||||
|
:ref:`introduction` for more information.
|
||||||
|
|
||||||
|
The project ACRN reference code can be found on GitHub in
|
||||||
|
https://github.com/projectacrn. It includes the ACRN hypervisor, the
|
||||||
|
ACRN device model, and documentation.
|
||||||
|
|
||||||
|
ACRN's key features include:
|
||||||
|
|
||||||
|
* Small footprint
|
||||||
|
* Built with real-time in mind
|
||||||
|
* Virtualization of embedded IoT device functions
|
||||||
|
* Safety-critical workload considerations
|
||||||
|
* Adaptable
|
||||||
|
* Open Source
|
||||||
|
|
||||||
|
This version 0.1 release has the following software components:
|
||||||
|
|
||||||
|
* The ACRN Hypervisor
|
||||||
|
* The ACRN Device Model
|
||||||
|
* The ACRN Virtio framework
|
||||||
|
* The ACRN Block & NIC & console Virtio drivers
|
||||||
|
* The ACRN Virtio Backend Service(VBS) & Virtio and Hypervisor Service Module(VHM).
|
||||||
|
|
||||||
|
Version 0.1 features include:
|
||||||
|
|
||||||
|
* ACRN hypervisor (Type 1 hypervisor)
|
||||||
|
* A hybrid VMM architecture implementation
|
||||||
|
* Multiple User OS supported
|
||||||
|
* VM management - such as VM start/stop/pause, virtual CPU pause/resume
|
||||||
|
* CPU virtualization
|
||||||
|
* Memory virtualization
|
||||||
|
* I/O emulation
|
||||||
|
* Virtual interrupt
|
||||||
|
* VT-x and VT-d support
|
||||||
|
* Hypercall for guest
|
||||||
|
* Device emulation
|
||||||
|
* Device pass-through mechanism
|
||||||
|
* Device Emulation mechanism
|
||||||
|
* Virtio console
|
||||||
|
* Virt-network
|
49
scripts/filter-doc-log.sh
Executable file
@ -0,0 +1,49 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# run the filter-known-issues.py script to remove "expected" warning
|
||||||
|
# messages from the output of the document build process and write
|
||||||
|
# the filtered output to stdout
|
||||||
|
#
|
||||||
|
# Only argument is the name of the log file saved by the build.
|
||||||
|
|
||||||
|
KI_SCRIPT=scripts/filter-known-issues.py
|
||||||
|
CONFIG_DIR=.known-issues/doc
|
||||||
|
|
||||||
|
LOG_FILE=$1
|
||||||
|
|
||||||
|
if [ -z "${LOG_FILE}" ]; then
|
||||||
|
echo "Error in $0: missing input parameter <logfile>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# When running in background, detached from terminal jobs, tput will
|
||||||
|
# fail; we usually can tell because there is no TERM env variable.
|
||||||
|
if [ -z "${TERM:-}" -o "${TERM:-}" = dumb ]; then
|
||||||
|
TPUT="true"
|
||||||
|
red=''
|
||||||
|
green=''
|
||||||
|
else
|
||||||
|
TPUT="tput"
|
||||||
|
red='\E[31m'
|
||||||
|
green='\e[32m'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -s "${LOG_FILE}" ]; then
|
||||||
|
$KI_SCRIPT --config-dir ${CONFIG_DIR} ${LOG_FILE} > doc.warnings 2>&1
|
||||||
|
if [ -s doc.warnings ]; then
|
||||||
|
echo
|
||||||
|
echo -e "${red}New errors/warnings found, please fix them:"
|
||||||
|
echo -e "=============================================="
|
||||||
|
$TPUT sgr0
|
||||||
|
echo
|
||||||
|
cat doc.warnings
|
||||||
|
echo
|
||||||
|
else
|
||||||
|
echo -e "${green}No new errors/warnings."
|
||||||
|
$TPUT sgr0
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
echo "Error in $0: logfile \"${LOG_FILE}\" not found."
|
||||||
|
exit 1
|
||||||
|
fi
|
254
scripts/filter-known-issues.py
Executable file
@ -0,0 +1,254 @@
|
|||||||
|
#! /usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Filters a file, classifying output in errors, warnings and discarding
|
||||||
|
the rest.
|
||||||
|
|
||||||
|
Given a set of regular expresions read from files named *.conf in the
|
||||||
|
given configuration path(s), of the format:
|
||||||
|
|
||||||
|
#
|
||||||
|
# Comments for multiline regex 1...
|
||||||
|
#
|
||||||
|
MULTILINEPYTHONREGEX
|
||||||
|
MULTILINEPYTHONREGEX
|
||||||
|
MULTILINEPYTHONREGEX
|
||||||
|
#
|
||||||
|
# Comments for multiline regex 2...
|
||||||
|
#
|
||||||
|
#WARNING
|
||||||
|
MULTILINEPYTHONREGEX2
|
||||||
|
MULTILINEPYTHONREGEX2
|
||||||
|
|
||||||
|
Anything matched by MULTILINEPYTHONREGEX will be considered something
|
||||||
|
to be filtered out and not printed.
|
||||||
|
|
||||||
|
Anything matched by MULTILINEPYHONREGEX with a #WARNING tag in the
|
||||||
|
comment means (optional) means that it describes something that is
|
||||||
|
considered to be a warning. Print it to stderr.
|
||||||
|
|
||||||
|
Anything leftover is considred to be errors, printed to stdout.
|
||||||
|
|
||||||
|
"""
|
||||||
|
import argparse
|
||||||
|
import logging
|
||||||
|
import mmap
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sre_constants
|
||||||
|
import sys
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
exclude_regexs = []
|
||||||
|
|
||||||
|
# first is a list of one or more comment lines
|
||||||
|
# followed by a list of non-comments which describe a multiline regex
|
||||||
|
config_regex = \
|
||||||
|
b"(?P<comment>(^\s*#.*\n)+)" \
|
||||||
|
b"(?P<regex>(^[^#].*\n)+)"
|
||||||
|
|
||||||
|
|
||||||
|
def config_import_file(filename):
|
||||||
|
"""
|
||||||
|
Imports regular expresions from any file *.conf in the given path,
|
||||||
|
format as given in the main doc
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
with open(filename, "rb") as f:
|
||||||
|
mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
|
||||||
|
# That regex basically selects any block of
|
||||||
|
# lines that is not a comment block. The
|
||||||
|
# finditer() finds all the blocks and selects
|
||||||
|
# the bits of mmapped-file that comprises
|
||||||
|
# each--we compile it into a regex and append.
|
||||||
|
for m in re.finditer(config_regex, mm, re.MULTILINE):
|
||||||
|
origin = "%s:%s-%s" % (filename, m.start(), m.end())
|
||||||
|
gd = m.groupdict()
|
||||||
|
comment = gd['comment']
|
||||||
|
regex = gd['regex']
|
||||||
|
try:
|
||||||
|
r = re.compile(regex, re.MULTILINE)
|
||||||
|
except sre_constants.error as e:
|
||||||
|
logging.error("%s: bytes %d-%d: bad regex: %s",
|
||||||
|
filename, m.start(), m.end(), e)
|
||||||
|
raise
|
||||||
|
logging.debug("%s: found regex at bytes %d-%d: %s",
|
||||||
|
filename, m.start(), m.end(), regex)
|
||||||
|
if b'#WARNING' in comment:
|
||||||
|
exclude_regexs.append((r, origin, ('warning',)))
|
||||||
|
else:
|
||||||
|
exclude_regexs.append((r, origin, ()))
|
||||||
|
logging.debug("%s: loaded", filename)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error("E: %s: can't load config file: %s" % (filename, e))
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def config_import_path(path):
|
||||||
|
"""
|
||||||
|
Imports regular expresions from any file *.conf in the given path
|
||||||
|
"""
|
||||||
|
file_regex = re.compile(".*\.conf$")
|
||||||
|
try:
|
||||||
|
for dirpath, dirnames, filenames in os.walk(path):
|
||||||
|
for _filename in sorted(filenames):
|
||||||
|
filename = os.path.join(dirpath, _filename)
|
||||||
|
if not file_regex.search(_filename):
|
||||||
|
logging.debug("%s: ignored", filename)
|
||||||
|
continue
|
||||||
|
config_import_file(filename)
|
||||||
|
except Exception as e:
|
||||||
|
raise Exception(
|
||||||
|
"E: %s: can't load config files: %s %s" %
|
||||||
|
(path, e, traceback.format_exc()))
|
||||||
|
|
||||||
|
|
||||||
|
def config_import(paths):
|
||||||
|
"""
|
||||||
|
Imports regular expresions from any file *.conf in the list of paths.
|
||||||
|
|
||||||
|
If a path is "" or None, the list of paths until then is flushed
|
||||||
|
and only the new ones are considered.
|
||||||
|
"""
|
||||||
|
_paths = []
|
||||||
|
# Go over the list, flush it if the user gave an empty path ("")
|
||||||
|
for path in paths:
|
||||||
|
if path == "" or path is None:
|
||||||
|
logging.debug("flushing current config list: %s", _paths)
|
||||||
|
_paths = []
|
||||||
|
else:
|
||||||
|
_paths.append(path)
|
||||||
|
logging.debug("config list: %s", _paths)
|
||||||
|
for path in _paths:
|
||||||
|
config_import_path(path)
|
||||||
|
|
||||||
|
|
||||||
|
arg_parser = argparse.ArgumentParser(
|
||||||
|
description=__doc__,
|
||||||
|
formatter_class=argparse.RawDescriptionHelpFormatter)
|
||||||
|
arg_parser.add_argument("-v", "--verbosity", action="count", default=0,
|
||||||
|
help="increase verbosity")
|
||||||
|
arg_parser.add_argument("-q", "--quiet", action="count", default=0,
|
||||||
|
help="decrease verbosity")
|
||||||
|
arg_parser.add_argument("-e", "--errors", action="store", default=None,
|
||||||
|
help="file where to store errors")
|
||||||
|
arg_parser.add_argument("-w", "--warnings", action="store", default=None,
|
||||||
|
help="file where to store warnings")
|
||||||
|
arg_parser.add_argument("-c", "--config-dir", action="append", nargs="?",
|
||||||
|
default=[".known-issues/"],
|
||||||
|
help="configuration directory (multiple can be "
|
||||||
|
"given; if none given, clears the current list) "
|
||||||
|
"%(default)s")
|
||||||
|
arg_parser.add_argument("FILENAMEs", nargs="+",
|
||||||
|
help="files to filter")
|
||||||
|
args = arg_parser.parse_args()
|
||||||
|
|
||||||
|
logging.basicConfig(level=40 - 10 * (args.verbosity - args.quiet),
|
||||||
|
format="%(levelname)s: %(message)s")
|
||||||
|
|
||||||
|
path = ".known-issues/"
|
||||||
|
logging.debug("Reading configuration from directory `%s`", path)
|
||||||
|
config_import(args.config_dir)
|
||||||
|
|
||||||
|
exclude_ranges = []
|
||||||
|
|
||||||
|
if args.warnings:
|
||||||
|
warnings = open(args.warnings, "w")
|
||||||
|
else:
|
||||||
|
warnings = None
|
||||||
|
if args.errors:
|
||||||
|
errors = open(args.errors, "w")
|
||||||
|
else:
|
||||||
|
errors = None
|
||||||
|
|
||||||
|
|
||||||
|
def report_error(data):
|
||||||
|
sys.stdout.write(data)
|
||||||
|
if errors:
|
||||||
|
errors.write(data)
|
||||||
|
|
||||||
|
|
||||||
|
def report_warning(data):
|
||||||
|
sys.stderr.write(data)
|
||||||
|
if warnings:
|
||||||
|
warnings.write(data)
|
||||||
|
|
||||||
|
|
||||||
|
if args.warnings:
|
||||||
|
warnings = open(args.warnings, "w")
|
||||||
|
else:
|
||||||
|
warnings = None
|
||||||
|
if args.errors:
|
||||||
|
errors = open(args.errors, "w")
|
||||||
|
else:
|
||||||
|
errors = None
|
||||||
|
|
||||||
|
|
||||||
|
def report_error(data):
|
||||||
|
sys.stdout.write(data.decode('utf-8'))
|
||||||
|
if errors:
|
||||||
|
errors.write(data)
|
||||||
|
|
||||||
|
|
||||||
|
def report_warning(data):
|
||||||
|
sys.stderr.write(data)
|
||||||
|
if warnings:
|
||||||
|
warnings.write(data)
|
||||||
|
|
||||||
|
|
||||||
|
for filename in args.FILENAMEs:
|
||||||
|
if os.stat(filename).st_size == 0:
|
||||||
|
continue # skip empty log files
|
||||||
|
try:
|
||||||
|
with open(filename, "r+b") as f:
|
||||||
|
logging.info("%s: filtering", filename)
|
||||||
|
# Yeah, this should be more protected in case of exception
|
||||||
|
# and such, but this is a short running program...
|
||||||
|
mm = mmap.mmap(f.fileno(), 0)
|
||||||
|
for ex, origin, flags in exclude_regexs:
|
||||||
|
logging.info("%s: searching from %s: %s",
|
||||||
|
filename, origin, ex.pattern)
|
||||||
|
for m in re.finditer(ex.pattern, mm, re.MULTILINE):
|
||||||
|
logging.info("%s: %s-%s: match from from %s %s",
|
||||||
|
filename, m.start(), m.end(), origin, flags)
|
||||||
|
if 'warning' in flags:
|
||||||
|
exclude_ranges.append((m.start(), m.end(), True))
|
||||||
|
else:
|
||||||
|
exclude_ranges.append((m.start(), m.end(), False))
|
||||||
|
|
||||||
|
exclude_ranges = sorted(exclude_ranges, key=lambda r: r[0])
|
||||||
|
logging.warning(
|
||||||
|
"%s: ranges excluded: %s",
|
||||||
|
filename,
|
||||||
|
exclude_ranges)
|
||||||
|
|
||||||
|
# Decide what to do with what has been filtered; warnings
|
||||||
|
# go to stderr and warnings file, errors to stdout, what
|
||||||
|
# is ignored is just dumped.
|
||||||
|
offset = 0
|
||||||
|
for b, e, warning in exclude_ranges:
|
||||||
|
mm.seek(offset)
|
||||||
|
if b > offset:
|
||||||
|
# We have something not caught by a filter, an error
|
||||||
|
logging.info("%s: error range (%d, %d), from %d %dB",
|
||||||
|
filename, offset, b, offset, b - offset)
|
||||||
|
report_error(mm.read(b - offset))
|
||||||
|
mm.seek(b)
|
||||||
|
if warning == True: # A warning, print it
|
||||||
|
mm.seek(b)
|
||||||
|
logging.info("%s: warning range (%d, %d), from %d %dB",
|
||||||
|
filename, b, e, offset, e - b)
|
||||||
|
report_warning(mm.read(e - b))
|
||||||
|
else: # Exclude, ignore it
|
||||||
|
d = b - offset
|
||||||
|
logging.info("%s: exclude range (%d, %d), from %d %dB",
|
||||||
|
filename, b, e, offset, d)
|
||||||
|
offset = e
|
||||||
|
mm.seek(offset)
|
||||||
|
if len(mm) != offset:
|
||||||
|
logging.info("%s: error final range from %d %dB",
|
||||||
|
filename, offset, len(mm))
|
||||||
|
report_error(mm.read(len(mm) - offset - 1))
|
||||||
|
del mm
|
||||||
|
except Exception as e:
|
||||||
|
logging.error("%s: cannot load: %s", filename, e)
|
||||||
|
raise
|
5
scripts/publish-README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# projectacrn.github.io
|
||||||
|
This is the Project ACRN Documentation Publishing site for GitHub Pages.
|
||||||
|
Content changes are not made directly in this repo. Instead, edit content
|
||||||
|
in the acrn-documentation repo, re-generate the HTML with Sphinx, and push
|
||||||
|
the updated content here for publishing.
|
10
scripts/publish-index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>ACRN Hypervisor documentation</title>
|
||||||
|
<meta http-equiv="refresh" content="0; URL=latest/index.html">
|
||||||
|
<meta name="keywords" content="automatic redirection">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
Please visit the <a href="/latest/">latest ACRN documentation</a>
|
||||||
|
</body>
|
||||||
|
</html>
|
30
scripts/pullsource.sh
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
q="--quiet"
|
||||||
|
|
||||||
|
# pull fresh copies of the ACRN source for use by doxygen
|
||||||
|
|
||||||
|
if [ ! -d "../acrn-hypervisor" ]; then
|
||||||
|
echo Repo for acrn-hypervisor is missing.
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
if [ ! -d "../acrn-devicemodel" ]; then
|
||||||
|
echo Repo for acrn-devicemodel is missing.
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Assumes origin (personal) and upstream (project) remote repos are
|
||||||
|
# setup
|
||||||
|
|
||||||
|
cd ../acrn-hypervisor
|
||||||
|
git checkout $q master;
|
||||||
|
git fetch $q upstream
|
||||||
|
git merge $q upstream/master
|
||||||
|
git push $q origin master
|
||||||
|
|
||||||
|
|
||||||
|
cd ../acrn-devicemodel
|
||||||
|
git checkout $q master;
|
||||||
|
git fetch $q upstream
|
||||||
|
git merge $q upstream/master
|
||||||
|
git push $q origin master
|
4
scripts/requirements.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
breathe==4.7.3
|
||||||
|
sphinx==1.6.7
|
||||||
|
docutils==0.14
|
||||||
|
sphinx_rtd_theme
|
113
static/acrn-custom.css
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/* -- Extra CSS styles for ACRN content (RTD theme) ----------------------- */
|
||||||
|
|
||||||
|
/* make the page width fill the window */
|
||||||
|
.wy-nav-content {
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (temporarily) add an under development tagline to the bread crumb
|
||||||
|
.wy-breadcrumbs::after {
|
||||||
|
content: " (Content under development)";
|
||||||
|
background-color: #FFFACD;
|
||||||
|
color: red;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* tweak doc version selection
|
||||||
|
.rst-versions {
|
||||||
|
position: static;
|
||||||
|
border-top: none;
|
||||||
|
padding: 0px;
|
||||||
|
} */
|
||||||
|
|
||||||
|
.rst-versions .rst-current-version {
|
||||||
|
padding: 5px;
|
||||||
|
background-color: #2980B9;
|
||||||
|
color: #80FF80;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-versions .rst-other-versions {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.rst-other-versions dl {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* code block highlight color in rtd changed to lime green, no no no */
|
||||||
|
|
||||||
|
.rst-content tt.literal, .rst-content code.literal, .highlight {
|
||||||
|
background: #f0f0f0;
|
||||||
|
}
|
||||||
|
.rst-content tt.literal, .rst-content code.literal {
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make the version number more visible */
|
||||||
|
.wy-side-nav-search>div.version {
|
||||||
|
color: rgba(255,255,255,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* squish the space between a paragraph before a list */
|
||||||
|
div > p + ul, div > p + ol {
|
||||||
|
margin-top: -20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add some space before the figure caption */
|
||||||
|
p.caption {
|
||||||
|
# border-top: 1px solid;
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add a colon after the figure/table number (before the caption) */
|
||||||
|
span.caption-number::after {
|
||||||
|
content: ": ";
|
||||||
|
}
|
||||||
|
|
||||||
|
p.extrafooter {
|
||||||
|
text-align: right;
|
||||||
|
margin-top: -36px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.align-center {
|
||||||
|
display: table !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.code-block-caption {
|
||||||
|
color: #000;
|
||||||
|
font: italic 85%/1 arial,sans-serif;
|
||||||
|
padding: 1em 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
`
|
||||||
|
/* make .. hlist:: tables fill the page */
|
||||||
|
table.hlist {
|
||||||
|
width: 95% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* override rtd theme white-space no-wrap in table heading and content */
|
||||||
|
th,td {
|
||||||
|
white-space: normal !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* dbk tweak for doxygen-generated API headings (for RTD theme) */
|
||||||
|
.rst-content dl.group>dt, .rst-content dl.group>dd>p {
|
||||||
|
display:none !important;
|
||||||
|
}
|
||||||
|
.rst-content dl.group {
|
||||||
|
margin: 0 0 12px 0px;
|
||||||
|
}
|
||||||
|
.rst-content dl.group>dd {
|
||||||
|
margin-left: 0 !important;
|
||||||
|
}
|
||||||
|
.rst-content p.breathe-sectiondef-title {
|
||||||
|
text-decoration: underline; /* dbk for API sub-headings */
|
||||||
|
font-size: 1.25rem;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
.rst-content div.breathe-sectiondef {
|
||||||
|
padding-left: 0 !important;
|
||||||
|
}
|