[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Xen Arm vpl011 UART will cause segmentation fault in Linux guest


  • To: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Jiamei Xie <Jiamei.Xie@xxxxxxx>
  • Date: Wed, 9 Nov 2022 07:20:01 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com])
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
  • Arc-message-signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=gG+eAfoMX89UgH13kRKbv2U1hpK/zgkSDnWE7oJPfBU=; b=LHR5XTvCukMv/pU/OX4mcOuJLiI2mV8bPnMO5FXo7RO1iXZYqyQF+QkVQcGJ+g6ZsO89vLgR14KzoelBgnz0RSF3FZDtvEyDy3jFqyd7WWC4nbimQfbAi/aF1RiOELw3LvIigE0aJF9AdJFBnkUB3e1Sw0r4+TQhUqhb6GKFDyfGt+P7GucXlN7HMEjkf7BFe6fE9SW9gSi3zFlxsy+7H2rf/yykVyO3xoLgsNJupf4CN9KjCGhzMnq10CRC9rdsW6u66bIdCxczkb5qvJhNI70/EuA3Ctz5kPH3MQOVkNfwJca0yju/O9Mw1JB3hmSqSW+c+29f3iddFQnwJOH3Eg==
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=gG+eAfoMX89UgH13kRKbv2U1hpK/zgkSDnWE7oJPfBU=; b=RhlzzTHWpE9qkgqptSfATnbpgWagoU0zN+CeQwelEN2h6OLuVwhXemXsX6t1+5lXbOn/wkANtGJil4SptTWEyvkXgUVUJiIrWwgp9LU6SOQI1LLe8tqPq08Z0RaJulgPGKrvTWFIk890+lPbToEvFqKttWKHuwGrtx2YwsBHCVBm4aNAP5smzV+e0TXbX7Jxdh1IBqNYo6qCxnC51j341eLpA1FZ7Vp08g7Fslf0IAQlIeMBY+Bc1lcRcrnG5Gg2tJ0VOONf9uVXETJC7DzTr6Ww6aqflvsxkNev6OkYOzm8ZSz0tf8EzWCKwUmJVRPJn/ptka6dq7qRMQgTOfzwDQ==
  • Arc-seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=daEl58Gh7ruzImDboiIUI5plqlgPoFVH4ezMxHNLcViM6691Is8gKYSEujU8a8xRX+i8S7oj2jOEzlpK08ZCokZ8OHtpyxRwirDQDjXd7iz8ukdbp1sXiDv6XzHYXf3swzh0NoF+asap6CDGBxIFYRYLgWzI10CFMHZ7Eg1TNU+0tm4bUwZqIvyEbgX9cSAMxO6LnXqZR1lnLmFKG7Dui/0A4PQkh4pFyejtXf2LdrN7pQU0RvN+P+KgRsYhoJqNnYI7XohlafKuDAyJ3wXaRipHvDFId2kzxc0x0tbbONC4jUufYZLx0Q6RSVqwYBPWylN5VcRvv82/WL+Dk6GvQw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=afb6/mAP5WS+Ai9z+ebAU1SyxBPUlESekfOAQfJY30XkOWsbvx3w7+9RFsTlZ4gXWhwvfiOTj6YyX8E6IrWrjD0lj2XxXvGMmHKqZGvmRcZWkGL0qGVop6FAogy8kS7mr4hrebE3cG5a63O6r9zZrgj0Z4UxVTzOWr8nUcw6Cqk2NSepdTXnLHAKbM8fz2+qD+xWZ4dJNQeH8r8ECJGv2BuxiBgE2vuwWy/uNAkKvZv2uyHfAyQ1WTj2y+g8+0ag3jxt9fXMp75KVLz0XhkjZ/HnAfVrRwkbfM50zIEVCvrmgVPRAk0wv1oPDVjV0F7vh7mF8oEMtA/2MvV+9t3CxQ==
  • Authentication-results-original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Cc: Wei Chen <Wei.Chen@xxxxxxx>, Bertrand Marquis <Bertrand.Marquis@xxxxxxx>, "julien@xxxxxxx" <julien@xxxxxxx>, "sstabellini@xxxxxxxxxx" <sstabellini@xxxxxxxxxx>
  • Delivery-date: Wed, 09 Nov 2022 07:20:25 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true
  • Original-authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Thread-index: Adj0C3U97KqJOGXWTaWwFEv08mPlLw==
  • Thread-topic: Xen Arm vpl011 UART will cause segmentation fault in Linux guest

Hi all,

When the guest kernel enables DMA engine with "CONFIG_DMA_ENGINE=y", Linux AMBA 
PL011 driver will access PL011 DMACR register. But this register have not been 
supported by vpl011 of Xen. Xen will inject a data abort into guest, this will 
cause segmentation fault of guest with the below message:
Unhandled fault at 0xffffffc00944d048
Mem abort info:
ESR = 0x96000000
EC = 0x25: DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
FSC = 0x00: ttbr address size fault
Data abort info:
ISV = 0, ISS = 0x00000000
CM = 0, WnR = 0
swapper pgtable: 4k pages, 39-bit VAs, pgdp=0000000020e2e000
[ffffffc00944d048] pgd=100000003ffff803, p4d=100000003ffff803, 
pud=100000003ffff803, pmd=100000003fffa803, pte=006800009c090f13
Internal error: ttbr address size fault: 96000000 [#1] PREEMPT SMP
Modules linked in:
CPU: 0 PID: 132 Comm: bootlogd Not tainted 5.15.44-yocto-standard #1
pstate: 604000c5 (nZCv daIF +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : pl011_stop_rx+0x70/0x80
lr : uart_tty_port_shutdown+0x44/0x110
sp : ffffffc00999bba0
x29: ffffffc00999bba0 x28: ffffff80234ac380 x27: ffffff8022f5d000
x26: 0000000000000000 x25: 0000000045585401 x24: 0000000000000000
x23: ffffff8021ba4660 x22: 0000000000000001 x21: ffffff8021a0e2a0
x20: ffffff802198f880 x19: ffffff8021a0e1a0 x18: 0000000000000000
x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000
x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000
x11: 0000000000000000 x10: 0000000000000000 x9 : ffffffc00871ba14
x8 : ffffffc0099de260 x7 : ffffff8021a0e318 x6 : 0000000000000003
x5 : ffffffc009315f20 x4 : ffffffc00944d038 x3 : 0000000000000000
x2 : ffffffc00944d048 x1 : 0000000000000000 x0 : 0000000000000048
Call trace:
pl011_stop_rx+0x70/0x80
tty_port_shutdown+0x7c/0xb4
tty_port_close+0x60/0xcc
uart_close+0x34/0x8c
tty_release+0x144/0x4c0
__fput+0x78/0x220
____fput+0x1c/0x30
task_work_run+0x88/0xc0
do_notify_resume+0x8d0/0x123c
el0_svc+0xa8/0xc0
el0t_64_sync_handler+0xa4/0x130
el0t_64_sync+0x1a0/0x1a4
Code: b9000083 b901f001 794038a0 8b000042 (b9000041)
---[ end trace 83dd93df15c3216f ]---
note: bootlogd[132] exited with preempt_count 1
/etc/rcS.d/S07bootlogd: line 47: 132 Segmentation fault start-stop-daemon
In Xen, vpl011_mmio_write doesn't handle DMACR . And kernel doesn't check if 
pl011_write executes sucessfully in pl011_dma_rx_stop . So such segmentation 
fault occurs.
static inline void pl011_dma_rx_stop(struct uart_amba_port *uap)
{
        /* FIXME.  Just disable the DMA enable */
        uap->dmacr &= ~UART011_RXDMAE;
        pl011_write(uap->dmacr, uap, REG_DMACR);
}

I think we should prevent such segmentation fault. We have checked the PL011 
spec, it seems there is not any register bit can indicate DMA support status of 
PL011. We might have two options:
1. Option#1 is to add DMA support for vpl011, but this is not trivial.
2. Option#2 is to ignore the write to DMACR, and return 0 for DMACR read in 
vpl011. But this option need co-work with kernel, because current Linux PL011 
driver assume the write operation will never be failed, and will not fallback 
to no-DMA mode, when Xen return 0 for DMA enabled bit in DMACR.

How do you think about it?  Any suggestion about it is welcome. Thanks.

Best wishes
Jiamei Xie



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.