From 394bf30dbf0c384a5038dd6603473a1ac8d71ee0 Mon Sep 17 00:00:00 2001 From: Dirk Zimoch Date: Wed, 9 Nov 2016 11:54:52 +0100 Subject: [PATCH] use dynamic vxWorks BSP function binding because we don't know which functions are implememted in any particular BSP --- src/libCom/osi/os/vxWorks/devLibVMEOSD.c | 66 +++++++++--------------- 1 file changed, 24 insertions(+), 42 deletions(-) diff --git a/src/libCom/osi/os/vxWorks/devLibVMEOSD.c b/src/libCom/osi/os/vxWorks/devLibVMEOSD.c index 82bec603d..46e7a1852 100644 --- a/src/libCom/osi/os/vxWorks/devLibVMEOSD.c +++ b/src/libCom/osi/os/vxWorks/devLibVMEOSD.c @@ -110,7 +110,22 @@ static long vxDevWriteProbe (unsigned wordSize, volatile void *ptr, const void * static void *devA24Malloc(size_t size); static void devA24Free(void *pBlock); -static long devInit(void) { return 0;} + + +static int (*sysIntEnableFunc)(int) = NULL; +static int (*sysIntDisableFunc)(int) = NULL; +static int (*sysIntEnablePICFunc)(int) = NULL; +static int (*sysIntDisablePICFunc)(int) = NULL; + +static long devInit(void) +{ + /* We don't know which functions are implemented in the BSP */ + sysIntEnableFunc = epicsFindSymbol ("sysIntEnable"); + sysIntDisableFunc = epicsFindSymbol ("sysIntDisable"); + sysIntDisablePICFunc = epicsFindSymbol ("sysIntDisablePIC"); + sysIntEnablePICFunc = epicsFindSymbol ("sysIntEnablePIC"); + return 0; +} static long vxDevConnectInterruptVME ( unsigned vectorNumber, @@ -214,16 +229,8 @@ static long vxDevDisconnectInterruptVME ( */ static long vxDevEnableInterruptLevelVME (unsigned level) { -# if CPU_FAMILY != I80X86 - int s; - s = sysIntEnable (level); - if (s!=OK) { - return S_dev_intEnFail; - } - return 0; -# else - return S_dev_intEnFail; -# endif + if (!sysIntEnableFunc) return S_dev_intEnFail; + return sysIntEnableFunc (level) == OK ? 0 : S_dev_intEnFail; } /* @@ -231,16 +238,8 @@ static long vxDevEnableInterruptLevelVME (unsigned level) */ long devEnableInterruptLevelISA (unsigned level) { -# if CPU_FAMILY == I80X86 - int s; - s = sysIntEnablePIC (level); - if (s!=OK) { - return S_dev_intEnFail; - } - return 0; -# else - return S_dev_intEnFail; -# endif + if (!sysIntEnablePICFunc) return S_dev_intEnFail; + return sysIntEnablePICFunc (level) == OK ? 0 : S_dev_intEnFail; } /* @@ -248,17 +247,8 @@ long devEnableInterruptLevelISA (unsigned level) */ long devDisableInterruptLevelISA (unsigned level) { -# if CPU_FAMILY == I80X86 - int s; - s = sysIntDisablePIC (level); - if (s!=OK) { - return S_dev_intEnFail; - } -# else - return S_dev_intEnFail; -# endif - - return 0; + if (!sysIntDisablePICFunc) return S_dev_intDissFail; + return sysIntDisablePICFunc (level) == OK ? 0 : S_dev_intDissFail; } /* @@ -266,16 +256,8 @@ long devDisableInterruptLevelISA (unsigned level) */ static long vxDevDisableInterruptLevelVME (unsigned level) { -# if CPU_FAMILY != I80X86 - int s; - s = sysIntDisable (level); - if (s!=OK) { - return S_dev_intDissFail; - } - return 0; -# else - return S_dev_intEnFail; -# endif + if (!sysIntDisableFunc) return S_dev_intDissFail; + return sysIntDisableFunc (level) == OK ? 0 : S_dev_intDissFail; } /*