Module: xenomai-head Branch: master Commit: 3833f60a87ee2c0b09d576619f2ef86e2c6395fb URL: http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=3833f60a87ee2c0b09d576619f2ef86e2c6395fb
Author: Philippe Gerum <r...@xenomai.org> Date: Wed Sep 16 16:59:43 2009 +0200 nucleus: introduce arch-dep extension of the feature set Some archs may want to export additional (non-generic) information via the xnsysinfo struct to an application, when the latter binds to the real-time core. Introduce an arch-specific block within the xnsysinfo struct to convey them. --- include/asm-generic/bits/bind.h | 10 ++++++++-- include/asm-generic/features.h | 20 ++++++++++++++++++++ include/asm-generic/syscall.h | 28 ++++------------------------ ksrc/nucleus/shadow.c | 10 ++++++---- 4 files changed, 38 insertions(+), 30 deletions(-) diff --git a/include/asm-generic/bits/bind.h b/include/asm-generic/bits/bind.h index 87cef48..3684b21 100644 --- a/include/asm-generic/bits/bind.h +++ b/include/asm-generic/bits/bind.h @@ -154,6 +154,8 @@ void __attribute__((weak)) xeno_sigill_handler(int sig) exit(1); } +struct xnfeatinfo xeno_featinfo; + static inline int xeno_bind_skin(unsigned skin_magic, const char *skin, const char *module) { @@ -186,7 +188,7 @@ xeno_bind_skin(unsigned skin_magic, const char *skin, const char *module) fprintf(stderr, "Xenomai: incompatible ABI revision level\n"); fprintf(stderr, "(needed=%lu, current=%lu).\n", - XENOMAI_ABI_REV, finfo.abirev); + XENOMAI_ABI_REV, finfo.feat_abirev); exit(1); case -ENOSYS: @@ -237,6 +239,8 @@ xeno_bind_skin(unsigned skin_magic, const char *skin, const char *module) } #endif /* CONFIG_XENO_FASTSYNCH */ + xeno_featinfo = finfo; + return muxid; } @@ -271,7 +275,7 @@ xeno_bind_skin_opt(unsigned skin_magic, const char *skin, const char *module) fprintf(stderr, "Xenomai: incompatible ABI revision level\n"); fprintf(stderr, "(needed=%lu, current=%lu).\n", - XENOMAI_ABI_REV, finfo.abirev); + XENOMAI_ABI_REV, finfo.feat_abirev); exit(1); case -ENOSYS: @@ -311,6 +315,8 @@ xeno_bind_skin_opt(unsigned skin_magic, const char *skin, const char *module) } #endif /* CONFIG_XENO_FASTSYNCH */ + xeno_featinfo = finfo; + return muxid; } diff --git a/include/asm-generic/features.h b/include/asm-generic/features.h index dd5269e..ff53915 100644 --- a/include/asm-generic/features.h +++ b/include/asm-generic/features.h @@ -21,10 +21,30 @@ #ifdef __KERNEL__ #include <linux/version.h> +#ifndef xnfeatinfo_archdep +#define collect_arch_features(finfo) do { (void)(finfo); } while (0) +#endif /* !xnfeatinfo_archdep */ #else /* !__KERNEL__ */ #include <xeno_config.h> #endif /* __KERNEL__ */ +#define XNFEAT_STRING_LEN 64 + +typedef struct xnfeatinfo { + unsigned long feat_all; /* Available feature set. */ + char feat_all_s[XNFEAT_STRING_LEN]; + unsigned long feat_man; /* Mandatory features (when requested). */ + char feat_man_s[XNFEAT_STRING_LEN]; + unsigned long feat_req; /* Requested feature set. */ + char feat_req_s[XNFEAT_STRING_LEN]; + unsigned long feat_mis; /* Missing features. */ + char feat_mis_s[XNFEAT_STRING_LEN]; +#ifdef xnfeatinfo_archdep + struct xnfeatinfo_archdep feat_arch; /* Arch-dep extension. */ +#endif + unsigned long feat_abirev; /* ABI revision level. */ +} xnfeatinfo_t; + #define __xn_feat_smp 0x80000000 #define __xn_feat_nosmp 0x40000000 #define __xn_feat_fastsynch 0x20000000 diff --git a/include/asm-generic/syscall.h b/include/asm-generic/syscall.h index 1780d7f..09c9128 100644 --- a/include/asm-generic/syscall.h +++ b/include/asm-generic/syscall.h @@ -39,27 +39,9 @@ #define XENOMAI_LINUX_DOMAIN 0 #define XENOMAI_XENO_DOMAIN 1 -typedef struct xnfeatinfo { - -#define XNFEAT_STRING_LEN 64 - - unsigned long feat_all; /* Available feature set. */ - char feat_all_s[XNFEAT_STRING_LEN]; - unsigned long feat_man; /* Mandatory features (when requested). */ - char feat_man_s[XNFEAT_STRING_LEN]; - unsigned long feat_req; /* Requested feature set. */ - char feat_req_s[XNFEAT_STRING_LEN]; - unsigned long feat_mis; /* Missing features. */ - char feat_mis_s[XNFEAT_STRING_LEN]; - - unsigned long abirev; /* ABI revision level. */ - -} xnfeatinfo_t; - typedef struct xnsysinfo { - - unsigned long long cpufreq; /* CPU frequency */ - unsigned long tickval; /* Tick duration (ns) */ + unsigned long long cpufreq; /* CPU frequency */ + unsigned long tickval; /* Tick duration (ns) */ } xnsysinfo_t; #define SIGSHADOW SIGWINCH @@ -159,10 +141,8 @@ static inline int __xn_safe_strncpy_from_user(char *dst, #endif /* __KERNEL__ */ typedef struct xncompletion { - - long syncflag; /* Semaphore variable. */ - pid_t pid; /* Single waiter ID. */ - + long syncflag; /* Semaphore variable. */ + pid_t pid; /* Single waiter ID. */ } xncompletion_t; #endif /* !_XENO_ASM_GENERIC_SYSCALL_H */ diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c index ee59923..d6d1203 100644 --- a/ksrc/nucleus/shadow.c +++ b/ksrc/nucleus/shadow.c @@ -1466,9 +1466,10 @@ static int xnshadow_sys_bind(struct pt_regs *regs) featmis = (~XENOMAI_FEAT_DEP & (featdep & XENOMAI_FEAT_MAN)); if (infarg) { - /* Pass back the supported feature set and the ABI revision - level to user-space. */ - + /* + * Pass back the supported feature set and the ABI revision + * level to user-space. + */ finfo.feat_all = XENOMAI_FEAT_DEP; stringify_feature_set(XENOMAI_FEAT_DEP, finfo.feat_all_s, sizeof(finfo.feat_all_s)); @@ -1481,7 +1482,8 @@ static int xnshadow_sys_bind(struct pt_regs *regs) finfo.feat_req = featdep; stringify_feature_set(featdep, finfo.feat_req_s, sizeof(finfo.feat_req_s)); - finfo.abirev = XENOMAI_ABI_REV; + finfo.feat_abirev = XENOMAI_ABI_REV; + collect_arch_features(&finfo); if (__xn_safe_copy_to_user((void *)infarg, &finfo, sizeof(finfo))) return -EFAULT; _______________________________________________ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git