mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/console: introduce console input permission
Add new flag to domain structure for marking permission to intercept the physical console input by the domain. Update console input switch logic accordingly. No functional change intended. Signed-off-by: Denis Mukhin <dmukhin@ford.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
1 parent
82dc405bc1
commit
c2dddce4b9
5 files changed
+29
-2
No files matched your search
@@ -713,6 +713,7 @@ int domain_vpl011_init(struct domain *d, struct vpl011_init_info *info)
|
||||
}
|
||||
else
|
||||
{
|
||||
d->console.input_allowed = true;
|
||||
vpl011->backend_in_domain = false;
|
||||
|
||||
vpl011->backend.xen = xzalloc(struct vpl011_xen_backend);
|
||||
|
||||
@@ -238,6 +238,8 @@ void __init pv_shim_setup_dom(struct domain *d, l4_pgentry_t *l4start,
|
||||
* guest from depleting the shim memory pool.
|
||||
*/
|
||||
d->max_pages = domain_tot_pages(d);
|
||||
|
||||
d->console.input_allowed = true;
|
||||
}
|
||||
|
||||
static void write_start_info(struct domain *d)
|
||||
|
||||
@@ -831,6 +831,8 @@ struct domain *domain_create(domid_t domid,
|
||||
flags |= CDF_hardware;
|
||||
if ( old_hwdom )
|
||||
old_hwdom->cdf &= ~CDF_hardware;
|
||||
|
||||
d->console.input_allowed = true;
|
||||
}
|
||||
|
||||
/* Holding CDF_* internal flags. */
|
||||
|
||||
@@ -512,9 +512,21 @@ static unsigned int __read_mostly console_rx = 0;
|
||||
|
||||
struct domain *console_get_domain(void)
|
||||
{
|
||||
struct domain *d;
|
||||
|
||||
if ( console_rx == 0 )
|
||||
return NULL;
|
||||
return rcu_lock_domain_by_id(console_rx - 1);
|
||||
|
||||
d = rcu_lock_domain_by_id(console_rx - 1);
|
||||
if ( !d )
|
||||
return NULL;
|
||||
|
||||
if ( d->console.input_allowed )
|
||||
return d;
|
||||
|
||||
rcu_unlock_domain(d);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void console_put_domain(struct domain *d)
|
||||
@@ -551,6 +563,10 @@ static void console_switch_input(void)
|
||||
if ( d )
|
||||
{
|
||||
rcu_unlock_domain(d);
|
||||
|
||||
if ( !d->console.input_allowed )
|
||||
continue;
|
||||
|
||||
console_rx = next_rx;
|
||||
printk("*** Serial input to DOM%u", domid);
|
||||
break;
|
||||
|
||||
@@ -512,7 +512,7 @@ struct domain
|
||||
bool auto_node_affinity;
|
||||
/* Is this guest fully privileged (aka dom0)? */
|
||||
bool is_privileged;
|
||||
/* Can this guest access the Xen console? */
|
||||
/* XSM: permission to use HYPERCALL_console_io hypercall */
|
||||
bool is_console;
|
||||
/* Is this guest being debugged by dom0? */
|
||||
bool debugger_attached;
|
||||
@@ -651,6 +651,12 @@ struct domain
|
||||
unsigned int num_llc_colors;
|
||||
const unsigned int *llc_colors;
|
||||
#endif
|
||||
|
||||
/* Console settings. */
|
||||
struct {
|
||||
/* Permission to take ownership of the physical console input. */
|
||||
bool input_allowed;
|
||||
} console;
|
||||
} __aligned(PAGE_SIZE);
|
||||
|
||||
static inline struct page_list_head *page_to_list(
|
||||
|
||||