diff options
author | Steve Marple <stevemarple@googlemail.com> | 2022-06-22 15:43:51 +0100 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2022-08-15 13:24:46 +0000 |
commit | 903f2e92a143acf66fcaa82e628c1672fdd0da9f (patch) | |
tree | bf7cac4ff97bb7d86c425aebe0fd6cba723f57dc | |
parent | ace028262ba0bda0e921afb11e6eb7d87708d889 (diff) | |
download | riscv-openocd-903f2e92a143acf66fcaa82e628c1672fdd0da9f.zip riscv-openocd-903f2e92a143acf66fcaa82e628c1672fdd0da9f.tar.gz riscv-openocd-903f2e92a143acf66fcaa82e628c1672fdd0da9f.tar.bz2 |
drivers/am335xgpio: Release resources on error and when quitting
The /dev/mem file descriptor can be closed without invalidating the
mappings so close as soon as possible.
munmap() all memory, either on error or from quit.
Change-Id: I9466edd2f43791e64f2dce719957c67728f3ec06
Signed-off-by: Steve Marple <stevemarple@googlemail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/7047
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
-rw-r--r-- | src/jtag/drivers/am335xgpio.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/jtag/drivers/am335xgpio.c b/src/jtag/drivers/am335xgpio.c index 5b68b6d..ae58b16 100644 --- a/src/jtag/drivers/am335xgpio.c +++ b/src/jtag/drivers/am335xgpio.c @@ -377,6 +377,13 @@ static bool am335xgpio_swd_mode_possible(void) return true; } +static void am335xgpio_munmap(void) +{ + for (unsigned int i = 0; i < AM335XGPIO_NUM_GPIO_CHIPS && am335xgpio_gpio_chip_mmap_addr[i] != MAP_FAILED; ++i) + if (munmap((void *)am335xgpio_gpio_chip_mmap_addr[i], sysconf(_SC_PAGE_SIZE)) < 0) + LOG_ERROR("Cannot unmap GPIO memory for chip %d: %s", i, strerror(errno)); +} + static int am335xgpio_init(void) { LOG_INFO("AM335x GPIO JTAG/SWD bitbang driver"); @@ -410,10 +417,12 @@ static int am335xgpio_init(void) if (am335xgpio_gpio_chip_mmap_addr[i] == MAP_FAILED) { LOG_ERROR("mmap: %s", strerror(errno)); + am335xgpio_munmap(); close(dev_mem_fd); return ERROR_JTAG_INIT_FAILED; } } + close(dev_mem_fd); /* Configure JTAG/SWD signals. Default directions and initial states are handled * by adapter.c and "adapter gpio" command. @@ -476,6 +485,8 @@ static int am335xgpio_quit(void) restore_gpio(ADAPTER_GPIO_IDX_SRST); restore_gpio(ADAPTER_GPIO_IDX_LED); + am335xgpio_munmap(); + return ERROR_OK; } |