[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XEN v4 04/11] xen/drivers: ns16550: Use paddr_t for io_base/io_size
On 29.03.2023 16:35, Ayan Kumar Halder wrote: > Please let me know if the below patch looks fine. Apart from the comments below there may be formatting issues, which I can't sensibly comment on when the patch was mangled by your mailer anyway. (Which in turn is why it is generally better to properly send a new version, rather than replying with kind-of-a-new-version on an earlier thread.) Additionally, up front: I'm sorry for the extra requests, but I'm afraid to sensibly make the changes you want to make some things need sorting first, to avoid extending pre-existing clumsiness. This is irrespective of the present state of things clearly not being your fault. > @@ -1235,6 +1235,8 @@ pci_uart_config(struct ns16550 *uart, bool_t > skip_amt, unsigned int idx) > /* MMIO based */ > if ( param->mmio && !(bar & PCI_BASE_ADDRESS_SPACE_IO) ) > { > + uint64_t pci_uart_io_base; > + > pci_conf_write32(PCI_SBDF(0, b, d, f), > PCI_BASE_ADDRESS_0 + bar_idx*4, ~0u); > len = pci_conf_read32(PCI_SBDF(0, b, d, f), > @@ -1259,8 +1261,17 @@ pci_uart_config(struct ns16550 *uart, bool_t > skip_amt, unsigned int idx) > else > size = len & PCI_BASE_ADDRESS_MEM_MASK; > > - uart->io_base = ((u64)bar_64 << 32) | > - (bar & PCI_BASE_ADDRESS_MEM_MASK); > + pci_uart_io_base = ((uint64_t)bar_64 << 32) | > + (bar & PCI_BASE_ADDRESS_MEM_MASK); > + > + /* Truncation detected while converting to paddr_t */ > + if ( pci_uart_io_base != (paddr_t)pci_uart_io_base ) > + { > + printk("ERROR: Truncation detected for io_base > address"); > + return -EINVAL; > + } Further down the function returns -1, so here you assume EINVAL != 1. Such assumptions (and mixing of value spaces) is generally not a good idea. Since there are other issues (see below), maybe you really want to add a prereq patch addressing those? That would include changing the "return -1" to either "return 1" or making it use some sensible and properly distinguishable errno value. > @@ -1519,20 +1530,40 @@ static bool __init parse_positional(struct > ns16550 *uart, char **str) > #ifdef CONFIG_HAS_PCI > if ( strncmp(conf, "pci", 3) == 0 ) > { > - if ( pci_uart_config(uart, 1/* skip AMT */, uart - > ns16550_com) ) > + int ret; > + > + ret = pci_uart_config(uart, 1/* skip AMT */, uart - > ns16550_com); > + > + if ( ret == -EINVAL ) > + return false; > + else if ( ret ) > return true; With skip_amt != 0 the function presently can only return 0. You're therefore converting pre-existing dead code to another form of dead code. Otoh (and as, I think, previously indicated) ... > + > conf += 3; > } > else if ( strncmp(conf, "amt", 3) == 0 ) > { > - if ( pci_uart_config(uart, 0, uart - ns16550_com) ) > + int ret = pci_uart_config(uart, 0, uart - ns16550_com); > + > + if ( ret == -EINVAL ) > + return false; > + else if ( ret ) > return true; ... the equivalent of this in parse_namevalue_pairs() not checking the return value is bogus. But it is further bogus that the case where skip_amt has passed 1 for it sets dev_set to true unconditionally, i.e. even when no device was found. IOW I also question the correctness of the final "return 0" in pci_uart_config(). I looks to me as if this wants to be a skip_amt-independent "return -ENODEV". skip_amt would only control whether uart->io_base is restored before returning (leaving aside the question of why that is). Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |