[Xenomai-git] Jorge Ramirez-Ortiz : gpiopwm: display udp server information
Module: xenomai-3 Branch: next Commit: 580d5cba67c75ea47f0a2c437ea727d070028781 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=580d5cba67c75ea47f0a2c437ea727d070028781 Author: Jorge Ramirez-OrtizDate: Wed Mar 30 13:30:11 2016 -0400 gpiopwm: display udp server information --- demo/posix/cobalt/gpiopwm.c | 62 --- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/demo/posix/cobalt/gpiopwm.c b/demo/posix/cobalt/gpiopwm.c index e093fbe..71a87d4 100644 --- a/demo/posix/cobalt/gpiopwm.c +++ b/demo/posix/cobalt/gpiopwm.c @@ -18,9 +18,10 @@ #include #include #include +#include -#define MIN_DUTY_CYCLE 0 -#define MAX_DUTY_CYCLE 100 +#define MIN_DUTY_CYCLE (0) +#define MAX_DUTY_CYCLE (100) typedef void *(*gpiopwm_control_thread)(void *cookie); #define DEVICE_NAME "/dev/rtdm/gpiopwm" @@ -33,6 +34,11 @@ static int stop; static int step = 1; static int port = 6; +#define MAX_IP_INTERFACES (9) +static char *ip_str[MAX_IP_INTERFACES + 1]; +static int last_ip; + + #define GPIO_PWM_SERVO_CONFIG \ { \ .duty_cycle = 50, \ @@ -75,7 +81,11 @@ static inline void clear_screen(void) static inline void print_config(char *str) { + int i; + printf("Config: %s\n", str); + for (i = 0; i < last_ip ; i++) + printf("%s", ip_str[i]); printf(" device : %s\n", device_name); printf(" range : [%d, %d]\n", config.range_min, config.range_max); printf(" period : %d nsec\n", config.period); @@ -90,6 +100,51 @@ static inline void input_message(void) printf( " Enter duty_cycle [0-100] : "); } +static void get_ip_addresses(void) +{ + char ip[INET_ADDRSTRLEN]; + struct sockaddr_in *s_in; + struct ifconf ifconf; + struct ifreq ifr[10]; + int ret; + int ifs; + int i; + int s; + + s = socket(AF_INET, SOCK_STREAM, 0); + if (s < 0) + return; + + ifconf.ifc_buf = (char *) ifr; + ifconf.ifc_len = sizeof(ifr); + + if (ioctl(s, SIOCGIFCONF, ) == -1) + return; + + ifs = ifconf.ifc_len / sizeof(ifr[0]); + + /* we wont _display_ more than MAX_IP_INTERFACES */ + if (ifs > MAX_IP_INTERFACES) + ifs = MAX_IP_INTERFACES; + + last_ip = ifs + 1; + + for (i = 0; i < ifs; i++) { + s_in = (struct sockaddr_in *) [i].ifr_addr; + if (!inet_ntop(AF_INET, _in->sin_addr, ip, sizeof(ip))) + return; + ret = asprintf(_str[i]," ip : %s\n", ip); + if (ret) + perror("asprintf"); + } + + ret = asprintf(_str[i]," port: %d\n\n", port); + if (ret) + perror("asprintf"); + + close(s); +} + static void setup_sched_parameters(pthread_attr_t *attr, int prio) { struct sched_param p; @@ -171,7 +226,7 @@ static void *gpiopwm_udp_ctrl_thread(void *cookie) for (;;) { clear_screen(); - print_config("UDP server"); + print_config("UDP Server\n"); memset(buf,'\0', blen); ret = recvfrom(sockfd, buf, blen - 1, 0, , ); @@ -382,6 +437,7 @@ int main(int argc, char *argv[]) case udp_opt: handler = gpiopwm_udp_ctrl_thread; port = atoi(optarg); + get_ip_addresses(); break; case config_opt: p = strtok(optarg,":"); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Jan Kiszka : cobalt/kernel: Return need_resched flag from xnsynch_release
Module: xenomai-3 Branch: next Commit: 76e56e4744a957a3acd54ad5428b6ce55871c06a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=76e56e4744a957a3acd54ad5428b6ce55871c06a Author: Jan KiszkaDate: Mon May 9 21:19:04 2016 +0200 cobalt/kernel: Return need_resched flag from xnsynch_release We currently return the next owner, but no caller of xnsynch_release evaluates this beyond != NULL and calls xnsched_run in that case. Simplify the API by returning a need_resched flag directly. This will also help with fixing the missing reschedule after PP deboost. Signed-off-by: Jan Kiszka --- include/cobalt/kernel/synch.h |3 +-- kernel/cobalt/posix/mutex.c |2 +- kernel/cobalt/rtdm/drvlib.c |2 +- kernel/cobalt/synch.c | 23 +++ 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/include/cobalt/kernel/synch.h b/include/cobalt/kernel/synch.h index 246d2b9..b3a8004 100644 --- a/include/cobalt/kernel/synch.h +++ b/include/cobalt/kernel/synch.h @@ -164,8 +164,7 @@ int __must_check xnsynch_acquire(struct xnsynch *synch, int __must_check xnsynch_try_acquire(struct xnsynch *synch); -struct xnthread *xnsynch_release(struct xnsynch *synch, -struct xnthread *thread); +bool xnsynch_release(struct xnsynch *synch, struct xnthread *thread); struct xnthread *xnsynch_peek_pendq(struct xnsynch *synch); diff --git a/kernel/cobalt/posix/mutex.c b/kernel/cobalt/posix/mutex.c index c6020ff..f99874b 100644 --- a/kernel/cobalt/posix/mutex.c +++ b/kernel/cobalt/posix/mutex.c @@ -128,7 +128,7 @@ int cobalt_mutex_release(struct xnthread *curr, cobalt_cond_deferred_signals(cond); } } - need_resched |= xnsynch_release(>synchbase, curr) != NULL; + need_resched |= xnsynch_release(>synchbase, curr); return need_resched; } diff --git a/kernel/cobalt/rtdm/drvlib.c b/kernel/cobalt/rtdm/drvlib.c index 248a9a8..6f4f51e 100644 --- a/kernel/cobalt/rtdm/drvlib.c +++ b/kernel/cobalt/rtdm/drvlib.c @@ -1282,7 +1282,7 @@ void rtdm_mutex_unlock(rtdm_mutex_t *mutex) trace_cobalt_driver_mutex_release(mutex); if (unlikely(xnsynch_release(>synch_base, -xnsched_current_thread()) != NULL)) +xnsched_current_thread( xnsched_run(); } EXPORT_SYMBOL_GPL(rtdm_mutex_unlock); diff --git a/kernel/cobalt/synch.c b/kernel/cobalt/synch.c index 976261d..d8b83d9 100644 --- a/kernel/cobalt/synch.c +++ b/kernel/cobalt/synch.c @@ -843,8 +843,8 @@ static inline void clear_pp_boost(struct xnsynch *synch, drop_booster(synch, owner); } -static struct xnthread *transfer_ownership(struct xnsynch *synch, - struct xnthread *lastowner) +static bool transfer_ownership(struct xnsynch *synch, + struct xnthread *lastowner) { /* nklock held, irqs off */ struct xnthread *nextowner; xnhandle_t nextownerh; @@ -859,7 +859,7 @@ static struct xnthread *transfer_ownership(struct xnsynch *synch, if (list_empty(>pendq)) { synch->owner = NULL; atomic_set(lockp, XN_NO_HANDLE); - return NULL; + return false; } nextowner = list_first_entry(>pendq, struct xnthread, plink); @@ -879,11 +879,11 @@ static struct xnthread *transfer_ownership(struct xnsynch *synch, atomic_set(lockp, nextownerh); - return nextowner; + return true; } /** - * @fn struct xnthread *xnsynch_release(struct xnsynch *synch, struct xnthread *curr) + * @fn bool xnsynch_release(struct xnsynch *synch, struct xnthread *curr) * @brief Release a resource and pass it to the next waiting thread. * * This service releases the ownership of the given synchronization @@ -900,7 +900,7 @@ static struct xnthread *transfer_ownership(struct xnsynch *synch, * @param curr The descriptor address of the current thread, which * must own the object at the time of calling. * - * @return The descriptor address of the unblocked thread. + * @return True if a reschedule is required. * * @sideeffect * @@ -913,10 +913,9 @@ static struct xnthread *transfer_ownership(struct xnsynch *synch, * * @coretags{primary-only, might-switch} */ -struct xnthread *xnsynch_release(struct xnsynch *synch, -struct xnthread *curr) +bool xnsynch_release(struct xnsynch *synch, struct xnthread *curr) { - struct xnthread *nextowner = NULL; + bool need_resched = false; xnhandle_t currh, h; atomic_t *lockp; spl_t s; @@ -926,7 +925,7 @@ struct xnthread *xnsynch_release(struct xnsynch *synch, trace_cobalt_synch_release(synch); if (xnthread_put_resource(curr)) - return NULL; +
[Xenomai-git] Jan Kiszka : smokey/posix-mutex: Fix test case by destroying barriers correctly
Module: xenomai-3 Branch: next Commit: 9690f414f6ece7346c8a3b4ce8e16ea979646732 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=9690f414f6ece7346c8a3b4ce8e16ea979646732 Author: Jan KiszkaDate: Tue Dec 6 16:34:48 2016 +0100 smokey/posix-mutex: Fix test case by destroying barriers correctly At least on x86-64-compat, the missing destruction of the smokey barriers, specifically their embedded mutexes, cause crashes of the test. The reason is likely a mismatch between the kernel's and userland's view on which object is still active, combined with the fact that userland kept them on the volatile stack. Signed-off-by: Jan Kiszka --- testsuite/smokey/posix-mutex/posix-mutex.c |6 ++ 1 file changed, 6 insertions(+) diff --git a/testsuite/smokey/posix-mutex/posix-mutex.c b/testsuite/smokey/posix-mutex/posix-mutex.c index 151c2f3..9a1592b 100644 --- a/testsuite/smokey/posix-mutex/posix-mutex.c +++ b/testsuite/smokey/posix-mutex/posix-mutex.c @@ -291,6 +291,8 @@ static int do_contend(pthread_mutex_t *mutex, int type) if (!__Tassert(status == NULL)) return -EINVAL; + smokey_barrier_destroy(); + return 0; } @@ -471,6 +473,8 @@ static int do_pi_contend(int prio) if (!__T(ret, pthread_mutex_destroy())) return ret; + smokey_barrier_destroy(); + return 0; } @@ -578,6 +582,8 @@ static int do_steal(int may_steal) if (!__T(ret, pthread_mutex_destroy())) return ret; + smokey_barrier_destroy(); + return 0; } ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt: increase default core size settings
Module: xenomai-3 Branch: next Commit: 3676fdac2909427912c18007a1a7888463131ca9 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3676fdac2909427912c18007a1a7888463131ca9 Author: Philippe GerumDate: Wed May 24 18:32:48 2017 +0200 cobalt: increase default core size settings Since the multi-core CPUs invaded the embedded space, the default settings should meet the common allocation requirements for current SMP configurations, which largely depend on per-CPU resources. Set Cobalt's system heap size to 4Mb, and UMM heaps to 256k. At this chance, also increase the default number of available POSIX timers Cobalt can manage. --- kernel/cobalt/Kconfig |8 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kernel/cobalt/Kconfig b/kernel/cobalt/Kconfig index 1d7c7cc..231a1ad 100644 --- a/kernel/cobalt/Kconfig +++ b/kernel/cobalt/Kconfig @@ -251,14 +251,14 @@ config XENO_OPT_REGISTRY_NRSLOTS config XENO_OPT_SYS_HEAPSZ int "Size of system heap (Kb)" - default 512 + default 4096 help The system heap is used for various internal allocations by the Cobalt kernel. The size is expressed in Kilobytes. config XENO_OPT_PRIVATE_HEAPSZ int "Size of private heap (Kb)" - default 64 + default 256 help The Cobalt kernel implements fast IPC mechanisms within the scope of a process which require a private kernel memory heap @@ -270,7 +270,7 @@ config XENO_OPT_PRIVATE_HEAPSZ config XENO_OPT_SHARED_HEAPSZ int "Size of shared heap (Kb)" - default 64 + default 256 help The Cobalt kernel implements fast IPC mechanisms between processes which require a shared kernel memory heap to be @@ -282,7 +282,7 @@ config XENO_OPT_SHARED_HEAPSZ config XENO_OPT_NRTIMERS int "Maximum number of POSIX timers per process" - default 128 + default 256 help This tunable controls how many POSIX timers can exist at any given time for each Cobalt process (a timer is created by a ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : testsuite/switchtest: handle --cpu-affinity argument
Module: xenomai-3 Branch: next Commit: 72dc8e92ca391debd025bef4d8347f80b87e0ca4 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=72dc8e92ca391debd025bef4d8347f80b87e0ca4 Author: Philippe GerumDate: Wed May 24 20:12:07 2017 +0200 testsuite/switchtest: handle --cpu-affinity argument We may want to limit the test to a selected set of CPUs, the --cpu-affinity base setting can express this set for us. e.g. switchtest --cpu-affinity=0,7 will run the test over CPU0 and CPU7 exclusively. --- testsuite/switchtest/switchtest.c | 126 + 1 file changed, 72 insertions(+), 54 deletions(-) diff --git a/testsuite/switchtest/switchtest.c b/testsuite/switchtest/switchtest.c index 5c102a2..015bde6 100644 --- a/testsuite/switchtest/switchtest.c +++ b/testsuite/switchtest/switchtest.c @@ -39,6 +39,17 @@ #include #include #include +#include + +static unsigned int nr_cpus; + +#define for_each_cpu(__cpu)\ + for (__cpu = 0; __cpu < CPU_SETSIZE; __cpu++) \ + if (CPU_ISSET(__cpu, &__base_setup_data.cpu_affinity)) + +#define for_each_cpu_index(__cpu, __index) \ + for (__cpu = 0, __index = -1; __cpu < CPU_SETSIZE; __cpu++) \ + if (CPU_ISSET(__cpu, &__base_setup_data.cpu_affinity) && ++__index >= 0) #if CONFIG_SMP #define smp_sched_setaffinity(pid,len,mask) sched_setaffinity(pid,len,mask) @@ -75,7 +86,7 @@ struct task_params { }; struct cpu_tasks { - unsigned index; + unsigned int index; struct task_params *tasks; unsigned tasks_count; unsigned capacity; @@ -715,6 +726,7 @@ static int parse_arg(struct task_params *param, unsigned long cpu; char *cpu_end; unsigned i; + int n; param->type = param->fp = 0; param->cpu = [0]; @@ -757,7 +769,13 @@ static int parse_arg(struct task_params *param, if (*cpu_end != '\0' || (cpu == ULONG_MAX && errno)) return -1; - param->cpu = [cpu]; + param->cpu = [nr_cpus]; /* Invalid at first. */ + for_each_cpu_index(i, n) + if (i == cpu) { + param->cpu = [n]; + break; + } + return 0; } @@ -984,13 +1002,7 @@ static unsigned long xatoul(const char *str) static void usage(FILE *fd, const char *progname) { - unsigned i, j, nr_cpus; - -#if CONFIG_SMP - nr_cpus = sysconf(_SC_NPROCESSORS_ONLN); -#else /* !CONFIG_SMP */ - nr_cpus = 1; -#endif /* !CONFIG_SMP */ + unsigned i, j; fprintf(fd, "Usage:\n" @@ -1034,17 +1046,19 @@ static void usage(FILE *fd, const char *progname) "Passing no 'threadspec' is equivalent to running:\n%s", progname, progname); - for (i = 0; i < nr_cpus; i++) + for_each_cpu(i) { for (j = 0; j < sizeof(all_fp)/sizeof(char *); j++) fprintf(fd, " %s%d", all_fp[j], i); + } fprintf(fd, "\n\nPassing only the --nofpu or -n argument is equivalent to " "running:\n%s", progname); - for (i = 0; i < nr_cpus; i++) + for_each_cpu(i) { for (j = 0; j < sizeof(all_nofp)/sizeof(char *); j++) fprintf(fd, " %s%d", all_nofp[j], i); + } fprintf(fd, "\n\n"); } @@ -1116,7 +1130,7 @@ static int check_fpu(void) int main(int argc, const char *argv[]) { - unsigned i, j, nr_cpus, use_fp = 1, stress = 0; + unsigned i, j, n, use_fp = 1, stress = 0; pthread_attr_t rt_attr; const char *progname = argv[0]; struct cpu_tasks *cpus; @@ -1135,19 +1149,24 @@ int main(int argc, const char *argv[]) } #if CONFIG_SMP - nr_cpus = sysconf(_SC_NPROCESSORS_ONLN); + nr_cpus = CPU_COUNT(&__base_setup_data.cpu_affinity); + if (nr_cpus == 0) { + nr_cpus = sysconf(_SC_NPROCESSORS_ONLN); + if (nr_cpus == -1) { + fprintf(stderr, + "Error %d while getting the number of cpus (%s)\n", + errno, + strerror(errno)); + exit(EXIT_FAILURE); + } + for (i = 0; i < nr_cpus; i++) + CPU_SET(i, &__base_setup_data.cpu_affinity); + } #else /* !CONFIG_SMP */ nr_cpus = 1; + CPU_SET(0, &__base_setup_data.cpu_affinity); #endif /* !CONFIG_SMP */ - if (nr_cpus == -1) { - fprintf(stderr, - "Error %d while getting the number of cpus (%s)\n", - errno, - strerror(errno)); - exit(EXIT_FAILURE); - } - fp_features = cobalt_fp_detect(); /* Parse command line options. */ @@ -1244,46 +1263,46 @@
[Xenomai-git] Philippe Gerum : lib/cobalt: init: hint about failure due to disabled core
Module: xenomai-3 Branch: next Commit: 5bd2093981417bf21d958c4a639837ed0963838a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=5bd2093981417bf21d958c4a639837ed0963838a Author: Philippe GerumDate: Thu Jun 1 09:46:29 2017 +0200 lib/cobalt: init: hint about failure due to disabled core --- lib/cobalt/init.c |3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/cobalt/init.c b/lib/cobalt/init.c index 69d4763..800d487 100644 --- a/lib/cobalt/init.c +++ b/lib/cobalt/init.c @@ -112,6 +112,9 @@ static void low_init(void) case -ENOEXEC: early_panic("ABI mismatch: required r%lu, provided r%lu", XENOMAI_ABI_REV, f->feat_abirev); + case -EAGAIN: + early_panic("Cobalt core present but disabled " + "(use corectl --start)"); case -ENOSYS: early_panic("Cobalt core not enabled in kernel"); default: ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/syscalls: reject binding attempt to disabled core with EAGAIN
Module: xenomai-3 Branch: next Commit: f4b3e987a176b372a8f07d99172a675cc1bdf543 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f4b3e987a176b372a8f07d99172a675cc1bdf543 Author: Philippe GerumDate: Thu Jun 1 09:43:53 2017 +0200 cobalt/syscalls: reject binding attempt to disabled core with EAGAIN --- kernel/cobalt/posix/syscall.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c index 25d21ea..0f905bf 100644 --- a/kernel/cobalt/posix/syscall.c +++ b/kernel/cobalt/posix/syscall.c @@ -314,7 +314,7 @@ static COBALT_SYSCALL(bind, lostage, f = _ret; featreq = breq.feat_req; if (!realtime_core_running() && (featreq & __xn_feat_control) == 0) - return -EPERM; + return -EAGAIN; /* * Calculate the missing feature set: ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm: fixups for kernel 4.8+
Module: xenomai-3 Branch: next Commit: d1402c30db7be0950206f313cc69a074dabe4490 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d1402c30db7be0950206f313cc69a074dabe4490 Author: Philippe GerumDate: Sun May 14 19:41:55 2017 +0200 cobalt/arm: fixups for kernel 4.8+ At this chance, stop using the obsolete flush_cache_all() routine which cannot honor the documented semantics for arm64. Besides, calibrating the access times to the timer registers in no-cache conditions does not make sense. --- kernel/cobalt/arch/arm64/machine.c |3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kernel/cobalt/arch/arm64/machine.c b/kernel/cobalt/arch/arm64/machine.c index ddf65a8..1711d76 100644 --- a/kernel/cobalt/arch/arm64/machine.c +++ b/kernel/cobalt/arch/arm64/machine.c @@ -35,7 +35,7 @@ static void mach_arm_prefault(struct vm_area_struct *vma) flags = (vma->vm_flags & VM_MAYWRITE) ? FAULT_FLAG_WRITE : 0; for (addr = vma->vm_start; addr != vma->vm_end; addr += PAGE_SIZE) - handle_mm_fault(vma->vm_mm, vma, addr, flags); + handle_mm_fault(vma, addr, flags); } } @@ -63,7 +63,6 @@ static unsigned long mach_arm_calibrate(void) barrier(); for (i = 0; i < CALIBRATION_LOOPS; i++) { - flush_cache_all(); for (j = 0; j < CALIBRATION_LOOPS; j++) { ipipe_read_tsc(start); barrier(); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Jorge Ramirez-Ortiz : gpiopwm: pwm signal generator and servo motor control demo code
Module: xenomai-3 Branch: next Commit: a9ef7ba7067e95e5a2a65067d3daa53b050968df URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a9ef7ba7067e95e5a2a65067d3daa53b050968df Author: Jorge Ramirez-OrtizDate: Tue Mar 15 19:18:15 2016 -0400 gpiopwm: pwm signal generator and servo motor control demo code --- demo/posix/cobalt/Makefile.am|6 + demo/posix/cobalt/gpiopwm.c | 448 ++ include/cobalt/kernel/rtdm/gpiopwm.h | 24 ++ include/rtdm/uapi/gpiopwm.h | 56 + include/rtdm/uapi/rtdm.h |1 + kernel/drivers/Kconfig |1 + kernel/drivers/Makefile |2 +- kernel/drivers/gpiopwm/Kconfig |9 + kernel/drivers/gpiopwm/Makefile |5 + kernel/drivers/gpiopwm/gpiopwm.c | 301 +++ 10 files changed, 852 insertions(+), 1 deletion(-) diff --git a/demo/posix/cobalt/Makefile.am b/demo/posix/cobalt/Makefile.am index cba9247..2a22967 100644 --- a/demo/posix/cobalt/Makefile.am +++ b/demo/posix/cobalt/Makefile.am @@ -3,6 +3,7 @@ demodir = @XENO_DEMO_DIR@ CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC) demo_PROGRAMS =\ + gpiopwm \ bufp-label \ bufp-readwrite \ can_rtt \ @@ -24,6 +25,11 @@ ldadd = \ @XENO_USER_LDADD@ \ -lpthread -lrt +gpiopwm_SOURCES = gpiopwm.c +gpiopwm_CPPFLAGS = $(cppflags) -I$(top_srcdir)/include/rtdm/uapi +gpiopwm_LDFLAGS = $(ldflags) +gpiopwm_LDADD = $(ldadd) + bufp_label_SOURCES = bufp-label.c bufp_label_CPPFLAGS = $(cppflags) bufp_label_LDFLAGS = $(ldflags) diff --git a/demo/posix/cobalt/gpiopwm.c b/demo/posix/cobalt/gpiopwm.c new file mode 100644 index 000..e093fbe --- /dev/null +++ b/demo/posix/cobalt/gpiopwm.c @@ -0,0 +1,448 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#define MIN_DUTY_CYCLE 0 +#define MAX_DUTY_CYCLE 100 + +typedef void *(*gpiopwm_control_thread)(void *cookie); +#define DEVICE_NAME "/dev/rtdm/gpiopwm" +char *device_name; +int dev; + +static sem_t synch; +static sem_t setup; +static int stop; +static int step = 1; +static int port = 6; + +#define GPIO_PWM_SERVO_CONFIG \ +{ \ + .duty_cycle = 50, \ + .range_min = 950,\ + .range_max = 2050, \ + .period = 2000, \ + .gpio = 1, \ +} + +static struct gpiopwm config = GPIO_PWM_SERVO_CONFIG; + +static void fail(const char *reason) +{ + perror(reason); + exit(EXIT_FAILURE); +} + +static void sem_sync(sem_t *sem) +{ + int ret; + + for (;;) { + ret = sem_wait(sem); + if (ret == 0) + return; + if (errno != EINTR) + fail("sem_wait"); + } +} + +static inline void clear_screen(void) +{ + const char* cmd = "\e[1;1H\e[2J"; + int ret; + + ret = write(2, cmd, strlen(cmd)); + if (!ret) + error(1, ret, "clear screen error"); +} + +static inline void print_config(char *str) +{ + printf("Config: %s\n", str); + printf(" device : %s\n", device_name); + printf(" range : [%d, %d]\n", config.range_min, config.range_max); + printf(" period : %d nsec\n", config.period); + printf(" gpio pin : %d\n", config.gpio); + printf(" duty cycle : %d\n", config.duty_cycle); +} + +static inline void input_message(void) +{ + print_config(""); + printf("\n GPIO PWM Control\n"); + printf( " Enter duty_cycle [0-100] : "); +} + +static void setup_sched_parameters(pthread_attr_t *attr, int prio) +{ + struct sched_param p; + int ret; + + ret = pthread_attr_init(attr); + if (ret) + error(1, ret, "pthread_attr_init()"); + + ret = pthread_attr_setinheritsched(attr, PTHREAD_EXPLICIT_SCHED); + if (ret) + error(1, ret, "pthread_attr_setinheritsched()"); + + ret = pthread_attr_setschedpolicy(attr, prio ? SCHED_FIFO : SCHED_OTHER); + if (ret) + error(1, ret, "pthread_attr_setschedpolicy()"); + + p.sched_priority = prio; + ret = pthread_attr_setschedparam(attr, ); + if (ret) + error(1, ret, "pthread_attr_setschedparam()"); +} + +static void *gpiopwm_init_thread(void *cookie) +{ + int ret; + + pthread_setname_np(pthread_self(), "gpio-pwm-handler"); + ret = ioctl(dev, GPIOPWM_RTIOC_SET_CONFIG, config); + if (ret) + error(1, ret, "failed to set config"); + + ioctl(dev, GPIOPWM_RTIOC_START); + +
[Xenomai-git] Philippe Gerum : cobalt/arm64: thread: move all TCB initializers out of line
Module: xenomai-3 Branch: next Commit: c0b23e2c4255dea5871bfd49da8ffd1cc4862aa0 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c0b23e2c4255dea5871bfd49da8ffd1cc4862aa0 Author: Philippe GerumDate: Fri Sep 9 16:07:54 2016 +0200 cobalt/arm64: thread: move all TCB initializers out of line Does not impact performances and fixes inclusion hell for pulling the struct xnthread definition for good. --- kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h |6 +- kernel/cobalt/arch/arm64/thread.c |6 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h index ac1f1f7..319f4d8 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h @@ -60,11 +60,7 @@ int xnarch_escalate(void); #if defined(CONFIG_XENO_ARCH_FPU) -static inline void xnarch_init_root_tcb(struct xnthread *thread) -{ - struct xnarchtcb *tcb = xnthread_archtcb(thread); - tcb->fpup = NULL; -} +void xnarch_init_root_tcb(struct xnthread *thread); void xnarch_init_shadow_tcb(struct xnthread *thread); diff --git a/kernel/cobalt/arch/arm64/thread.c b/kernel/cobalt/arch/arm64/thread.c index b987e09..3097aeb 100644 --- a/kernel/cobalt/arch/arm64/thread.c +++ b/kernel/cobalt/arch/arm64/thread.c @@ -98,6 +98,12 @@ void xnarch_init_shadow_tcb(struct xnthread *thread) tcb->fpup = >core.host_task->thread.fpsimd_state; } +void xnarch_init_root_tcb(struct xnthread *thread) +{ + struct xnarchtcb *tcb = >tcb; + tcb->fpup = NULL; +} + #endif /* CONFIG_XENO_ARCH_FPU */ void xnarch_switch_to(struct xnthread *out, struct xnthread *in) ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: no fpsimd support in real-time kthread context
Module: xenomai-3 Branch: next Commit: e3fbd4b0d58b3f57dbaddb067d368e3944e38277 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e3fbd4b0d58b3f57dbaddb067d368e3944e38277 Author: Philippe GerumDate: Wed May 24 17:41:41 2017 +0200 cobalt/arm64: no fpsimd support in real-time kthread context --- kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h index cfdf0b3..b7e3f52 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h @@ -27,7 +27,7 @@ static inline int fp_kernel_supported(void) { - return 1; + return 0; } static inline int fp_linux_begin(void) ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: fpu: drop obsolete xnarch_save_fpu()
Module: xenomai-3 Branch: next Commit: 1f607993834b049533d4490b4d788221d20c97ee URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1f607993834b049533d4490b4d788221d20c97ee Author: Philippe GerumDate: Thu Sep 8 16:29:59 2016 +0200 cobalt/arm64: fpu: drop obsolete xnarch_save_fpu() --- kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h |4 1 file changed, 4 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h index 4b247ac..ac1f1f7 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h @@ -75,8 +75,6 @@ static inline int xnarch_fault_fpu_p(struct ipipe_trap_data *d) void xnarch_leave_root(struct xnthread *root); -void xnarch_save_fpu(struct xnthread *thread); - void xnarch_switch_fpu(struct xnthread *from, struct xnthread *thread); static inline int @@ -103,8 +101,6 @@ static inline int xnarch_fault_fpu_p(struct ipipe_trap_data *d) static inline void xnarch_leave_root(struct xnthread *root) { } -static inline void xnarch_save_fpu(struct xnthread *thread) { } - static inline void xnarch_switch_fpu(struct xnthread *f, struct xnthread *t) { } static inline int xnarch_handle_fpu_fault(struct xnthread *from, ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : lib/cobalt: add config switch to enable lazy setsched update mode
Module: xenomai-3 Branch: next Commit: 8c37ca60657027c2b04a2574e01ff341ecf2cd4e URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8c37ca60657027c2b04a2574e01ff341ecf2cd4e Author: Philippe GerumDate: Sun Mar 20 17:58:33 2016 +0100 lib/cobalt: add config switch to enable lazy setsched update mode --enable-lazy-setsched should be given for enabling lazy propagation of scheduling parameters upon calls to pthread_setschedparam*(), sched_setscheduler(). Defaults to off. --- configure.ac | 19 +++ lib/cobalt/internal.h | 12 lib/cobalt/sched.c|2 +- lib/cobalt/thread.c |3 ++- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index dd3a1ec..b90fa70 100644 --- a/configure.ac +++ b/configure.ac @@ -291,6 +291,25 @@ if test x$workaround_condvar_pi = xy; then fi fi +dnl Lazy schedparam propagation for Cobalt (default: off) + +unset lazy_setsched_update +AC_MSG_CHECKING(whether to enable lazy scheduling parameter update) +AC_ARG_ENABLE(lazy-setsched, + AS_HELP_STRING([--enable-lazy-setsched], [Enable lazy scheduling parameter update]), + [case "$enableval" in + y | yes) lazy_setsched_update=y ;; + *) unset lazy_setsched_update ;; + esac]) +AC_MSG_RESULT(${lazy_setsched_update:-no}) +if test x$lazy_setsched_update = xy; then + if test x$rtcore_type = xcobalt; then + AC_DEFINE(CONFIG_XENO_LAZY_SETSCHED,1,[config]) + else +AC_MSG_WARN([No lazy scheduling parameter updates over Mercury - ignoring]) + fi +fi + dnl Enable shared multi-processing (default: off) use_pshared= diff --git a/lib/cobalt/internal.h b/lib/cobalt/internal.h index 3241e9b..cccbbf1 100644 --- a/lib/cobalt/internal.h +++ b/lib/cobalt/internal.h @@ -37,6 +37,18 @@ static inline int cobalt_should_warn(void) return (cobalt_get_current_mode() & (XNRELAX|XNWARN)) == XNWARN; } +#ifdef CONFIG_XENO_LAZY_SETSCHED +static inline int cobalt_eager_setsched(void) +{ + return cobalt_is_relaxed(); +} +#else +static inline int cobalt_eager_setsched(void) +{ + return 1; +} +#endif + static inline struct cobalt_mutex_state *mutex_get_state(struct cobalt_mutex_shadow *shadow) { diff --git a/lib/cobalt/sched.c b/lib/cobalt/sched.c index 87b9235..94f3323 100644 --- a/lib/cobalt/sched.c +++ b/lib/cobalt/sched.c @@ -297,7 +297,7 @@ int sched_setscheduler_ex(pid_t pid, /* See pthread_setschedparam_ex(). */ - if (cobalt_is_relaxed()) { + if (cobalt_eager_setsched()) { std_policy = cobalt_xlate_schedparam(policy, param_ex, _param); ret = __STD(sched_setscheduler(pid, std_policy, _param)); if (ret) diff --git a/lib/cobalt/thread.c b/lib/cobalt/thread.c index 8b4568d..908516f 100644 --- a/lib/cobalt/thread.c +++ b/lib/cobalt/thread.c @@ -629,7 +629,8 @@ int pthread_setschedparam_ex(pthread_t thread, * threads should refrain from mixing APIs for managing * scheduling parameters, and only rely on libcobalt for this. */ - if (cobalt_is_relaxed()) { /* True if shadow not mapped yet. */ + if (cobalt_eager_setsched()) { + /* True if disabled or shadow not mapped yet. */ std_policy = cobalt_xlate_schedparam(policy, param_ex, _param); ret = __STD(pthread_setschedparam(thread, std_policy, _param)); if (ret) ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Jorge Ramirez-Ortiz : utils/analogy: fix error check [SIGSEGV]
Module: xenomai-3 Branch: next Commit: c4e4084487c746b87f61cbcba7e2f868af8d210c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c4e4084487c746b87f61cbcba7e2f868af8d210c Author: Jorge Ramirez-OrtizDate: Wed Oct 5 21:34:27 2016 +0200 utils/analogy: fix error check [SIGSEGV] --- utils/analogy/cmd_read.c |4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/analogy/cmd_read.c b/utils/analogy/cmd_read.c index a507801..86522f4 100644 --- a/utils/analogy/cmd_read.c +++ b/utils/analogy/cmd_read.c @@ -261,12 +261,12 @@ static int map_subdevice_buffer(a4l_desc_t *dsc, unsigned long *buf_size, void * static int cmd_read(struct arguments *arg) { - unsigned int i, scan_size = 0, cnt = 0, ret = 0, len, ofs; + unsigned int i, scan_size = 0, cnt = 0, len, ofs; dump_function_t dump_function = dump_text; a4l_desc_t dsc = { .sbdata = NULL }; unsigned long buf_size; char **argv = arg->argv; - int argc = arg->argc; + int ret = 0, argc = arg->argc; void *map = NULL; for (;;) { ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : net/drivers/e1000: work around UMR issue
Module: xenomai-3 Branch: next Commit: befe7af4d4b547de9b05a08636419dd87728a535 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=befe7af4d4b547de9b05a08636419dd87728a535 Author: Philippe GerumDate: Sun Aug 7 11:29:06 2016 +0200 net/drivers/e1000: work around UMR issue --- kernel/drivers/net/drivers/e1000/e1000_hw.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/drivers/net/drivers/e1000/e1000_hw.c b/kernel/drivers/net/drivers/e1000/e1000_hw.c index 311d48d..d974653 100644 --- a/kernel/drivers/net/drivers/e1000/e1000_hw.c +++ b/kernel/drivers/net/drivers/e1000/e1000_hw.c @@ -8804,7 +8804,7 @@ e1000_verify_write_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t byte) { int32_t error = E1000_SUCCESS; int32_t program_retries; -uint8_t temp_byte; +uint8_t temp_byte = 0; e1000_write_ich8_byte(hw, index, byte); usec_delay(100); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : testsuite/smokey: mutex: simplify, introduce PP tests
Module: xenomai-3 Branch: next Commit: a16ee4c17e98de3c0611eba3c1feab4743aaf4f8 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a16ee4c17e98de3c0611eba3c1feab4743aaf4f8 Author: Philippe GerumDate: Wed Feb 17 09:21:27 2016 +0100 testsuite/smokey: mutex: simplify, introduce PP tests At this chance, the lock stealing test is also fixed. --- testsuite/smokey/posix-mutex/posix-mutex.c | 1357 ++-- 1 file changed, 670 insertions(+), 687 deletions(-) diff --git a/testsuite/smokey/posix-mutex/posix-mutex.c b/testsuite/smokey/posix-mutex/posix-mutex.c index ac71b31..ae82fc1 100644 --- a/testsuite/smokey/posix-mutex/posix-mutex.c +++ b/testsuite/smokey/posix-mutex/posix-mutex.c @@ -4,6 +4,7 @@ * Copyright (C) Gilles Chanteperdrix , * Marion Deveaud , * Jan Kiszka + * Philippe Gerum * * Released under the terms of GPLv2. */ @@ -17,8 +18,6 @@ #include #include #include -#include -#include "lib/cobalt/current.h" #include smokey_test_plugin(posix_mutex, @@ -26,886 +25,870 @@ smokey_test_plugin(posix_mutex, "Check POSIX mutex services" ); -#define MUTEX_CREATE 1 -#define MUTEX_LOCK 2 -#define MUTEX_TRYLOCK 3 -#define MUTEX_TIMED_LOCK 4 -#define MUTEX_UNLOCK 5 -#define MUTEX_DESTROY 6 -#define COND_CREATE7 -#define COND_SIGNAL8 -#define COND_WAIT 9 -#define COND_DESTROY 10 -#define THREAD_DETACH 11 -#define THREAD_CREATE 12 -#define THREAD_JOIN13 -#define THREAD_RENICE 14 - -#define NS_PER_MS 100 - static const char *reason_str[] = { - [SIGDEBUG_UNDEFINED] = "undefined", + [SIGDEBUG_UNDEFINED] = "received SIGDEBUG for unknown reason", [SIGDEBUG_MIGRATE_SIGNAL] = "received signal", [SIGDEBUG_MIGRATE_SYSCALL] = "invoked syscall", [SIGDEBUG_MIGRATE_FAULT] = "triggered fault", [SIGDEBUG_MIGRATE_PRIOINV] = "affected by priority inversion", - [SIGDEBUG_NOMLOCK] = "missing mlockall", - [SIGDEBUG_WATCHDOG] = "runaway thread", + [SIGDEBUG_NOMLOCK] = "process memory not locked", + [SIGDEBUG_WATCHDOG] = "watchdog triggered (period too short?)", + [SIGDEBUG_LOCK_BREAK] = "scheduler lock break", }; static void sigdebug(int sig, siginfo_t *si, void *context) { + const char fmt[] = "%s, this is unexpected.\n" + "(enabling CONFIG_XENO_OPT_DEBUG_TRACE_RELAX may help)\n"; unsigned int reason = sigdebug_reason(si); + int n __attribute__ ((unused)); + static char buffer[256]; - smokey_trace("\nSIGDEBUG received, reason %d: %s\n", reason, -reason <= SIGDEBUG_WATCHDOG ? reason_str[reason] : ""); -} + if (reason > SIGDEBUG_WATCHDOG) + reason = SIGDEBUG_UNDEFINED; -static inline unsigned long long timer_get_tsc(void) -{ - return clockobj_get_tsc(); + n = snprintf(buffer, sizeof(buffer), fmt, reason_str[reason]); + n = write(STDERR_FILENO, buffer, n); } -static inline unsigned long long timer_tsc2ns(unsigned long long tsc) -{ - return clockobj_tsc_to_ns(tsc); -} +#define THREAD_PRIO_WEAK 0 +#define THREAD_PRIO_LOW1 +#define THREAD_PRIO_MEDIUM 2 +#define THREAD_PRIO_HIGH 3 +#define THREAD_PRIO_VERY_HIGH 4 -static void add_timespec(struct timespec *ts, unsigned long long value) -{ - ts->tv_sec += value / 10; - ts->tv_nsec += value % 10; - if (ts->tv_nsec > 10) { - ts->tv_sec++; - ts->tv_nsec -= 10; - } -} +#define MAX_100_MS 1ULL + +struct locker_context { + pthread_mutex_t *mutex; + struct smokey_barrier *barrier; + int lock_acquired; +}; -static void ms_sleep(int time) +static void sleep_ms(unsigned int ms) /* < 1000 */ { struct timespec ts; - + ts.tv_sec = 0; - ts.tv_nsec = time*NS_PER_MS; - - nanosleep(, NULL); + ts.tv_nsec = ms * 100; + clock_nanosleep(CLOCK_MONOTONIC, 0, , NULL); } -static void check_current_prio(int expected_prio) +static int get_effective_prio(void) { struct cobalt_threadstat stat; int ret; ret = cobalt_thread_stat(0, ); - if (ret) { - fprintf(stderr, - "FAILURE: cobalt_threadstat (%s)\n", strerror(-ret)); - exit(EXIT_FAILURE); - } + if (ret) + return ret; - if (stat.cprio != expected_prio) { - fprintf(stderr, - "FAILURE: current prio (%d) != expected prio (%d)\n", - stat.cprio, expected_prio); - exit(EXIT_FAILURE); - } +
[Xenomai-git] Philippe Gerum : cobalt/arm64: drop obsolete config knob
Module: xenomai-3 Branch: next Commit: 7d5663f59318ae009b808141b45440b43145bd54 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7d5663f59318ae009b808141b45440b43145bd54 Author: Philippe GerumDate: Sat Nov 14 18:17:49 2015 +0100 cobalt/arm64: drop obsolete config knob All existing ARM64 pipeline implementations provide the CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH knob, which is tested directly in the Xenomai code base. No need for CONFIG_XENO_ARCH_UNLOCKED_SWITCH anymore. --- kernel/cobalt/arch/arm64/Kconfig |3 --- 1 file changed, 3 deletions(-) diff --git a/kernel/cobalt/arch/arm64/Kconfig b/kernel/cobalt/arch/arm64/Kconfig index 572de3e..bdf5f16 100644 --- a/kernel/cobalt/arch/arm64/Kconfig +++ b/kernel/cobalt/arch/arm64/Kconfig @@ -1,9 +1,6 @@ source "kernel/xenomai/Kconfig" source "drivers/xenomai/Kconfig" -config XENO_ARCH_UNLOCKED_SWITCH - def_bool IPIPE_WANT_PREEMPTIBLE_SWITCH - config XENO_ARCH_FPU def_bool y ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Jan Kiszka : lib/cobalt: Provide RT-capable usleep
Module: xenomai-3 Branch: next Commit: 5d2f6759dec941f23c404d5d8518559f2bad28fd URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=5d2f6759dec941f23c404d5d8518559f2bad28fd Author: Jan KiszkaDate: Mon May 30 14:58:07 2016 +0200 lib/cobalt: Provide RT-capable usleep User may expect this (probably last) sleeping service to be available under Cobalt just like sleep, nanosleep & Co. Signed-off-by: Jan Kiszka --- include/cobalt/unistd.h|2 ++ lib/cobalt/clock.c | 14 ++ lib/cobalt/cobalt.wrappers |1 + lib/cobalt/wrappers.c |6 ++ 4 files changed, 23 insertions(+) diff --git a/include/cobalt/unistd.h b/include/cobalt/unistd.h index 8ad2b40..fe3992a 100644 --- a/include/cobalt/unistd.h +++ b/include/cobalt/unistd.h @@ -35,6 +35,8 @@ COBALT_DECL(int, close(int fildes)); COBALT_DECL(unsigned int, sleep(unsigned int seconds)); +COBALT_DECL(int, usleep(useconds_t usec)); + #ifdef __cplusplus } #endif diff --git a/lib/cobalt/clock.c b/lib/cobalt/clock.c index 0450019..7b4ef54 100644 --- a/lib/cobalt/clock.c +++ b/lib/cobalt/clock.c @@ -364,6 +364,20 @@ COBALT_IMPL(unsigned int, sleep, (unsigned int seconds)) return 0; } +/* @apitags{thread-unrestricted, switch-primary} */ + +COBALT_IMPL(int, usleep, (useconds_t usec)) +{ + struct timespec rqt; + + if (cobalt_get_current_fast() == XN_NO_HANDLE) + return __STD(usleep(usec)); + + rqt.tv_sec = usec / 100; + rqt.tv_nsec = (usec % 100) * 1000; + return __WRAP(clock_nanosleep(CLOCK_MONOTONIC, 0, , NULL)); +} + /* @apitags{unrestricted} */ COBALT_IMPL(int, gettimeofday, (struct timeval *tv, struct timezone *tz)) diff --git a/lib/cobalt/cobalt.wrappers b/lib/cobalt/cobalt.wrappers index f8bda39..91bd5ef 100644 --- a/lib/cobalt/cobalt.wrappers +++ b/lib/cobalt/cobalt.wrappers @@ -108,6 +108,7 @@ --wrap sigqueue --wrap kill --wrap sleep +--wrap usleep --wrap mmap --wrap mmap64 --wrap time diff --git a/lib/cobalt/wrappers.c b/lib/cobalt/wrappers.c index 8dd28fb..0507786 100644 --- a/lib/cobalt/wrappers.c +++ b/lib/cobalt/wrappers.c @@ -529,3 +529,9 @@ unsigned int __real_sleep(unsigned int seconds) { return sleep(seconds); } + +__weak +int __real_usleep(useconds_t usec) +{ + return usleep(usec); +} ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : config: bump UAPI level
Module: xenomai-3 Branch: next Commit: 2dabb16185a56fce5ddff377b810edd49a2b27fa URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2dabb16185a56fce5ddff377b810edd49a2b27fa Author: Philippe GerumDate: Sat Feb 15 16:42:09 2014 +0100 config: bump UAPI level --- config/apirev |2 +- include/cobalt/sys/cobalt.h |4 lib/cobalt/internal.c |9 - 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/config/apirev b/config/apirev index 8351c19..60d3b2f 100644 --- a/config/apirev +++ b/config/apirev @@ -1 +1 @@ -14 +15 diff --git a/include/cobalt/sys/cobalt.h b/include/cobalt/sys/cobalt.h index 1da8a46..1687e2b 100644 --- a/include/cobalt/sys/cobalt.h +++ b/include/cobalt/sys/cobalt.h @@ -134,10 +134,6 @@ void cobalt_register_tsd_hook(struct cobalt_tsd_hook *th); void cobalt_assert_nrt(void); -/* Use cobalt_assert_nrt() instead of: */ -__deprecated void assert_nrt(void); -__deprecated void assert_nrt_fast(void); - extern int __cobalt_control_bind; #ifdef __cplusplus diff --git a/lib/cobalt/internal.c b/lib/cobalt/internal.c index ebc3624..4333006 100644 --- a/lib/cobalt/internal.c +++ b/lib/cobalt/internal.c @@ -560,15 +560,6 @@ int cobalt_xlate_schedparam(int policy, return std_policy; } -/* - * Temporary compatibility aliases which should be phased out at next - * API revision. - */ -void assert_nrt(void) -__attribute__((alias("cobalt_assert_nrt"))); -void assert_nrt_fast(void) -__attribute__((alias("cobalt_assert_nrt"))); - void cobalt_assert_nrt(void) { if (cobalt_should_warn()) ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: add README
Module: xenomai-3 Branch: next Commit: f17e83ecd7e2403de60a68fb3f6c583c5fea144b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f17e83ecd7e2403de60a68fb3f6c583c5fea144b Author: Philippe GerumDate: Wed Feb 15 16:17:54 2017 +0100 cobalt/arm64: add README --- kernel/cobalt/arch/arm64/README |3 +++ 1 file changed, 3 insertions(+) diff --git a/kernel/cobalt/arch/arm64/README b/kernel/cobalt/arch/arm64/README new file mode 100644 index 000..80f954a --- /dev/null +++ b/kernel/cobalt/arch/arm64/README @@ -0,0 +1,3 @@ +Get the interrupt pipeline code for the target kernel from +http://xenomai.org/downloads/ipipe/, or +git://git.xenomai.org/ipipe.git ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : boilerplate: add AVL library
Module: xenomai-3 Branch: next Commit: 92306c89a3bdc2f7d8406bc9d3ef7cbbcbb7d5db URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=92306c89a3bdc2f7d8406bc9d3ef7cbbcbb7d5db Author: Philippe GerumDate: Tue May 31 17:30:21 2016 +0200 boilerplate: add AVL library --- include/boilerplate/Makefile.am |1 + include/boilerplate/avl.h | 298 ++ lib/boilerplate/Makefile.am |1 + lib/boilerplate/avl.c | 380 +++ 4 files changed, 680 insertions(+) diff --git a/include/boilerplate/Makefile.am b/include/boilerplate/Makefile.am index 2d3ace8..c975509 100644 --- a/include/boilerplate/Makefile.am +++ b/include/boilerplate/Makefile.am @@ -3,6 +3,7 @@ includesubdir = $(includedir)/boilerplate includesub_HEADERS = \ ancillaries.h \ atomic.h\ + avl.h \ compiler.h \ debug.h \ hash.h \ diff --git a/include/boilerplate/avl.h b/include/boilerplate/avl.h new file mode 100644 index 000..1aa84bf --- /dev/null +++ b/include/boilerplate/avl.h @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2015 Gilles Chanteperdrix + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef _BOILERPLATE_AVL_H +#define _BOILERPLATE_AVL_H + +#include + +struct avlh { + unsigned int thr: 3; + int type: 2; + int balance :2; + unsigned int flags :25; /* Application-specific */ + struct avlh *link[3]; +}; + +/* Using -1 and 1 for left and right is slightly faster than 0 and 1, using 0 + for "up" is just here for orthogonality... and avoid wasting 4 bytes or + having to use a union in struct avlh. */ +#define AVL_LEFT -1 +#define AVL_UP0 +#define AVL_RIGHT 1 +/* maps AVL_LEFT to AVL_RIGHT and reciprocally. */ +#define avl_opposite(type) (-(type)) +/* maps AVL_LEFT to -1 and AVL_RIGHT to 1. */ +#define avl_type2sign(type) (type) +/* maps AVL_LEFT and AVL_RIGHT to arrays index (or bit positions). */ +#define avl_type2index(type) ((type)+1) +/* maps <0 to AVL_LEFT and >0 to AVL_RIGHT. */ +#define avl_sign2type(sign) (sign) + +#define AVL_THR_LEFT (1< thr |= 1 << avl_type2index(side)) +#define avlh_thr_clr(holder, side) ((holder)->thr &= ~(1 << avl_type2index(side))) +#define avlh_thr_tst(holder, side) ((holder)->thr & (1 << avl_type2index(side))) +#define avlh_link(holder, dir) ((holder)->link[avl_type2index(dir)]) +#define avlh_up(holder)avlh_link((holder), AVL_UP) +#define avlh_left(holder) avlh_link((holder), AVL_LEFT) +#define avlh_right(holder) avlh_link((holder), AVL_RIGHT) +#define avlh_parent_link(holder) (avlh_link(avlh_up(holder), (holder)->type)) + +struct avl; + +typedef struct avlh *avl_search_t(const struct avl *, const struct avlh *, int *); + +typedef int avlh_cmp_t(const struct avlh *const, const struct avlh *const); + +struct avl { + struct avlh anchor; + avl_search_t *search; + avlh_cmp_t *cmp; + struct avlh *end[3]; + unsigned int count; + unsigned int height; +}; + +#define avl_searchfn(avl) ((avl)->search) +#define avl_cmp(avl) ((avl)->cmp) +#define avl_count(avl)((avl)->count) +#define avl_height(avl) ((avl)->height) +#define avl_anchor(avl) (&(avl)->anchor) +#define avl_end(avl, dir) ((avl)->end[avl_type2index(dir)]) +#define avl_top(avl) (avlh_right(avl_anchor(avl))) +#define avl_head(avl) (avl_end((avl), AVL_LEFT)) +#define avl_tail(avl) (avl_end((avl), AVL_RIGHT)) + +#ifdef __cplusplus +extern "C" { +#endif + +void avl_init(struct avl *avl, avl_search_t *search, avlh_cmp_t *cmp); + +void avl_destroy(struct avl *avl); + +void avl_clear(struct avl *avl, void (*destruct)(struct avlh
[Xenomai-git] Philippe Gerum : boilerplate/libc: add placeholder for pthread_setschedprio()
Module: xenomai-3 Branch: next Commit: 785ef4b71fd6628fcbfc672fb66bd578e5ae08bd URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=785ef4b71fd6628fcbfc672fb66bd578e5ae08bd Author: Philippe GerumDate: Tue May 24 09:43:29 2016 +0200 boilerplate/libc: add placeholder for pthread_setschedprio() For outdated uClibc. --- configure.ac |1 + include/boilerplate/libc.h | 19 +++ 2 files changed, 20 insertions(+) diff --git a/configure.ac b/configure.ac index b90fa70..b1000c4 100644 --- a/configure.ac +++ b/configure.ac @@ -543,6 +543,7 @@ AC_CHECK_FUNCS([pthread_mutexattr_setprotocol \ pthread_getattr_np \ pthread_atfork \ pthread_setname_np \ + pthread_setschedprio\ sched_getcpu\ clock_nanosleep \ shm_open\ diff --git a/include/boilerplate/libc.h b/include/boilerplate/libc.h index 1b26c84..75e2d1d 100644 --- a/include/boilerplate/libc.h +++ b/include/boilerplate/libc.h @@ -169,6 +169,25 @@ int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, } #endif /* !HAVE_PTHREAD_SETAFFINITY_NP */ +#ifndef HAVE_PTHREAD_SETSCHEDPRIO + +static inline +int pthread_setschedprio(pthread_t thread, int prio) +{ + struct sched_param param; + int policy, ret; + + ret = pthread_getschedparam(thread, , ); + if (ret) + return ret; + + param.sched_priority = prio; + + return pthread_setschedparam(thread, policy, ); +} + +#endif /* !HAVE_PTHREAD_SETSCHEDPRIO */ + #if !defined(HAVE_CLOCK_NANOSLEEP) && defined(CONFIG_XENO_MERCURY) /* * Best effort for a Mercury setup based on an outdated libc lacking ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: disable callee-saved logic in fptest helpers
Module: xenomai-3 Branch: next Commit: 2155388b667ee637b2366309f3b38a73ebefc92a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2155388b667ee637b2366309f3b38a73ebefc92a Author: Philippe GerumDate: Thu Oct 22 14:45:05 2015 +0200 cobalt/arm64: disable callee-saved logic in fptest helpers We don't want GCC to apply any callee-saved logic to fpsimd registers in fp_regs_set() before fp_regs_check() can verify their contents, but we still want GCC to know about the registers we have clobbered. --- .../arch/arm64/include/asm/xenomai/uapi/fptest.h | 160 ++-- testsuite/switchtest/switchtest.c | 14 +- 2 files changed, 92 insertions(+), 82 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h index 84607b7..7a2cb92 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h @@ -20,86 +20,86 @@ #define __COBALT_HAVE_FPU 0x1 -static inline void fp_regs_set(int features, unsigned int val) -{ - - unsigned long long e[32]; - unsigned int i; - - if (features & __COBALT_HAVE_FPU) { - - for (i = 0; i < 32; i++) - e[i] = val; - - __asm__ __volatile__("ldp d0, d1, [%0, #8 * 0] \n\ - ldp d2, d3, [%0, #8 * 2] \n\ - ldp d4, d5, [%0, #8 * 4]\n\ - ldp d6, d7, [%0, #8 * 6]\n\ - ldp d8, d9, [%0, #8 * 8]\n\ - ldp d10, d11, [%0, #8 * 10]\n\ - ldp d12, d13, [%0, #8 * 12]\n\ - ldp d14, d15, [%0, #8 * 14]\n\ - ldp d16, d17, [%0, #8 * 16]\n\ - ldp d18, d19, [%0, #8 * 18]\n\ - ldp d20, d21, [%0, #8 * 20]\n\ - ldp d22, d23, [%0, #8 * 22]\n\ - ldp d24, d25, [%0, #8 * 24]\n\ - ldp d26, d27, [%0, #8 * 26]\n\ - ldp d28, d29, [%0, #8 * 28]\n\ - ldp d30, d31, [%0, #8 * 30]" - - : /* No outputs. */ - : "r"([0]) - : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", - "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", "memory" - ); - } - -} - -static inline unsigned int fp_regs_check(int features, unsigned int val, -int (*report)(const char *fmt, ...)) -{ - unsigned int result = val; - - unsigned int i; - unsigned long long e[32]; - - if (features & __COBALT_HAVE_FPU) { - - __asm__ __volatile__("stp d0, d1, [%0, #8 * 0] \n\ - stp d2, d3, [%0, #8 * 2] \n\ - stp d4, d5, [%0, #8 * 4]\n\ - stp d6, d7, [%0, #8 * 6]\n\ - stp d8, d9, [%0, #8 * 8]\n\ - stp d10, d11, [%0, #8 * 10]\n\ - stp d12, d13, [%0, #8 * 12]\n\ - stp d14, d15, [%0, #8 * 14]\n\ - stp d16, d17, [%0, #8 * 16]\n\ - stp d18, d19, [%0, #8 * 18]\n\ - stp d20, d21, [%0, #8 * 20]\n\ - stp d22, d23, [%0, #8 * 22]\n\ - stp d24, d25, [%0, #8 * 24]\n\ - stp d26, d27, [%0, #8 * 26]\n\ - stp d28, d29, [%0, #8 * 28]\n\ - stp d30, d31, [%0, #8 * 30]" - - : /* No
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: machine.h: Add 64-bit ffnz implementation. This fixes crash when running xddp-echo.
Module: xenomai-3 Branch: next Commit: fd3a14dffcbce893ad869076671f6ada2385d931 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=fd3a14dffcbce893ad869076671f6ada2385d931 Author: Dmitriy CherkasovDate: Mon Jun 15 17:10:37 2015 -0700 cobalt/arm64: machine.h: Add 64-bit ffnz implementation. This fixes crash when running xddp-echo. --- kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h |4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h index e078564..417a7b0 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h @@ -43,9 +43,7 @@ static inline __attribute_const__ unsigned long ffnz(unsigned long ul) { - int __r; - __asm__("clz\t%0, %1" : "=r" (__r) : "r"(ul & (-ul)) : "cc"); - return 31 - __r; + return __builtin_ffsl(ul) - 1; } #include ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: drop useless test on target architecture
Module: xenomai-3 Branch: next Commit: ae28ba296ee8c491d93b928e18fd8005f769d2fd URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ae28ba296ee8c491d93b928e18fd8005f769d2fd Author: Philippe GerumDate: Sat Oct 17 14:43:25 2015 +0200 cobalt/arm64: drop useless test on target architecture --- kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/features.h |7 +++ 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/features.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/features.h index ea1b06e..74423f6 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/features.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/features.h @@ -28,10 +28,9 @@ #define XENOMAI_FEAT_MAN (__xn_feat_generic_man_mask) -#ifndef __aarch64__ -#define XNARCH_HAVE_LLMULSHFT1 -#define XNARCH_HAVE_NODIV_LLIMD 1 -#endif +#undef XNARCH_HAVE_LLMULSHFT + +#undef XNARCH_HAVE_NODIV_LLIMD struct cobalt_featinfo_archdep { /* no arch-specific feature */ }; ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Gilles Chanteperdrix : testsuite/smokey: add RTnet raw packets test
Module: xenomai-3 Branch: next Commit: 1a67ae939967426551b3cc00c78f8c5e4ad1009c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1a67ae939967426551b3cc00c78f8c5e4ad1009c Author: Gilles ChanteperdrixDate: Sun Nov 1 19:14:40 2015 +0100 testsuite/smokey: add RTnet raw packets test --- configure.ac |1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index 7f258ed..457d026 100644 --- a/configure.ac +++ b/configure.ac @@ -924,6 +924,7 @@ AC_CONFIG_FILES([ \ testsuite/smokey/fpu-stress/Makefile \ testsuite/smokey/net_udp/Makefile \ testsuite/smokey/net_packet_dgram/Makefile \ + testsuite/smokey/net_packet_raw/Makefile \ testsuite/smokey/net_common/Makefile \ testsuite/clocktest/Makefile \ testsuite/xeno-test/Makefile \ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : boilerplate/setup: accept CPU ranges in --cpu-affinity
Module: xenomai-3 Branch: next Commit: 3397f94bdd7d38edbccf9e96789db04cc81800a7 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3397f94bdd7d38edbccf9e96789db04cc81800a7 Author: Philippe GerumDate: Thu May 25 10:33:40 2017 +0200 boilerplate/setup: accept CPU ranges in --cpu-affinity e.g. --cpu-affinity=0-2 selects CPU0, CPU1 and CPU2. --cpu-affinity=3-4,7 selects CPU3, CPU4 and CPU7. --cpu-affinity=1- selects a range from CPU1 to the last CPU configured. NOTE: if a selected CPU is configured but not online, the setup may fail with -EINVAL. --- lib/boilerplate/setup.c | 69 ++- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/lib/boilerplate/setup.c b/lib/boilerplate/setup.c index e534e66..eb9b7e1 100644 --- a/lib/boilerplate/setup.c +++ b/lib/boilerplate/setup.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -150,20 +151,56 @@ static inline void dump_configuration(void) printf("AUTOMATIC_BOOTSTRAP=%d\n", xenomai_auto_bootstrap); } +static inline int resolve_cpuid(const char *s) +{ + return isdigit(*s) ? atoi(s) : -1; +} + static int collect_cpu_affinity(const char *cpu_list) { - char *s = strdup(cpu_list), *p, *n; - int ret, cpu; - - n = s; - while ((p = strtok(n, ",")) != NULL) { - cpu = atoi(p); - if (cpu >= CPU_SETSIZE) { - free(s); - early_warning("invalid CPU number '%d'", cpu); - return -EINVAL; + char *s, *n, *range, *range_p = NULL, *id, *id_r; + int start, end, cpu, nr_cpus, ret; + + /* +* We don't know which CPUs are online yet, but we may know +* which CPU identifier range is valid. Ask for the number of +* processors configured to find out. +*/ + nr_cpus = (int)sysconf(_SC_NPROCESSORS_CONF); + if (nr_cpus < 0) { + ret = -errno; + warning("sysconf(_SC_NPROCESSORS_CONF) failed [%s]", symerror(ret)); + return ret; + } + + s = n = strdup(cpu_list); + while ((range = strtok_r(n, ",", _p)) != NULL) { + if (*range == '\0') + continue; + end = -1; + if (range[strlen(range)-1] == '-') + end = nr_cpus - 1; + id = strtok_r(range, "-", _r); + if (id) { + start = resolve_cpuid(id); + if (*range == '-') { + end = start; + start = 0; + } + id = strtok_r(NULL, "-", _r); + if (id) + end = resolve_cpuid(id); + else if (end < 0) + end = start; + if (start < 0 || start >= nr_cpus || + end < 0 || end >= nr_cpus) + goto fail; + } else { + start = 0; + end = nr_cpus - 1; } - CPU_SET(cpu, &__base_setup_data.cpu_affinity); + for (cpu = start; cpu <= end; cpu++) + CPU_SET(cpu, &__base_setup_data.cpu_affinity); n = NULL; } @@ -182,11 +219,17 @@ static int collect_cpu_affinity(const char *cpu_list) ret = sched_setaffinity(0, sizeof(__base_setup_data.cpu_affinity), &__base_setup_data.cpu_affinity); if (ret) { - early_warning("invalid CPU in affinity list '%s'", cpu_list); - return -errno; + ret = -errno; + early_warning("invalid CPU in '%s'", cpu_list); + return ret; } return 0; +fail: + warning("invalid CPU number/range in '%s'", cpu_list); + free(s); + + return -EINVAL; } static inline char **prep_args(int argc, char *const argv[], int *largcp) ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/kernel: fixup for v3.19+ (trace_seq)
Module: xenomai-3 Branch: next Commit: cd2502ea511f14a6a3121ac0e314a717f5879e3f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=cd2502ea511f14a6a3121ac0e314a717f5879e3f Author: Philippe GerumDate: Tue Nov 3 13:11:25 2015 +0100 cobalt/kernel: fixup for v3.19+ (trace_seq) --- kernel/cobalt/include/asm-generic/xenomai/wrappers.h |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h index 7b191e4..05be40d 100644 --- a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h +++ b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h @@ -55,6 +55,7 @@ #if LINUX_VERSION_CODE < KERNEL_VERSION(3,17,0) #include +#include #undef alloc_netdev #define alloc_netdev(sizeof_priv, name, name_assign_type, setup) \ @@ -67,7 +68,6 @@ trace_seq_buffer_ptr(struct trace_seq *s) { return s->buffer + s->len; } - #endif /* < 3.17 */ #if LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0) ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/powerpc: remove dependency on obsolete CONFIG_MATH_EMU
Module: xenomai-3 Branch: next Commit: 982eb5bb4c45c4eaa0ace08653b983591cf50095 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=982eb5bb4c45c4eaa0ace08653b983591cf50095 Author: Philippe GerumDate: Mon Jul 11 15:42:01 2016 +0200 cobalt/powerpc: remove dependency on obsolete CONFIG_MATH_EMU --- kernel/cobalt/arch/powerpc/Kconfig |4 1 file changed, 4 deletions(-) diff --git a/kernel/cobalt/arch/powerpc/Kconfig b/kernel/cobalt/arch/powerpc/Kconfig index 2069288..6ce3440 100644 --- a/kernel/cobalt/arch/powerpc/Kconfig +++ b/kernel/cobalt/arch/powerpc/Kconfig @@ -1,10 +1,6 @@ source "kernel/xenomai/Kconfig" source "drivers/xenomai/Kconfig" -config XENO_ARCH_MATH_EMU -bool - default y if MATH_EMU || MATH_EMULATION - config XENO_ARCH_FPU def_bool PPC_FPU ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: fix build w/ pre-4.8 kernels
Module: xenomai-3 Branch: next Commit: 23ed7a46234269149e839809782a5d85b40293a6 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=23ed7a46234269149e839809782a5d85b40293a6 Author: Philippe GerumDate: Mon May 15 17:03:02 2017 +0200 cobalt/arm64: fix build w/ pre-4.8 kernels --- kernel/cobalt/arch/arm64/machine.c |4 1 file changed, 4 insertions(+) diff --git a/kernel/cobalt/arch/arm64/machine.c b/kernel/cobalt/arch/arm64/machine.c index 1711d76..b8f80ac 100644 --- a/kernel/cobalt/arch/arm64/machine.c +++ b/kernel/cobalt/arch/arm64/machine.c @@ -35,7 +35,11 @@ static void mach_arm_prefault(struct vm_area_struct *vma) flags = (vma->vm_flags & VM_MAYWRITE) ? FAULT_FLAG_WRITE : 0; for (addr = vma->vm_start; addr != vma->vm_end; addr += PAGE_SIZE) +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,8,0) + handle_mm_fault(vma->vm_mm, vma, addr, flags); +#else handle_mm_fault(vma, addr, flags); +#endif } } ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Jan Kiszka : cobalt/kernel: Introduce __SCHED_CURRENT policy to setschedparam_ex
Module: xenomai-3 Branch: next Commit: fc6016d5530b40453b697210b03823f184ff8815 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=fc6016d5530b40453b697210b03823f184ff8815 Author: Jan KiszkaDate: Tue Mar 8 14:41:28 2016 +0100 cobalt/kernel: Introduce __SCHED_CURRENT policy to setschedparam_ex Define the internal scheduling policy "current": it shall refer to the target thread's current scheduling policy. This will allow to model pthread_setschedprio on top of pthread_setschedparam_ex with only a single syscall. Signed-off-by: Jan Kiszka --- include/cobalt/uapi/sched.h|3 +++ kernel/cobalt/posix/thread.c | 10 ++ kernel/cobalt/trace/cobalt-posix.h |3 ++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/include/cobalt/uapi/sched.h b/include/cobalt/uapi/sched.h index b672095..2a1df44 100644 --- a/include/cobalt/uapi/sched.h +++ b/include/cobalt/uapi/sched.h @@ -21,6 +21,9 @@ #define SCHED_COBALT 42 #define SCHED_WEAK 43 +/* for internal use */ +#define __SCHED_CURRENT44 + #ifndef SCHED_SPORADIC #define SCHED_SPORADIC 10 #define sched_ss_low_priority sched_u.ss.__sched_low_priority diff --git a/kernel/cobalt/posix/thread.c b/kernel/cobalt/posix/thread.c index d87edb1..217b81b 100644 --- a/kernel/cobalt/posix/thread.c +++ b/kernel/cobalt/posix/thread.c @@ -242,6 +242,7 @@ struct xnthread_personality *cobalt_thread_finalize(struct xnthread *zombie) int __cobalt_thread_setschedparam_ex(struct cobalt_thread *thread, int policy, const struct sched_param_ex *param_ex) { + struct xnthread *base_thread = >threadbase; struct xnsched_class *sched_class; union xnsched_policy_param param; xnticks_t tslice; @@ -256,6 +257,15 @@ int __cobalt_thread_setschedparam_ex(struct cobalt_thread *thread, int policy, goto out; } + if (policy == __SCHED_CURRENT) { + policy = base_thread->base_class->policy; + if (xnthread_base_priority(base_thread) == 0) + policy = SCHED_NORMAL; + else if (base_thread->base_class == _class_rt && +xnthread_test_state(base_thread, XNRRB)) + policy = SCHED_RR; + } + tslice = thread->threadbase.rrperiod; sched_class = cobalt_sched_policy_param(, policy, param_ex, ); diff --git a/kernel/cobalt/trace/cobalt-posix.h b/kernel/cobalt/trace/cobalt-posix.h index eaac70d..45f920f 100644 --- a/kernel/cobalt/trace/cobalt-posix.h +++ b/kernel/cobalt/trace/cobalt-posix.h @@ -88,7 +88,8 @@ DECLARE_EVENT_CLASS(syscall_exit, {SCHED_QUOTA, "quota"},\ {SCHED_SPORADIC, "sporadic"}, \ {SCHED_COBALT, "cobalt"}, \ -{SCHED_WEAK, "weak"}) +{SCHED_WEAK, "weak"}, \ +{__SCHED_CURRENT, ""}) #define cobalt_print_sched_params(__policy, __p_ex)\ ({ \ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/powerpc: drop obsolete config knob
Module: xenomai-3 Branch: next Commit: 2e743921f13d192285a9c1b8c51a2c455b09c5d7 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=2e743921f13d192285a9c1b8c51a2c455b09c5d7 Author: Philippe GerumDate: Sat Nov 14 18:14:53 2015 +0100 cobalt/powerpc: drop obsolete config knob As of fbe1164, CONFIG_XENO_ARCH_UNLOCKED_SWITCH is not tested anymore in the code base. --- kernel/cobalt/arch/powerpc/Kconfig |3 --- 1 file changed, 3 deletions(-) diff --git a/kernel/cobalt/arch/powerpc/Kconfig b/kernel/cobalt/arch/powerpc/Kconfig index 1cabef3..2069288 100644 --- a/kernel/cobalt/arch/powerpc/Kconfig +++ b/kernel/cobalt/arch/powerpc/Kconfig @@ -10,6 +10,3 @@ config XENO_ARCH_FPU config XENO_ARCH_SYS3264 def_bool n - -config XENO_ARCH_UNLOCKED_SWITCH - def_bool n ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: use regular context switching code
Module: xenomai-3 Branch: next Commit: f3978abba33c4d6841bca8db57b4b7dc2f50c71a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f3978abba33c4d6841bca8db57b4b7dc2f50c71a Author: Philippe GerumDate: Mon May 22 12:06:46 2017 +0200 cobalt/arm64: use regular context switching code Since 4.9.x, the interrupt pipeline implementation guarantees that the regular context switching code may be used over the head stage, including the fpu management bits. Drop the open coded support and use mainline's implementation instead. At this chance, drop the useless conditionals for handling the non-FPU case: this one does not apply to arm64. --- .../cobalt/arch/arm64/include/asm/xenomai/thread.h | 44 +++- kernel/cobalt/arch/arm64/thread.c | 14 +-- 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h index 319f4d8..eab6851 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h @@ -19,11 +19,16 @@ #ifndef _COBALT_ARM64_ASM_THREAD_H #define _COBALT_ARM64_ASM_THREAD_H +#include #include +#if defined(CONFIG_XENO_ARCH_FPU) && LINUX_VERSION_CODE < KERNEL_VERSION(4,9,0) +#define ARM64_XENO_OLD_SWITCH +#endif + struct xnarchtcb { struct xntcb core; -#ifdef CONFIG_XENO_ARCH_FPU +#ifdef ARM64_XENO_OLD_SWITCH struct fpsimd_state xnfpsimd_state; struct fpsimd_state *fpup; #define xnarch_fpu_ptr(tcb) ((tcb)->fpup) @@ -58,53 +63,36 @@ static inline void xnarch_enter_root(struct xnthread *root) { } int xnarch_escalate(void); -#if defined(CONFIG_XENO_ARCH_FPU) +#ifdef ARM64_XENO_OLD_SWITCH void xnarch_init_root_tcb(struct xnthread *thread); void xnarch_init_shadow_tcb(struct xnthread *thread); -static inline int xnarch_fault_fpu_p(struct ipipe_trap_data *d) -{ - return xnarch_fault_trap(d) == IPIPE_TRAP_FPU_ACC; -} - void xnarch_leave_root(struct xnthread *root); void xnarch_switch_fpu(struct xnthread *from, struct xnthread *thread); -static inline int -xnarch_handle_fpu_fault(struct xnthread *from, - struct xnthread *to, struct ipipe_trap_data *d) -{ - return 0; -} - -#else /* !CONFIG_XENO_ARCH_FPU */ +#else /* !ARM64_XENO_OLD_SWITCH */ static inline void xnarch_init_root_tcb(struct xnthread *thread) { } static inline void xnarch_init_shadow_tcb(struct xnthread *thread) { } +static inline void xnarch_leave_root(struct xnthread *root) { } +static inline void xnarch_switch_fpu(struct xnthread *f, struct xnthread *t) { } + +#endif /* !ARM64_XENO_OLD_SWITCH */ -/* - * Userland may raise FPU faults with FPU-enabled kernels, regardless - * of whether real-time threads actually use FPU, so we simply ignore - * these faults. - */ static inline int xnarch_fault_fpu_p(struct ipipe_trap_data *d) { - return 0; + return xnarch_fault_trap(d) == IPIPE_TRAP_FPU_ACC; } -static inline void xnarch_leave_root(struct xnthread *root) { } - -static inline void xnarch_switch_fpu(struct xnthread *f, struct xnthread *t) { } - -static inline int xnarch_handle_fpu_fault(struct xnthread *from, - struct xnthread *to, struct ipipe_trap_data *d) +static inline int +xnarch_handle_fpu_fault(struct xnthread *from, + struct xnthread *to, struct ipipe_trap_data *d) { return 0; } -#endif /* !CONFIG_XENO_ARCH_FPU */ static inline void xnarch_enable_kfpu(void) { } diff --git a/kernel/cobalt/arch/arm64/thread.c b/kernel/cobalt/arch/arm64/thread.c index 3097aeb..270c99f 100644 --- a/kernel/cobalt/arch/arm64/thread.c +++ b/kernel/cobalt/arch/arm64/thread.c @@ -33,9 +33,10 @@ #include #include #include -#include -#ifdef CONFIG_XENO_ARCH_FPU +#ifdef ARM64_XENO_OLD_SWITCH + +#include #define FPSIMD_EN (0x3 << 20) @@ -104,13 +105,13 @@ void xnarch_init_root_tcb(struct xnthread *thread) tcb->fpup = NULL; } -#endif /* CONFIG_XENO_ARCH_FPU */ +#endif /* ARM64_XENO_OLD_SWITCH */ void xnarch_switch_to(struct xnthread *out, struct xnthread *in) { struct xnarchtcb *out_tcb = >tcb, *in_tcb = >tcb; + struct task_struct *prev, *next, *last; struct mm_struct *prev_mm, *next_mm; - struct task_struct *prev, *next; next = in_tcb->core.host_task; prev = out_tcb->core.host_task; @@ -133,7 +134,12 @@ void xnarch_switch_to(struct xnthread *out, struct xnthread *in) enter_lazy_tlb(prev_mm, next); } +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,9,0) ipipe_switch_to(prev, next); + (void)last; +#else + switch_to(prev, next, last); +#endif } int xnarch_escalate(void) ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : config: bump version info to 3.1-devel
Module: xenomai-3 Branch: next Commit: 1dc071d7ea7275b087880271fd425014c734b2d6 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1dc071d7ea7275b087880271fd425014c734b2d6 Author: Philippe GerumDate: Sun Mar 20 18:51:17 2016 +0100 config: bump version info to 3.1-devel --- config/version-code |2 +- config/version-label |2 +- config/version-name |2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/version-code b/config/version-code index eca690e..ddd61cc 100644 --- a/config/version-code +++ b/config/version-code @@ -1 +1 @@ -3.0.5 +3.0.90 diff --git a/config/version-label b/config/version-label index eca690e..302fdd0 100644 --- a/config/version-label +++ b/config/version-label @@ -1 +1 @@ -3.0.5 +3.1-devel diff --git a/config/version-name b/config/version-name index 2c34bcc..8c51501 100644 --- a/config/version-name +++ b/config/version-name @@ -1 +1 @@ -Sisyphus's Boulder +Xenomai -next ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/syscalls: allow for handing over mode selection to syscall handlers
Module: xenomai-3 Branch: next Commit: 131699aac2efe3f147919033a9c405d6648e9074 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=131699aac2efe3f147919033a9c405d6648e9074 Author: Philippe GerumDate: Thu Jul 7 17:05:16 2016 +0200 cobalt/syscalls: allow for handing over mode selection to syscall handlers Specific system calls may benefit from dealing with the caller's runtime mode by themselves, depending on internal information which the generic syscall dispatcher does not have access to. To this end, a new syscall mode called "handover" is introduced. Syscalls bearing this mode bit are always entered from the current calling domain. The syscall handler may return -ENOSYS to trigger a switch to the converse domain until all domains have been visited once, at which point the syscall fails with -ENOSYS automatically. --- kernel/cobalt/posix/syscall.c |1 - 1 file changed, 1 deletion(-) diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c index 0aeff28..25d21ea 100644 --- a/kernel/cobalt/posix/syscall.c +++ b/kernel/cobalt/posix/syscall.c @@ -737,7 +737,6 @@ restart: * domain. This is a slow path, so proceed with any * pending schedparam update on the fly. */ - switched = 0; if (thread) xnthread_propagate_schedparam(thread); } ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Don Mahurin : cobalt/arm64: fix build for mismatched printf type (%lx, u64) on arm64.
Module: xenomai-3 Branch: next Commit: 16b29397a1f55e8930fc9b6d23946786e84dbec3 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=16b29397a1f55e8930fc9b6d23946786e84dbec3 Author: Don MahurinDate: Wed Sep 2 13:48:36 2015 -0700 cobalt/arm64: fix build for mismatched printf type (%lx,u64) on arm64. pc and orig_r0 are u64 on arm64 and 'unsigned long' or arm and other platforms. printf referencing these are using %lx. On arm64, long and long long (and u64) are 64 bits. Rather than changing printf format, chnage arm64 macros to cast to unsigned long. --- kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h |2 +- kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h |2 +- kernel/cobalt/posix/syscall.c |2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h index 7bf95fb..77c1716 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h @@ -45,7 +45,7 @@ #else /* !CONFIG_OABI_COMPAT */ #define __xn_syscall_p(__regs) ((__regs)->regs[8] == __ARM_NR_ipipe) #endif /* !CONFIG_OABI_COMPAT */ -#define __xn_syscall(__regs) (__xn_reg_sys(__regs) & ~__COBALT_SYSCALL_BIT) +#define __xn_syscall(__regs) ((unsigned long)(__xn_reg_sys(__regs) & ~__COBALT_SYSCALL_BIT)) #define __xn_reg_rval(__regs) ((__regs)->regs[0]) #define __xn_reg_arg1(__regs) ((__regs)->regs[1]) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h index 958f340..a8d7ed4 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h @@ -52,7 +52,7 @@ struct xnarchtcb { #define xnarch_fault_regs(d) ((d)->regs) #define xnarch_fault_trap(d) ((d)->exception) #define xnarch_fault_code(d) (0) -#define xnarch_fault_pc(d) ((d)->regs->pc - 4) /* XXX ? */ +#define xnarch_fault_pc(d) ((unsigned long)((d)->regs->pc - 4)) /* XXX ? */ #define xnarch_fault_pf_p(d) ((d)->exception == IPIPE_TRAP_ACCESS) #define xnarch_fault_bp_p(d) ((current->ptrace & PT_PTRACED) && \ diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c index 2926d7e..8186a0f 100644 --- a/kernel/cobalt/posix/syscall.c +++ b/kernel/cobalt/posix/syscall.c @@ -666,7 +666,7 @@ linux_syscall: return KEVENT_PROPAGATE; bad_syscall: - printk(XENO_WARNING "bad syscall <%#llx>\n", __xn_syscall(regs)); + printk(XENO_WARNING "bad syscall <%#lx>\n", __xn_syscall(regs)); __xn_error_return(regs, -ENOSYS); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/powerpc: track current mm unconditionally
Module: xenomai-3 Branch: next Commit: 76bbe2c36a6aa33bde50a70cc2a4bdc2242d8c2f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=76bbe2c36a6aa33bde50a70cc2a4bdc2242d8c2f Author: Philippe GerumDate: Sat Nov 14 15:21:02 2015 +0100 cobalt/powerpc: track current mm unconditionally All pipelines Cobalt can work with (i.e. 3.10+) for the powerpc architecture do provide the mm tracking feature unconditionally, so there is no point in keeping any build switch for it. --- kernel/cobalt/arch/powerpc/Kconfig |4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/cobalt/arch/powerpc/Kconfig b/kernel/cobalt/arch/powerpc/Kconfig index 4d5e6db..40eae0b 100644 --- a/kernel/cobalt/arch/powerpc/Kconfig +++ b/kernel/cobalt/arch/powerpc/Kconfig @@ -1,12 +1,12 @@ source "kernel/xenomai/Kconfig" source "drivers/xenomai/Kconfig" -config IPIPE_WANT_ACTIVE_MM +config XENO_ARCH_MATH_EMU bool + default y if MATH_EMU || MATH_EMULATION config IPIPE_WANT_PREEMPTIBLE_SWITCH bool - select IPIPE_WANT_ACTIVE_MM default y if XENO_ARCH_UNLOCKED_SWITCH default n if !XENO_ARCH_UNLOCKED_SWITCH ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: prepare-kernel: add arm64 arch
Module: xenomai-3 Branch: next Commit: c644995044887953ee4baecdaa47fe79f2025c71 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c644995044887953ee4baecdaa47fe79f2025c71 Author: Dmitriy CherkasovDate: Wed May 6 15:27:10 2015 -0700 cobalt/arm64: prepare-kernel: add arm64 arch --- scripts/prepare-kernel.sh |3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/prepare-kernel.sh b/scripts/prepare-kernel.sh index 398ebcb..d4aa2ef 100755 --- a/scripts/prepare-kernel.sh +++ b/scripts/prepare-kernel.sh @@ -284,6 +284,9 @@ while : ; do arm) linux_arch=arm ;; + arm64) + linux_arch=arm64 + ;; sh|sh4) linux_arch=sh ;; ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Gilles Chanteperdrix : cobalt/arm64: attempt at fixing fpu switch
Module: xenomai-3 Branch: next Commit: 42d137fca23021da0aef8222cc0146d11913464d URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=42d137fca23021da0aef8222cc0146d11913464d Author: Gilles ChanteperdrixDate: Fri Oct 30 17:14:00 2015 +0100 cobalt/arm64: attempt at fixing fpu switch Return to eager switching, since user-space applications use FPU registers even when not using the FPU, but use an auxiliary backup area when the "TIF_FOREIGN_FPSTATE" bit is set, in order to avoid clobbering the saved FPU state. --- .../cobalt/arch/arm64/include/asm/xenomai/thread.h | 14 +++-- kernel/cobalt/arch/arm64/thread.c | 54 +--- 2 files changed, 25 insertions(+), 43 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h index 9055e58..4b247ac 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h @@ -24,6 +24,7 @@ struct xnarchtcb { struct xntcb core; #ifdef CONFIG_XENO_ARCH_FPU + struct fpsimd_state xnfpsimd_state; struct fpsimd_state *fpup; #define xnarch_fpu_ptr(tcb) ((tcb)->fpup) #endif @@ -67,7 +68,10 @@ static inline void xnarch_init_root_tcb(struct xnthread *thread) void xnarch_init_shadow_tcb(struct xnthread *thread); -int xnarch_fault_fpu_p(struct ipipe_trap_data *d); +static inline int xnarch_fault_fpu_p(struct ipipe_trap_data *d) +{ + return xnarch_fault_trap(d) == IPIPE_TRAP_FPU_ACC; +} void xnarch_leave_root(struct xnthread *root); @@ -75,8 +79,12 @@ void xnarch_save_fpu(struct xnthread *thread); void xnarch_switch_fpu(struct xnthread *from, struct xnthread *thread); -int xnarch_handle_fpu_fault(struct xnthread *from, - struct xnthread *to, struct ipipe_trap_data *d); +static inline int +xnarch_handle_fpu_fault(struct xnthread *from, + struct xnthread *to, struct ipipe_trap_data *d) +{ + return 0; +} #else /* !CONFIG_XENO_ARCH_FPU */ diff --git a/kernel/cobalt/arch/arm64/thread.c b/kernel/cobalt/arch/arm64/thread.c index 2238751..b987e09 100644 --- a/kernel/cobalt/arch/arm64/thread.c +++ b/kernel/cobalt/arch/arm64/thread.c @@ -6,6 +6,7 @@ * * ARM64 port * Copyright (C) 2015 Dmitriy Cherkasov + * Copyright (C) 2015 Gilles Chanteperdrix * * Xenomai is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by @@ -41,7 +42,7 @@ static inline unsigned long get_cpacr(void) { unsigned long result; - __asm__ __volatile__("mrs %0, cpacr_el1": "=r"(result)); + __asm__ ("mrs %0, cpacr_el1": "=r"(result)); return result; } @@ -53,21 +54,20 @@ static inline void set_cpacr(long val) : /* */ : "r"(val)); } -static void enable_fpsimd(void) +static inline void enable_fpsimd(void) { - unsigned long cpacr = get_cpacr(); - cpacr |= FPSIMD_EN; - set_cpacr(cpacr); + set_cpacr(get_cpacr() | FPSIMD_EN); } -int xnarch_fault_fpu_p(struct ipipe_trap_data *d) +static inline struct fpsimd_state *get_fpu_owner(struct xnarchtcb *rootcb) { - return (d->exception == IPIPE_TRAP_FPU_ACC); -} + struct task_struct *curr = rootcb->core.host_task; -static inline struct fpsimd_state *get_fpu_owner(struct xnarchtcb *tcb) -{ - return &(tcb->core.tsp->fpsimd_state); + if (test_ti_thread_flag(task_thread_info(curr), TIF_FOREIGN_FPSTATE)) + /* Foreign fpu state, use auxiliary backup area */ + return >xnfpsimd_state; + + return >thread.fpsimd_state; } void xnarch_leave_root(struct xnthread *root) @@ -76,13 +76,6 @@ void xnarch_leave_root(struct xnthread *root) rootcb->fpup = get_fpu_owner(rootcb); } -void xnarch_save_fpu(struct xnthread *thread) -{ - struct xnarchtcb *tcb = &(thread->tcb); - if (xnarch_fpu_ptr(tcb)) - fpsimd_save_state(tcb->fpup); -} - void xnarch_switch_fpu(struct xnthread *from, struct xnthread *to) { struct fpsimd_state *const from_fpup = from ? from->tcb.fpup : NULL; @@ -93,35 +86,16 @@ void xnarch_switch_fpu(struct xnthread *from, struct xnthread *to) if (from_fpup == to_fpup) return; - if (from_fpup) - fpsimd_save_state(from_fpup); + fpsimd_save_state(from_fpup); fpsimd_load_state(to_fpup); -} - -int xnarch_handle_fpu_fault(struct xnthread *from, - struct xnthread *to, struct ipipe_trap_data *d) -{ - spl_t s; - - /* FPU should already be enabled for XNFPU tasks. */ - if (xnthread_test_state(to, XNFPU)) - BUG(); - - xnlock_get_irqsave(, s); - xnthread_set_state(to, XNFPU); - xnlock_put_irqrestore(, s); - - xnarch_switch_fpu(from,
[Xenomai-git] Philippe Gerum : cobalt/arm: track current mm unconditionally
Module: xenomai-3 Branch: next Commit: 7e7d18485b528c8625bc79d0550c749c519c871c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7e7d18485b528c8625bc79d0550c749c519c871c Author: Philippe GerumDate: Sat Nov 14 15:21:02 2015 +0100 cobalt/arm: track current mm unconditionally All pipelines Cobalt can work with (i.e. 3.10+) for the arm architecture do provide the mm tracking feature unconditionally, so there is no point in keeping any build switch for it. --- kernel/cobalt/arch/arm/Kconfig |3 --- 1 file changed, 3 deletions(-) diff --git a/kernel/cobalt/arch/arm/Kconfig b/kernel/cobalt/arch/arm/Kconfig index 2043d70..0c4e0aa 100644 --- a/kernel/cobalt/arch/arm/Kconfig +++ b/kernel/cobalt/arch/arm/Kconfig @@ -23,9 +23,6 @@ config IPIPE_WANT_PREEMPTIBLE_SWITCH default y if XENO_ARCH_UNLOCKED_SWITCH default n if !XENO_ARCH_UNLOCKED_SWITCH -config IPIPE_WANT_ACTIVE_MM - def_bool y - config XENO_ARCH_FPU def_bool VFP ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: FPU code cleanup
Module: xenomai-3 Branch: next Commit: 26d8310032390ed87ead2a8093a28d02cc98b6bd URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=26d8310032390ed87ead2a8093a28d02cc98b6bd Author: Dmitriy CherkasovDate: Fri Oct 2 12:54:37 2015 -0700 cobalt/arm64: FPU code cleanup --- kernel/cobalt/arch/arm64/thread.c | 89 - 1 file changed, 39 insertions(+), 50 deletions(-) diff --git a/kernel/cobalt/arch/arm64/thread.c b/kernel/cobalt/arch/arm64/thread.c index db369be..35dbd72 100644 --- a/kernel/cobalt/arch/arm64/thread.c +++ b/kernel/cobalt/arch/arm64/thread.c @@ -36,31 +36,44 @@ #if defined(CONFIG_XENO_ARCH_FPU) -static void enable_fpsimd(void) { - __asm__ __volatile__("mrs x1, cpacr_el1\n\ - orr x1, x1, #(0x3 << 20)\n\ - msr cpacr_el1, x1\n\ - isb" : : : "x1", "memory", "cc"); +#define FPSIMD_EN (0x3 << 20) + +static inline unsigned long get_cpacr(void) +{ + unsigned long result; + __asm__ __volatile__("mrs %0, cpacr_el1": "=r"(result)); + return result; +} + +static inline void set_cpacr(long val) +{ + __asm__ __volatile__ ( + "msr cpacr_el1, %0\n\t" + "isb" + : /* */ : "r"(val)); } -static void disable_fpsimd(void) { - __asm__ __volatile__("mrs x1, cpacr_el1\n\ - and x1, x1, #~(0x3 << 20)\n\ - msr cpacr_el1, x1\n\ - isb" : : : "x1", "memory", "cc"); +static void enable_fpsimd(void) +{ + unsigned long cpacr = get_cpacr(); + cpacr |= FPSIMD_EN; + set_cpacr(cpacr); +} + +static void disable_fpsimd(void) +{ + unsigned long cpacr = get_cpacr(); + cpacr &= ~FPSIMD_EN; + set_cpacr(cpacr); } int xnarch_fault_fpu_p(struct ipipe_trap_data *d) { - /* check if this is an FPU access trap to be handled by Xenomai */ - if(d->exception == IPIPE_TRAP_FPU_ACC){ - return 1; - } - /* FPU already enabled, propagate fault to kernel */ - return 0; + return (d->exception == IPIPE_TRAP_FPU_ACC); } -static inline struct fpsimd_state *get_fpu_owner(struct xnarchtcb *tcb) { +static inline struct fpsimd_state *get_fpu_owner(struct xnarchtcb *tcb) +{ return &(tcb->core.tsp->fpsimd_state); } @@ -68,7 +81,6 @@ void xnarch_leave_root(struct xnthread *root) { struct xnarchtcb *rootcb = xnthread_archtcb(root); rootcb->fpup = get_fpu_owner(rootcb); - disable_fpsimd(); } void xnarch_save_fpu(struct xnthread *thread) @@ -83,29 +95,15 @@ void xnarch_switch_fpu(struct xnthread *from, struct xnthread *to) struct fpsimd_state *const from_fpup = from ? from->tcb.fpup : NULL; struct fpsimd_state *const to_fpup = to->tcb.fpup; - /* -* This only gets called if XNFPU flag is set, or if migrating to Linux. -* In both cases, this means turn on FPU and switch. -*/ enable_fpsimd(); - if (xnthread_test_state(to, XNROOT) == 0) { - if (from_fpup == to_fpup) - return; - - if (from_fpup) - fpsimd_save_state(from_fpup); - - fpsimd_load_state(to_fpup); - } - else { - /* Going to Linux. */ - if (from_fpup) - fpsimd_save_state(from_fpup); + if (from_fpup == to_fpup) + return; - fpsimd_load_state(to_fpup); - } + if (from_fpup) + fpsimd_save_state(from_fpup); + fpsimd_load_state(to_fpup); } int xnarch_handle_fpu_fault(struct xnthread *from, @@ -113,9 +111,9 @@ int xnarch_handle_fpu_fault(struct xnthread *from, { spl_t s; + /* FPU should already be enabled for XNFPU tasks. */ if (xnthread_test_state(to, XNFPU)) - /* FPU is already enabled, probably an exception */ - return 0; + BUG(); xnlock_get_irqsave(, s); xnthread_set_state(to, XNFPU); @@ -124,20 +122,13 @@ int xnarch_handle_fpu_fault(struct xnthread *from, xnarch_switch_fpu(from, to); return 1; - } void xnarch_init_shadow_tcb(struct xnthread *thread) { - spl_t s; struct xnarchtcb *tcb = xnthread_archtcb(thread); - tcb->fpup = &(tcb->core.host_task->thread.fpsimd_state); - - xnlock_get_irqsave(, s); xnthread_clear_state(thread, XNFPU); - xnlock_put_irqrestore(, s); - } #endif /* CONFIG_XENO_ARCH_FPU */ @@ -210,16 +201,14 @@ void xnarch_switch_to(struct xnthread *out, struct xnthread *in) xnarch_tls_thread_switch(in_tcb->core.tip->task); xnarch_contextidr_thread_switch(in_tcb->core.tip->task); - /* check if we need to switch FPU on return to Linux */ - if (xnthread_test_state(in, XNROOT) == 1) -
[Xenomai-git] Gilles Chanteperdrix : testsuite/smokey: add RTnet testsuite
Module: xenomai-3 Branch: next Commit: a76db70a77866dc56e41b2120a0252597eed3561 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a76db70a77866dc56e41b2120a0252597eed3561 Author: Gilles ChanteperdrixDate: Sun Oct 11 16:05:18 2015 +0200 testsuite/smokey: add RTnet testsuite Starting with UDP and raw sockets. Measuring round trip time and checking for lost packets. --- configure.ac |3 +++ 1 file changed, 3 insertions(+) diff --git a/configure.ac b/configure.ac index 77e9fea..7f258ed 100644 --- a/configure.ac +++ b/configure.ac @@ -922,6 +922,9 @@ AC_CONFIG_FILES([ \ testsuite/smokey/tsc/Makefile \ testsuite/smokey/leaks/Makefile \ testsuite/smokey/fpu-stress/Makefile \ + testsuite/smokey/net_udp/Makefile \ + testsuite/smokey/net_packet_dgram/Makefile \ + testsuite/smokey/net_common/Makefile \ testsuite/clocktest/Makefile \ testsuite/xeno-test/Makefile \ utils/Makefile \ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: restrict unlocked switch to SMP
Module: xenomai-3 Branch: next Commit: cfd8292ffa1c7702b2678245f37cd884f5f5e275 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=cfd8292ffa1c7702b2678245f37cd884f5f5e275 Author: Philippe GerumDate: Thu Sep 17 11:43:50 2015 +0200 cobalt/arm64: restrict unlocked switch to SMP Unlocked switching for Xenomai/ARM was specifically introduced for improving the interrupt latency on low-end armv4/armv5 platforms with VIVT caches. The once massive overhead imposed on the MMU context switching code for invalidating the cache is long gone with VIPT indexing, and keeping IRQs off while switching the memory context on armv8 these days is not an issue. Actually, the complexity of the code involved in dealing with unlocked switching may overbalance the expected gain. However, the mainline kernel implementation for ASID management in the SMP case currently requires us to keep IRQs enabled when allocating a new MM context over the Xenomai domain, just like it did for aarch32 during the 2.6.3x time frame until the IPI-based approach was eventually dropped. So, let's restrict unlocked switching to the SMP case, forcing it off otherwise, in the hope we can drop it entirely in the future. At this chance, CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH moves to the kernel area, where it actually belongs. --- kernel/cobalt/arch/arm64/Kconfig | 21 + 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/kernel/cobalt/arch/arm64/Kconfig b/kernel/cobalt/arch/arm64/Kconfig index dc6485d..927c647 100644 --- a/kernel/cobalt/arch/arm64/Kconfig +++ b/kernel/cobalt/arch/arm64/Kconfig @@ -1,27 +1,8 @@ source "kernel/xenomai/Kconfig" source "drivers/xenomai/Kconfig" -menu "Machine/platform-specific options" - config XENO_ARCH_UNLOCKED_SWITCH - bool "Unlocked context switch" - default y - help - The Cobalt core may allow non-atomic execution of the - machine-dependent context switching code, so that other CPUs - and/or local interrupts may execute concurrently. - - This option reduces interrupt latency when costly cache and - TLB flushes are required to switch context. - - You definitely want to enable that option on low-end ARM - platforms. -endmenu - -config IPIPE_WANT_PREEMPTIBLE_SWITCH - bool - default y if XENO_ARCH_UNLOCKED_SWITCH - default n if !XENO_ARCH_UNLOCKED_SWITCH + def_bool IPIPE_WANT_PREEMPTIBLE_SWITCH config IPIPE_WANT_ACTIVE_MM def_bool y ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: Makefile: fix arch path
Module: xenomai-3 Branch: next Commit: fd1e8a2b93ab10b43d5ba59fb647960d731e93b3 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=fd1e8a2b93ab10b43d5ba59fb647960d731e93b3 Author: Dmitriy CherkasovDate: Thu May 7 13:54:32 2015 -0700 cobalt/arm64: Makefile: fix arch path --- kernel/cobalt/arch/arm64/Makefile |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/cobalt/arch/arm64/Makefile b/kernel/cobalt/arch/arm64/Makefile index f2e4e20..a135f99 100644 --- a/kernel/cobalt/arch/arm64/Makefile +++ b/kernel/cobalt/arch/arm64/Makefile @@ -2,4 +2,4 @@ obj-$(CONFIG_XENOMAI) += xenomai.o xenomai-y := machine.o mayday.o thread.o switch.o syscall.o -ccflags-y := -Iarch/arm/xenomai/include -Iinclude/xenomai +ccflags-y := -Iarch/arm64/xenomai/include -Iinclude/xenomai ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : lib/cobalt/mutex: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: c517ea0362c8c4e004a7bf6523c0fe3b6093d5bf URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c517ea0362c8c4e004a7bf6523c0fe3b6093d5bf Author: Philippe GerumDate: Tue Feb 16 10:13:03 2016 +0100 lib/cobalt/mutex: add support for priority ceiling protocol --- configure.ac |2 + include/boilerplate/libc.h | 19 +++ include/cobalt/pthread.h |7 ++ lib/cobalt/cobalt.wrappers |2 + lib/cobalt/init.c |1 + lib/cobalt/internal.h |8 ++ lib/cobalt/mutex.c | 301 +++- lib/cobalt/sched.c | 33 - lib/cobalt/thread.c|7 +- 9 files changed, 311 insertions(+), 69 deletions(-) diff --git a/configure.ac b/configure.ac index 9eeb34d..c9d0fcf 100644 --- a/configure.ac +++ b/configure.ac @@ -511,6 +511,8 @@ save_LIBS="$LIBS" LIBS="$LIBS -lrt -lpthread" AC_CHECK_FUNCS([pthread_mutexattr_setprotocol \ pthread_mutexattr_getprotocol \ + pthread_mutexattr_getprioceiling \ + pthread_mutexattr_setprioceiling \ pthread_mutexattr_setrobust_np \ pthread_condattr_getclock \ pthread_condattr_setclock \ diff --git a/include/boilerplate/libc.h b/include/boilerplate/libc.h index 134176e..80ababf 100644 --- a/include/boilerplate/libc.h +++ b/include/boilerplate/libc.h @@ -108,6 +108,25 @@ int pthread_mutexattr_getprotocol(const pthread_mutexattr_t * } #endif /* !HAVE_PTHREAD_MUTEXATTR_GETPROTOCOL */ +#ifndef HAVE_PTHREAD_MUTEXATTR_SETPRIOCEILING +static inline +int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *attr, +int prioceiling) +{ + return ENOSYS; +} +#endif /* !HAVE_PTHREAD_MUTEXATTR_SETPRIOCEILING */ + +#ifndef HAVE_PTHREAD_MUTEXATTR_GETPRIOCEILING +static inline +int pthread_mutexattr_getprioceiling(const pthread_mutexattr_t * + __restrict attr, +int *__restrict prioceiling) +{ + return ENOSYS; +} +#endif /* !HAVE_PTHREAD_MUTEXATTR_GETPRIOCEILING */ + #ifndef HAVE_PTHREAD_ATTR_SETAFFINITY_NP #include static inline diff --git a/include/cobalt/pthread.h b/include/cobalt/pthread.h index 386c337..f1b1c8a 100644 --- a/include/cobalt/pthread.h +++ b/include/cobalt/pthread.h @@ -67,6 +67,13 @@ COBALT_DECL(int, pthread_mutex_trylock(pthread_mutex_t *mutex)); COBALT_DECL(int, pthread_mutex_unlock(pthread_mutex_t *mutex)); +COBALT_DECL(int, pthread_mutex_setprioceiling(pthread_mutex_t *__restrict mutex, + int prioceiling, + int *__restrict old_ceiling)); + +COBALT_DECL(int, pthread_mutex_getprioceiling(pthread_mutex_t *__restrict mutex, + int *__restrict old_ceiling)); + COBALT_DECL(int, pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *attr)); diff --git a/lib/cobalt/cobalt.wrappers b/lib/cobalt/cobalt.wrappers index 0378abf..4f883f3 100644 --- a/lib/cobalt/cobalt.wrappers +++ b/lib/cobalt/cobalt.wrappers @@ -32,6 +32,8 @@ --wrap pthread_mutex_trylock --wrap pthread_mutex_timedlock --wrap pthread_mutex_unlock +--wrap pthread_mutex_setprioceiling +--wrap pthread_mutex_getprioceiling --wrap pthread_cond_init --wrap pthread_cond_destroy --wrap pthread_cond_wait diff --git a/lib/cobalt/init.c b/lib/cobalt/init.c index f260744..69d4763 100644 --- a/lib/cobalt/init.c +++ b/lib/cobalt/init.c @@ -177,6 +177,7 @@ static void __cobalt_init(void) sizeof(struct cobalt_sem_shadow)); cobalt_mutex_init(); + cobalt_sched_init(); cobalt_thread_init(); cobalt_print_init(); } diff --git a/lib/cobalt/internal.h b/lib/cobalt/internal.h index df1f7c0..3241e9b 100644 --- a/lib/cobalt/internal.h +++ b/lib/cobalt/internal.h @@ -57,6 +57,8 @@ void cobalt_thread_init(void); int cobalt_thread_probe(pid_t pid); +void cobalt_sched_init(void); + void cobalt_print_init(void); void cobalt_print_init_atfork(void); @@ -78,4 +80,10 @@ void cobalt_check_features(struct cobalt_featinfo *finfo); extern struct sigaction __cobalt_orig_sigdebug; +extern int __cobalt_std_fifo_minpri, + __cobalt_std_fifo_maxpri; + +extern int __cobalt_std_rr_minpri, + __cobalt_std_rr_maxpri; + #endif /* _LIB_COBALT_INTERNAL_H */ diff --git a/lib/cobalt/mutex.c b/lib/cobalt/mutex.c index eba236b..ac462b8 100644 --- a/lib/cobalt/mutex.c +++ b/lib/cobalt/mutex.c @@ -99,6 +99,9 @@ void cobalt_mutex_init(void) * mutex, increase CONFIG_XENO_OPT_SHARED_HEAPSZ for a process-shared * mutex, or CONFIG_XENO_OPT_PRIVATE_HEAPSZ for a process-private mutex. * - EAGAIN, no registry slot available, check/raise CONFIG_XENO_OPT_REGISTRY_NRSLOTS. + * - ENOSYS, @a attr mentions
[Xenomai-git] Philippe Gerum : testsuite/smokey: add basic FPU stress test
Module: xenomai-3 Branch: next Commit: ac17e19da18581b138d2293b3a131bbf6f81521e URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ac17e19da18581b138d2293b3a131bbf6f81521e Author: Philippe GerumDate: Sat Oct 24 15:52:48 2015 +0200 testsuite/smokey: add basic FPU stress test --- configure.ac |6 +- testsuite/smokey/Makefile.am |1 + testsuite/smokey/fpu-stress/Makefile.am |8 +++ testsuite/smokey/fpu-stress/fpu-stress.c | 95 ++ 4 files changed, 105 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index 97bebf0..77e9fea 100644 --- a/configure.ac +++ b/configure.ac @@ -921,11 +921,7 @@ AC_CONFIG_FILES([ \ testsuite/smokey/timerfd/Makefile \ testsuite/smokey/tsc/Makefile \ testsuite/smokey/leaks/Makefile \ - testsuite/smokey/net_udp/Makefile \ - testsuite/smokey/net_packet_dgram/Makefile \ - testsuite/smokey/net_packet_raw/Makefile \ - testsuite/smokey/net_common/Makefile \ - testsuite/smokey/cpu-affinity/Makefile \ + testsuite/smokey/fpu-stress/Makefile \ testsuite/clocktest/Makefile \ testsuite/xeno-test/Makefile \ utils/Makefile \ diff --git a/testsuite/smokey/Makefile.am b/testsuite/smokey/Makefile.am index 5a82018..ae60a44 100644 --- a/testsuite/smokey/Makefile.am +++ b/testsuite/smokey/Makefile.am @@ -9,6 +9,7 @@ COBALT_SUBDIRS =\ arith \ bufp\ cpu-affinity\ + fpu-stress \ iddp\ leaks \ net_packet_dgram\ diff --git a/testsuite/smokey/fpu-stress/Makefile.am b/testsuite/smokey/fpu-stress/Makefile.am new file mode 100644 index 000..c90d0dd --- /dev/null +++ b/testsuite/smokey/fpu-stress/Makefile.am @@ -0,0 +1,8 @@ + +noinst_LIBRARIES = libfpu-stress.a + +libfpu_stress_a_SOURCES = fpu-stress.c + +libfpu_stress_a_CPPFLAGS = \ + @XENO_USER_CFLAGS@ \ + -I$(top_srcdir)/include diff --git a/testsuite/smokey/fpu-stress/fpu-stress.c b/testsuite/smokey/fpu-stress/fpu-stress.c new file mode 100644 index 000..59383c9 --- /dev/null +++ b/testsuite/smokey/fpu-stress/fpu-stress.c @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include + +smokey_test_plugin(fpu_stress, + SMOKEY_ARGLIST( + SMOKEY_INT(duration), + ), + "Check FPU context sanity during real-time stress\n" + "\tduration=\thow long to run the stress loop (0=indefinitely)" +); + +static int fp_features; + +static void *stress_loop(void *arg) +{ + struct timespec rqt = { + .tv_sec = 0, + .tv_nsec = CONFIG_XENO_DEFAULT_PERIOD + }; + + for (;;) { + fp_regs_set(fp_features, 0xf1f5f1f5); + clock_nanosleep(CLOCK_MONOTONIC, 0, , NULL); + } + + return NULL; +} + +static int report_error(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + smokey_vatrace(fmt, ap); + va_end(ap); + + return 0; +} + +static int run_fpu_stress(struct smokey_test *t, + int argc, char *const argv[]) +{ + unsigned sleep_ms, n, rounds, duration = 3; + struct sched_param param; + pthread_attr_t attr; + struct timespec rqt; + pthread_t tid; + int ret; + + fp_features = cobalt_fp_detect(); + if (fp_features == 0) + return -ENOSYS; + + smokey_parse_args(t, argc, argv); + + if (SMOKEY_ARG_ISSET(fpu_stress, duration)) + duration = SMOKEY_ARG_INT(fpu_stress, duration); + + rqt.tv_sec = 0; + rqt.tv_nsec = CONFIG_XENO_DEFAULT_PERIOD; + sleep_ms = 100UL / rqt.tv_nsec; /* wake up each ms */ + rounds = duration * 1000UL / sleep_ms; + + pthread_attr_init(); + pthread_attr_setdetachstate(, PTHREAD_CREATE_JOINABLE); + pthread_attr_setinheritsched(, PTHREAD_EXPLICIT_SCHED); + pthread_attr_setschedpolicy(, SCHED_FIFO); + param.sched_priority = 10; + pthread_attr_setschedparam(, ); + ret = pthread_create(, , stress_loop, NULL); + if (ret) + return -ret; + + if (rounds) + smokey_trace("running for %d seconds", duration); + else + smokey_trace("running indefinitely..."); + + for (n = 0; rounds == 0 || n < rounds; n++) { + fp_regs_set(fp_features, n); + __STD(clock_nanosleep(CLOCK_MONOTONIC, 0, , NULL)); + if (fp_regs_check(fp_features, n, report_error) != n) { + ret = -EINVAL; + break; + } + } + + pthread_cancel(tid); + pthread_join(tid, NULL); + + return ret; +} ___ Xenomai-git
[Xenomai-git] Mauro Salvini : lib/alchemy: fix some documentation lacks
Module: xenomai-3 Branch: next Commit: 29eb030c03591c31232d49e8b0b4838cf993e92f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=29eb030c03591c31232d49e8b0b4838cf993e92f Author: Mauro SalviniDate: Mon May 22 08:18:00 2017 +0200 lib/alchemy: fix some documentation lacks For some functions was not documented that TM_INFINITE and TM_NONBLOCK values could be used as argument. --- lib/alchemy/buffer.c | 20 ++-- lib/alchemy/cond.c | 10 -- lib/alchemy/event.c | 10 +- lib/alchemy/heap.c | 10 +- lib/alchemy/mutex.c |8 +++- lib/alchemy/pipe.c | 10 +- lib/alchemy/queue.c | 20 ++-- lib/alchemy/sem.c| 10 +- lib/alchemy/task.c | 20 ++-- 9 files changed, 105 insertions(+), 13 deletions(-) diff --git a/lib/alchemy/buffer.c b/lib/alchemy/buffer.c index 88bcb9a..ac4a9ba 100644 --- a/lib/alchemy/buffer.c +++ b/lib/alchemy/buffer.c @@ -345,7 +345,11 @@ out: * @param len The length in bytes of the memory area pointed to by @a * ptr. * - * @param timeout A delay expressed in clock ticks. + * @param timeout A delay expressed in clock ticks. Passing + * TM_INFINITE causes the caller to block indefinitely until enough + * data is available. Passing TM_NONBLOCK causes the service + * to return immediately without blocking in case not enough data is + * available. * * @apitags{xthread-nowait, switch-primary} */ @@ -366,6 +370,10 @@ out: * ptr. * * @param abs_timeout An absolute date expressed in clock ticks. + * Passing TM_INFINITE causes the caller to block indefinitely until + * enough data is available. Passing TM_NONBLOCK causes the service + * to return immediately without blocking in case not enough data is + * available. * * @apitags{xthread-nowait, switch-primary} */ @@ -581,7 +589,11 @@ out: * * @param len The length in bytes of the message data. * - * @param timeout A delay expressed in clock ticks. + * @param timeout A delay expressed in clock ticks. Passing + * TM_INFINITE causes the caller to block indefinitely until enough + * buffer space is available. Passing TM_NONBLOCK causes the service + * to return immediately without blocking in case of buffer space + * shortage. * * @apitags{xthread-nowait, switch-primary} */ @@ -601,6 +613,10 @@ out: * @param len The length in bytes of the message data. * * @param abs_timeout An absolute date expressed in clock ticks. + * Passing TM_INFINITE causes the caller to block indefinitely until + * enough buffer space is available. Passing TM_NONBLOCK causes the + * service to return immediately without blocking in case of buffer + * space shortage. * * @apitags{xthread-nowait, switch-primary} */ diff --git a/lib/alchemy/cond.c b/lib/alchemy/cond.c index e825b80..1f424b1 100644 --- a/lib/alchemy/cond.c +++ b/lib/alchemy/cond.c @@ -291,7 +291,9 @@ int rt_cond_broadcast(RT_COND *cond) * @param mutex The address of the mutex serializing the access to the * shared data. * - * @param timeout A delay expressed in clock ticks. + * @param timeout A delay expressed in clock ticks. Passing + * TM_INFINITE causes the caller to block indefinitely. Passing + * TM_NONBLOCK causes the caller to return immediately without block. * * @apitags{xthread-only, switch-primary} */ @@ -309,6 +311,9 @@ int rt_cond_broadcast(RT_COND *cond) * shared data. * * @param abs_timeout An absolute date expressed in clock ticks. + * Passing TM_INFINITE causes the caller to block indefinitely. + * Passing TM_NONBLOCK causes the caller to return immediately + * without block. * * @apitags{xthread-only, switch-primary} */ @@ -330,7 +335,8 @@ int rt_cond_broadcast(RT_COND *cond) * @param abs_timeout An absolute date expressed in clock ticks, * specifying a time limit to wait for the condition variable to be * signaled (see note). Passing NULL causes the caller to - * block indefinitely. + * block indefinitely. Passing { .tv_sec = 0, .tv_nsec = 0 } causes + * the caller to return immediately without block. * * @return Zero is returned upon success. Otherwise: * diff --git a/lib/alchemy/event.c b/lib/alchemy/event.c index bd42bff..15379fc 100644 --- a/lib/alchemy/event.c +++ b/lib/alchemy/event.c @@ -291,7 +291,11 @@ out: * * @param mode The pend mode. * - * @param timeout A delay expressed in clock ticks, + * @param timeout A delay expressed in clock ticks. + * Passing TM_INFINITE causes the caller to block indefinitely until + * the request is satisfied. Passing TM_NONBLOCK causes the service + * to return without blocking in case the request cannot be satisfied + * immediately. * * @apitags{xthread-nowait, switch-primary} */ @@ -313,6 +317,10 @@ out: * @param mode The pend mode. * * @param abs_timeout An absolute date expressed in clock ticks. + * Passing TM_INFINITE causes the caller to block indefinitely until + * the request is
[Xenomai-git] Philippe Gerum : cobalt/powerpc: drop support for unlocked context switch
Module: xenomai-3 Branch: next Commit: a03ad935c91e8b885a3abbc9b6918bf7b57d04bf URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a03ad935c91e8b885a3abbc9b6918bf7b57d04bf Author: Philippe GerumDate: Sat Nov 14 16:41:13 2015 +0100 cobalt/powerpc: drop support for unlocked context switch This feature never actually brought any measurable gain on powerpc platforms, compared to the complexity of its implementation in the pipeline. It was primarily aimed at reducing latency for interrupt handlers when costly cache and TLB flushes are required to switch context, at the expense of increasing the scheduling latency. It turned out to be counter-productive on common powerpc platforms, with efficient MMUs. This feature has been default off for a while now, and 4.1+ pipelines won't provide support for it anymore. Time to drop support from Xenomai too. --- kernel/cobalt/arch/powerpc/Kconfig | 20 +--- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/kernel/cobalt/arch/powerpc/Kconfig b/kernel/cobalt/arch/powerpc/Kconfig index 40eae0b..1cabef3 100644 --- a/kernel/cobalt/arch/powerpc/Kconfig +++ b/kernel/cobalt/arch/powerpc/Kconfig @@ -5,29 +5,11 @@ config XENO_ARCH_MATH_EMU bool default y if MATH_EMU || MATH_EMULATION -config IPIPE_WANT_PREEMPTIBLE_SWITCH -bool - default y if XENO_ARCH_UNLOCKED_SWITCH - default n if !XENO_ARCH_UNLOCKED_SWITCH - config XENO_ARCH_FPU def_bool PPC_FPU config XENO_ARCH_SYS3264 def_bool n -menu "Machine/platform-specific options" - config XENO_ARCH_UNLOCKED_SWITCH - bool "Unlocked context switch" - depends on IPIPE_HAVE_PREEMPTIBLE_SWITCH - default y - help - - The Cobalt core may allow non-atomic execution of the - machine-dependent context switching code, so that other CPUs - and/or local interrupts may execute concurrently. - - This option reduces interrupt latency when costly cache and - TLB flushes are required to switch context. -endmenu + def_bool n ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: update register struct usage for arm64
Module: xenomai-3 Branch: next Commit: 34e9e3754c3ee7b8d88f4d7cec4f711dd9e9393a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=34e9e3754c3ee7b8d88f4d7cec4f711dd9e9393a Author: Dmitriy CherkasovDate: Thu May 7 13:58:14 2015 -0700 cobalt/arm64: update register struct usage for arm64 --- .../arch/arm64/include/asm/xenomai/syscall.h | 22 ++-- kernel/cobalt/arch/arm64/mayday.c | 20 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h index d80df77..f0a1090 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h @@ -36,21 +36,21 @@ #define __xn_reg_sys(__regs) ((__regs)->ARM_ORIG_r0) /* In OABI_COMPAT mode, handle both OABI and EABI userspace syscalls */ #ifdef CONFIG_OABI_COMPAT -#define __xn_syscall_p(__regs) (((__regs)->ARM_r7 == __NR_OABI_SYSCALL_BASE + XENO_ARM_SYSCALL) || \ -((__regs)->ARM_r7 == __ARM_NR_ipipe)) +#define __xn_syscall_p(__regs) (((__regs)->regs[7] == __NR_OABI_SYSCALL_BASE + XENO_ARM_SYSCALL) || \ +((__regs)->regs[7] == __ARM_NR_ipipe)) #else /* !CONFIG_OABI_COMPAT */ -#define __xn_syscall_p(__regs) ((__regs)->ARM_r7 == __ARM_NR_ipipe) +#define __xn_syscall_p(__regs) ((__regs)->regs[7] == __ARM_NR_ipipe) #endif /* !CONFIG_OABI_COMPAT */ #define __xn_syscall(__regs) (__xn_reg_sys(__regs) & ~__COBALT_SYSCALL_BIT) -#define __xn_reg_rval(__regs) ((__regs)->ARM_r0) -#define __xn_reg_arg1(__regs) ((__regs)->ARM_r1) -#define __xn_reg_arg2(__regs) ((__regs)->ARM_r2) -#define __xn_reg_arg3(__regs) ((__regs)->ARM_r3) -#define __xn_reg_arg4(__regs) ((__regs)->ARM_r4) -#define __xn_reg_arg5(__regs) ((__regs)->ARM_r5) -#define __xn_reg_pc(__regs)((__regs)->ARM_ip) -#define __xn_reg_sp(__regs)((__regs)->ARM_sp) +#define __xn_reg_rval(__regs) ((__regs)->regs[0]) +#define __xn_reg_arg1(__regs) ((__regs)->regs[1]) +#define __xn_reg_arg2(__regs) ((__regs)->regs[2]) +#define __xn_reg_arg3(__regs) ((__regs)->regs[3]) +#define __xn_reg_arg4(__regs) ((__regs)->regs[4]) +#define __xn_reg_arg5(__regs) ((__regs)->regs[5]) +#define __xn_reg_pc(__regs)((__regs)->ip) +#define __xn_reg_sp(__regs)((__regs)->sp) static inline void __xn_error_return(struct pt_regs *regs, int v) { diff --git a/kernel/cobalt/arch/arm64/mayday.c b/kernel/cobalt/arch/arm64/mayday.c index 20e4559..bc51ad6 100644 --- a/kernel/cobalt/arch/arm64/mayday.c +++ b/kernel/cobalt/arch/arm64/mayday.c @@ -120,27 +120,27 @@ void *xnarch_get_mayday_page(void) void xnarch_handle_mayday(struct xnarchtcb *tcb, struct pt_regs *regs, unsigned long tramp) { - tcb->mayday.pc = regs->ARM_pc; - tcb->mayday.r0 = regs->ARM_r0; + tcb->mayday.pc = regs->pc; + tcb->mayday.r0 = regs->regs[0]; #ifdef __ARM_EABI__ - tcb->mayday.r7 = regs->ARM_r7; + tcb->mayday.r7 = regs->regs[7]; #endif #ifdef CONFIG_ARM_THUMB /* The code on the mayday page must be run in ARM mode */ - tcb->mayday.psr = regs->ARM_cpsr; - regs->ARM_cpsr &= ~PSR_T_BIT; + tcb->mayday.psr = regs->cpsr; + regs->cpsr &= ~PSR_T_BIT; #endif - regs->ARM_pc = tramp; + regs->pc = tramp; } void xnarch_fixup_mayday(struct xnarchtcb *tcb, struct pt_regs *regs) { - regs->ARM_pc = tcb->mayday.pc; - regs->ARM_r0 = tcb->mayday.r0; + regs->pc = tcb->mayday.pc; + regs->regs[0] = tcb->mayday.r0; #ifdef __ARM_EABI__ - regs->ARM_r7 = tcb->mayday.r7; + regs->regs[7] = tcb->mayday.r7; #endif #ifdef CONFIG_ARM_THUMB - regs->ARM_cpsr = tcb->mayday.psr; + regs->cpsr = tcb->mayday.psr; #endif } ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: fix fpu exception names
Module: xenomai-3 Branch: next Commit: 3a5c0d27ed3ca74268d7106d99770c54983a3761 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3a5c0d27ed3ca74268d7106d99770c54983a3761 Author: Dmitriy CherkasovDate: Mon Sep 28 16:13:45 2015 -0700 cobalt/arm64: fix fpu exception names --- kernel/cobalt/arch/arm64/machine.c |4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/cobalt/arch/arm64/machine.c b/kernel/cobalt/arch/arm64/machine.c index f48d4a8..ddf65a8 100644 --- a/kernel/cobalt/arch/arm64/machine.c +++ b/kernel/cobalt/arch/arm64/machine.c @@ -99,8 +99,8 @@ static const char *const fault_labels[] = { [IPIPE_TRAP_DABT] = "Generic data abort", [IPIPE_TRAP_UNKNOWN] = "Unknown exception", [IPIPE_TRAP_BREAK] = "Instruction breakpoint", - [IPIPE_TRAP_FPU] = "Floating point exception", - [IPIPE_TRAP_VFP] = "VFP Floating point exception", + [IPIPE_TRAP_FPU_ACC] = "Floating point access", + [IPIPE_TRAP_FPU_EXC] = "Floating point exception", [IPIPE_TRAP_UNDEFINSTR] = "Undefined instruction", #ifdef IPIPE_TRAP_ALIGNMENT [IPIPE_TRAP_ALIGNMENT] = "Unaligned access exception", ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Don Mahurin : cobalt/arm64: Use empty mayday implementation for arm64.
Module: xenomai-3 Branch: next Commit: 1a614e14e99636a2a1e12511fa9a2f7a6767855f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1a614e14e99636a2a1e12511fa9a2f7a6767855f Author: Don MahurinDate: Mon Sep 14 12:52:27 2015 -0700 cobalt/arm64: Use empty mayday implementation for arm64. The arm mayday implementation was not correct for arm64. Replace with empty implementation. Handle mayday in the linux domain, using xnthread_relax. This change is essentially the same as the general change proposed in the 'Mayday issues again' discussion (Jan Kiszka, Jun 21), though only applied to arch/arm64. --- kernel/cobalt/arch/arm64/mayday.c | 86 + 1 file changed, 1 insertion(+), 85 deletions(-) diff --git a/kernel/cobalt/arch/arm64/mayday.c b/kernel/cobalt/arch/arm64/mayday.c index bc51ad6..ca1151c 100644 --- a/kernel/cobalt/arch/arm64/mayday.c +++ b/kernel/cobalt/arch/arm64/mayday.c @@ -28,72 +28,6 @@ static void *mayday; static inline void setup_mayday(void *page) { - /* -* We want this code to appear at the top of the MAYDAY page: -* -* ifdef ARM_EABI -* -* e59f000c ldr r0, [pc, #12] -* e59f700c ldr r7, [pc, #12] -* ef00 svc 0x -* e3a0 mov r0, #0 -* e580 str r0, [r0]; -* 105e .word 0x105e ; sc_cobalt_mayday | __COBALT_SYSCALL_BIT -* 000f0042 .word 0x000f0042 -* -* elif ARM_OABI -* -* e59f0008 ldr r0, [pc, #8] -* ef9f0042 swi 0x009f0042 -* e3a0 mov r0, #0 -* e580 str r0, [r0]; -* 105e .word 0x105e ; sc_cobalt_mayday | __COBALT_SYSCALL_BIT -* -* endif -* -* 32bit instruction words will be laid out by the compiler as -* the target endianness requires. -* -* We don't mess with CPSR here, so no need to save/restore it -* in handle/fixup code. -*/ -#ifdef __ARM_EABI__ - static const struct { - u32 ldr_r0; - u32 ldr_r7; - u32 swi_0; - u32 mov_r0; - u32 str_r0; - u32 cst_r0; - u32 cst_r7; - } code = { - .ldr_r0 = 0xe59f000c, - .ldr_r7 = 0xe59f700c, - .swi_0 = 0xef00, - .mov_r0 = 0xe3a0, - .str_r0 = 0xe580, - .cst_r0 = __xn_syscode(sc_cobalt_mayday), - .cst_r7 = 0x000f0042, - }; -#else /* OABI */ - static const struct { - u32 ldr_r0; - u32 swi_syscall; - u32 mov_r0; - u32 str_r0; - u32 cst_r0; - } code = { - .ldr_r0 = 0xe59f0008, - .swi_syscall = 0xef9f0042, - .mov_r0 = 0xe3a0, - .str_r0 = 0xe580, - .cst_r0 = __xn_syscode(sc_cobalt_mayday), - }; -#endif /* OABI */ - - memcpy(page, , sizeof(code)); - - flush_dcache_page(vmalloc_to_page(page)); } int xnarch_init_mayday(void) @@ -120,27 +54,9 @@ void *xnarch_get_mayday_page(void) void xnarch_handle_mayday(struct xnarchtcb *tcb, struct pt_regs *regs, unsigned long tramp) { - tcb->mayday.pc = regs->pc; - tcb->mayday.r0 = regs->regs[0]; -#ifdef __ARM_EABI__ - tcb->mayday.r7 = regs->regs[7]; -#endif -#ifdef CONFIG_ARM_THUMB - /* The code on the mayday page must be run in ARM mode */ - tcb->mayday.psr = regs->cpsr; - regs->cpsr &= ~PSR_T_BIT; -#endif - regs->pc = tramp; + xnthread_relax(0, 0); } void xnarch_fixup_mayday(struct xnarchtcb *tcb, struct pt_regs *regs) { - regs->pc = tcb->mayday.pc; - regs->regs[0] = tcb->mayday.r0; -#ifdef __ARM_EABI__ - regs->regs[7] = tcb->mayday.r7; -#endif -#ifdef CONFIG_ARM_THUMB - regs->cpsr = tcb->mayday.psr; -#endif } ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Jan Kiszka : cobalt/kernel: Trigger missing reschedule after PP deboost
Module: xenomai-3 Branch: next Commit: 3b5776c8cf27b97d6137406098ddfdee3f0e3a48 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=3b5776c8cf27b97d6137406098ddfdee3f0e3a48 Author: Jan KiszkaDate: Mon May 9 21:22:23 2016 +0200 cobalt/kernel: Trigger missing reschedule after PP deboost xnsynch_release also needs to tell the caller about the potential need for a reschedule after deboosting for prio-protection. Signed-off-by: Jan Kiszka --- kernel/cobalt/synch.c |4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kernel/cobalt/synch.c b/kernel/cobalt/synch.c index d8b83d9..f3b70a2 100644 --- a/kernel/cobalt/synch.c +++ b/kernel/cobalt/synch.c @@ -949,8 +949,10 @@ bool xnsynch_release(struct xnsynch *synch, struct xnthread *curr) else if (h != currh)/* FLCEIL set, FLCLAIM clear. */ atomic_set(lockp, XN_NO_HANDLE); - if (synch->status & XNSYNCH_PP) + if (synch->status & XNSYNCH_PP) { clear_pp_boost(synch, curr); + need_resched = true; + } xnlock_put_irqrestore(, s); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/sched: detect preemptible switch support in pipeline
Module: xenomai-3 Branch: next Commit: 98645e1b912e77afbcfc73f866451e59131abd1a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=98645e1b912e77afbcfc73f866451e59131abd1a Author: Philippe GerumDate: Sat Nov 14 18:07:15 2015 +0100 cobalt/sched: detect preemptible switch support in pipeline CONFIG_XENO_ARCH_UNLOCKED_SWITCH is merely an alias for CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH, which is only meaningful to the ARM architecture, now that PowerPC dropped such support. Use the pipeline symbol directly to make the dependency explicit. --- include/cobalt/kernel/sched.h |8 kernel/cobalt/sched.c | 16 kernel/cobalt/thread.c|2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/include/cobalt/kernel/sched.h b/include/cobalt/kernel/sched.h index fe1df7d..d5d93c2 100644 --- a/include/cobalt/kernel/sched.h +++ b/include/cobalt/kernel/sched.h @@ -93,7 +93,7 @@ struct xnsched { struct xntimer rrbtimer; /*!< Root thread control block. */ struct xnthread rootcb; -#ifdef CONFIG_XENO_ARCH_UNLOCKED_SWITCH +#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH struct xnthread *last; #endif #ifdef CONFIG_XENO_ARCH_FPU @@ -329,7 +329,7 @@ static inline int xnsched_primary_p(void) return !xnsched_unblockable_p(); } -#ifdef CONFIG_XENO_ARCH_UNLOCKED_SWITCH +#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH struct xnsched *xnsched_finish_unlocked_switch(struct xnsched *sched); @@ -341,7 +341,7 @@ int xnsched_maybe_resched_after_unlocked_switch(struct xnsched *sched) return sched->status & XNRESCHED; } -#else /* !CONFIG_XENO_ARCH_UNLOCKED_SWITCH */ +#else /* !CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH */ static inline struct xnsched * xnsched_finish_unlocked_switch(struct xnsched *sched) @@ -358,7 +358,7 @@ xnsched_maybe_resched_after_unlocked_switch(struct xnsched *sched) return 0; } -#endif /* !CONFIG_XENO_ARCH_UNLOCKED_SWITCH */ +#endif /* !CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH */ #ifdef CONFIG_XENO_OPT_WATCHDOG static inline void xnsched_reset_watchdog(struct xnsched *sched) diff --git a/kernel/cobalt/sched.c b/kernel/cobalt/sched.c index 09960ac..b0d65d3 100644 --- a/kernel/cobalt/sched.c +++ b/kernel/cobalt/sched.c @@ -293,7 +293,7 @@ struct xnthread *xnsched_pick_next(struct xnsched *sched) #endif /* CONFIG_XENO_OPT_SCHED_CLASSES */ } -#ifdef CONFIG_XENO_ARCH_UNLOCKED_SWITCH +#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH struct xnsched *xnsched_finish_unlocked_switch(struct xnsched *sched) { @@ -319,7 +319,7 @@ struct xnsched *xnsched_finish_unlocked_switch(struct xnsched *sched) return sched; } -#endif /* CONFIG_XENO_ARCH_UNLOCKED_SWITCH */ +#endif /* CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH */ void xnsched_lock(void) { @@ -494,16 +494,16 @@ void xnsched_migrate(struct xnthread *thread, struct xnsched *sched) xnsched_set_resched(thread->sched); migrate_thread(thread, sched); -#ifdef CONFIG_XENO_ARCH_UNLOCKED_SWITCH +#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH /* * Mark the thread in flight, xnsched_finish_unlocked_switch() * will put the thread on the remote runqueue. */ xnthread_set_state(thread, XNMIGRATE); -#else /* !CONFIG_XENO_ARCH_UNLOCKED_SWITCH */ +#else /* Move thread to the remote runnable queue. */ xnsched_putback(thread); -#endif /* !CONFIG_XENO_ARCH_UNLOCKED_SWITCH */ +#endif } /* @@ -709,11 +709,11 @@ struct xnthread *xnsched_rt_pick(struct xnsched *sched) static inline void switch_context(struct xnsched *sched, struct xnthread *prev, struct xnthread *next) { -#ifdef CONFIG_XENO_ARCH_UNLOCKED_SWITCH +#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH sched->last = prev; sched->status |= XNINSW; xnlock_clear_irqon(); -#endif /* !CONFIG_XENO_ARCH_UNLOCKED_SWITCH */ +#endif xnarch_switch_to(prev, next); } @@ -788,7 +788,7 @@ static inline void enter_root(struct xnthread *root) { struct xnarchtcb *rootcb __maybe_unused = xnthread_archtcb(root); -#ifdef CONFIG_XENO_ARCH_UNLOCKED_SWITCH +#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH if (rootcb->core.mm == NULL) set_ti_thread_flag(rootcb->core.tip, TIF_MMSWITCH_INT); #endif diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c index b5817c5..e0483b1 100644 --- a/kernel/cobalt/thread.c +++ b/kernel/cobalt/thread.c @@ -408,7 +408,7 @@ EXPORT_SYMBOL_GPL(xnthread_prepare_wait); static inline int moving_target(struct xnsched *sched, struct xnthread *thread) { int ret = 0; -#ifdef CONFIG_XENO_ARCH_UNLOCKED_SWITCH +#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH /* * When deleting a thread in the course of a context switch or * in flight to another CPU with nklock unlocked on a distant ___ Xenomai-git mailing list
[Xenomai-git] Philippe Gerum : cobalt/synch: add support for priority ceiling protocol
Module: xenomai-3 Branch: next Commit: eb47b60464d07604b7c9950bdbe82eafd4e8be06 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=eb47b60464d07604b7c9950bdbe82eafd4e8be06 Author: Philippe GerumDate: Tue Feb 16 10:12:55 2016 +0100 cobalt/synch: add support for priority ceiling protocol --- include/cobalt/kernel/heap.h | 11 + include/cobalt/kernel/sched-idle.h | 12 +- include/cobalt/kernel/sched-rt.h | 55 ++- include/cobalt/kernel/sched.h | 94 +++- include/cobalt/kernel/synch.h | 51 ++- include/cobalt/kernel/thread.h | 54 ++- include/cobalt/uapi/asm-generic/features.h | 27 +- include/cobalt/uapi/kernel/synch.h |8 +- include/cobalt/uapi/kernel/thread.h|3 +- include/cobalt/uapi/kernel/types.h |5 +- include/cobalt/uapi/mutex.h|1 + include/cobalt/uapi/thread.h |1 + kernel/cobalt/posix/cond.c |2 +- kernel/cobalt/posix/memory.h |6 + kernel/cobalt/posix/monitor.c | 29 +- kernel/cobalt/posix/mqueue.c |4 +- kernel/cobalt/posix/mutex.c| 103 +++-- kernel/cobalt/posix/process.c | 21 +- kernel/cobalt/posix/process.h |3 +- kernel/cobalt/posix/syscall.c |6 +- kernel/cobalt/posix/timerfd.c |2 +- kernel/cobalt/rtdm/drvlib.c|2 +- kernel/cobalt/sched-idle.c | 12 +- kernel/cobalt/sched-quota.c| 24 +- kernel/cobalt/sched-rt.c | 14 +- kernel/cobalt/sched-sporadic.c | 35 +- kernel/cobalt/sched-tp.c | 42 +- kernel/cobalt/sched-weak.c | 16 +- kernel/cobalt/sched.c | 126 +- kernel/cobalt/synch.c | 636 +++- kernel/cobalt/thread.c | 115 ++--- 31 files changed, 1038 insertions(+), 482 deletions(-) diff --git a/include/cobalt/kernel/heap.h b/include/cobalt/kernel/heap.h index a1cea69..d89f25d 100644 --- a/include/cobalt/kernel/heap.h +++ b/include/cobalt/kernel/heap.h @@ -147,6 +147,17 @@ void xnheap_free(struct xnheap *heap, void *block); int xnheap_check_block(struct xnheap *heap, void *block); +static inline void *xnheap_zalloc(struct xnheap *heap, u32 size) +{ + void *p; + + p = xnheap_alloc(heap, size); + if (p) + memset(p, 0, size); + + return p; +} + static inline char *xnstrdup(const char *s) { char *p; diff --git a/include/cobalt/kernel/sched-idle.h b/include/cobalt/kernel/sched-idle.h index 732ff84..75efdec 100644 --- a/include/cobalt/kernel/sched-idle.h +++ b/include/cobalt/kernel/sched-idle.h @@ -33,11 +33,11 @@ extern struct xnsched_class xnsched_class_idle; -static inline void __xnsched_idle_setparam(struct xnthread *thread, +static inline bool __xnsched_idle_setparam(struct xnthread *thread, const union xnsched_policy_param *p) { xnthread_clear_state(thread, XNWEAK); - thread->cprio = p->idle.prio; + return xnsched_set_effective_priority(thread, p->idle.prio); } static inline void __xnsched_idle_getparam(struct xnthread *thread, @@ -50,11 +50,17 @@ static inline void __xnsched_idle_trackprio(struct xnthread *thread, const union xnsched_policy_param *p) { if (p) - __xnsched_idle_setparam(thread, p); + /* Inheriting a priority-less class makes no sense. */ + XENO_WARN_ON_ONCE(COBALT, 1); else thread->cprio = XNSCHED_IDLE_PRIO; } +static inline void __xnsched_idle_protectprio(struct xnthread *thread, int prio) +{ + XENO_WARN_ON_ONCE(COBALT, 1); +} + static inline int xnsched_idle_init_thread(struct xnthread *thread) { return 0; diff --git a/include/cobalt/kernel/sched-rt.h b/include/cobalt/kernel/sched-rt.h index ffb7223..992a5ba 100644 --- a/include/cobalt/kernel/sched-rt.h +++ b/include/cobalt/kernel/sched-rt.h @@ -67,20 +67,33 @@ static inline void __xnsched_rt_dequeue(struct xnthread *thread) xnsched_delq(>sched->rt.runnable, thread); } -static inline void __xnsched_rt_setparam(struct xnthread *thread, -const union xnsched_policy_param *p) +static inline void __xnsched_rt_track_weakness(struct xnthread *thread) { - thread->cprio = p->rt.prio; - if (!xnthread_test_state(thread, XNBOOST)) { -#ifdef CONFIG_XENO_OPT_SCHED_WEAK + /* +* We have to track threads exiting weak scheduling, i.e. any +* thread leaving the WEAK class code if compiled in, or +* assigned a zero priority if weak threads are hosted by the +* RT class. +* +* CAUTION: since we need to
[Xenomai-git] Jan Kiszka : smokey/posix-mutex: Fix test case /wrt mutex object reuse
Module: xenomai-3 Branch: next Commit: f627aa5ca450915466f014fa7eb7ff49252af760 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f627aa5ca450915466f014fa7eb7ff49252af760 Author: Jan KiszkaDate: Thu Feb 25 11:29:00 2016 +0100 smokey/posix-mutex: Fix test case /wrt mutex object reuse Mutex objects created on the stack must be properly destroyed after use. Otherwise, succeeding tests that use the same stack layout will consider them busy and refuse to recreate the mutexes. Signed-off-by: Jan Kiszka --- testsuite/smokey/posix-mutex/posix-mutex.c | 26 +- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/testsuite/smokey/posix-mutex/posix-mutex.c b/testsuite/smokey/posix-mutex/posix-mutex.c index ae82fc1..151c2f3 100644 --- a/testsuite/smokey/posix-mutex/posix-mutex.c +++ b/testsuite/smokey/posix-mutex/posix-mutex.c @@ -623,7 +623,10 @@ static int protect_raise(void) if (!__Tassert(get_effective_prio() == THREAD_PRIO_MEDIUM)) return -EINVAL; - + + if (!__T(ret, pthread_mutex_destroy())) + return ret; + return 0; } @@ -651,7 +654,10 @@ static int protect_lower(void) if (!__Tassert(get_effective_prio() == THREAD_PRIO_MEDIUM)) return -EINVAL; - + + if (!__T(ret, pthread_mutex_destroy())) + return ret; + return 0; } @@ -699,7 +705,10 @@ static int protect_weak(void) if (!__T(ret, pthread_setschedparam(pthread_self(), old_policy, _param))) return ret; - + + if (!__T(ret, pthread_mutex_destroy())) + return ret; + return 0; } @@ -745,7 +754,11 @@ static int protect_nesting_protect(void) if (!__Tassert(get_effective_prio() == THREAD_PRIO_MEDIUM)) return -EINVAL; - + + if (!__T(ret, pthread_mutex_destroy(_high)) || + !__T(ret, pthread_mutex_destroy(_very_high))) + return ret; + return 0; } @@ -782,7 +795,10 @@ static int protect_nesting_pi(void) /* PP boost just dropped: HIGH -> MEDIUM. */ if (!__Tassert(get_effective_prio() == THREAD_PRIO_MEDIUM)) return -EINVAL; - + + if (!__T(ret, pthread_mutex_destroy(_pp))) + return ret; + return 0; } ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/thread: track thread_info unconditionally
Module: xenomai-3 Branch: next Commit: a7bc075cef9bc0511648d293f69e8b411c725a0b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=a7bc075cef9bc0511648d293f69e8b411c725a0b Author: Philippe GerumDate: Sat Nov 14 14:47:44 2015 +0100 cobalt/thread: track thread_info unconditionally We almost always want to track the thread_info structure of the host task in the core tcb, and doing so is cheap, so there is no point in building this support conditionally. --- kernel/cobalt/arch/arm/Kconfig |3 --- kernel/cobalt/arch/arm64/Kconfig |3 --- kernel/cobalt/arch/powerpc/Kconfig |4 kernel/cobalt/include/asm-generic/xenomai/thread.h |2 -- kernel/cobalt/sched.c |2 -- kernel/cobalt/thread.c |4 6 files changed, 18 deletions(-) diff --git a/kernel/cobalt/arch/arm/Kconfig b/kernel/cobalt/arch/arm/Kconfig index dc6485d..2043d70 100644 --- a/kernel/cobalt/arch/arm/Kconfig +++ b/kernel/cobalt/arch/arm/Kconfig @@ -26,9 +26,6 @@ config IPIPE_WANT_PREEMPTIBLE_SWITCH config IPIPE_WANT_ACTIVE_MM def_bool y -config XENO_ARCH_WANT_TIP - def_bool y - config XENO_ARCH_FPU def_bool VFP diff --git a/kernel/cobalt/arch/arm64/Kconfig b/kernel/cobalt/arch/arm64/Kconfig index 27b5026..572de3e 100644 --- a/kernel/cobalt/arch/arm64/Kconfig +++ b/kernel/cobalt/arch/arm64/Kconfig @@ -4,9 +4,6 @@ source "drivers/xenomai/Kconfig" config XENO_ARCH_UNLOCKED_SWITCH def_bool IPIPE_WANT_PREEMPTIBLE_SWITCH -config XENO_ARCH_WANT_TIP - def_bool y - config XENO_ARCH_FPU def_bool y diff --git a/kernel/cobalt/arch/powerpc/Kconfig b/kernel/cobalt/arch/powerpc/Kconfig index 3e950f5..4d5e6db 100644 --- a/kernel/cobalt/arch/powerpc/Kconfig +++ b/kernel/cobalt/arch/powerpc/Kconfig @@ -10,9 +10,6 @@ config IPIPE_WANT_PREEMPTIBLE_SWITCH default y if XENO_ARCH_UNLOCKED_SWITCH default n if !XENO_ARCH_UNLOCKED_SWITCH -config XENO_ARCH_WANT_TIP - bool - config XENO_ARCH_FPU def_bool PPC_FPU @@ -24,7 +21,6 @@ menu "Machine/platform-specific options" config XENO_ARCH_UNLOCKED_SWITCH bool "Unlocked context switch" depends on IPIPE_HAVE_PREEMPTIBLE_SWITCH - select XENO_ARCH_WANT_TIP default y help diff --git a/kernel/cobalt/include/asm-generic/xenomai/thread.h b/kernel/cobalt/include/asm-generic/xenomai/thread.h index 2ff19a4..cd0c6e9 100644 --- a/kernel/cobalt/include/asm-generic/xenomai/thread.h +++ b/kernel/cobalt/include/asm-generic/xenomai/thread.h @@ -33,9 +33,7 @@ struct xntcb { struct mm_struct *mm; struct mm_struct *active_mm; struct thread_struct ts; -#ifdef CONFIG_XENO_ARCH_WANT_TIP struct thread_info *tip; -#endif #ifdef CONFIG_XENO_ARCH_FPU struct task_struct *user_fpu_owner; #endif diff --git a/kernel/cobalt/sched.c b/kernel/cobalt/sched.c index cbe14bd..09960ac 100644 --- a/kernel/cobalt/sched.c +++ b/kernel/cobalt/sched.c @@ -806,9 +806,7 @@ static inline void leave_root(struct xnthread *root) rootcb->core.host_task = p; rootcb->core.tsp = >thread; rootcb->core.mm = rootcb->core.active_mm = ipipe_get_active_mm(); -#ifdef CONFIG_XENO_ARCH_WANT_TIP rootcb->core.tip = task_thread_info(p); -#endif xnarch_leave_root(root); } diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c index 6a86265..b5817c5 100644 --- a/kernel/cobalt/thread.c +++ b/kernel/cobalt/thread.c @@ -261,9 +261,7 @@ void xnthread_init_shadow_tcb(struct xnthread *thread) tcb->core.tsp = >thread; tcb->core.mm = p->mm; tcb->core.active_mm = p->mm; -#ifdef CONFIG_XENO_ARCH_WANT_TIP tcb->core.tip = task_thread_info(p); -#endif #ifdef CONFIG_XENO_ARCH_FPU tcb->core.user_fpu_owner = p; #endif /* CONFIG_XENO_ARCH_FPU */ @@ -279,9 +277,7 @@ void xnthread_init_root_tcb(struct xnthread *thread) tcb->core.host_task = p; tcb->core.tsp = >core.ts; tcb->core.mm = p->mm; -#ifdef CONFIG_XENO_ARCH_WANT_TIP tcb->core.tip = NULL; -#endif xnarch_init_root_tcb(thread); } ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/kernel: fixup for v3.19+ (user_msghdr)
Module: xenomai-3 Branch: next Commit: 924bd3741fdbfb9cc0574053978ef483ba375b69 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=924bd3741fdbfb9cc0574053978ef483ba375b69 Author: Philippe GerumDate: Mon Nov 2 20:45:10 2015 +0100 cobalt/kernel: fixup for v3.19+ (user_msghdr) --- kernel/cobalt/include/asm-generic/xenomai/wrappers.h | 13 +++-- 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h index c9e6e87..7b191e4 100644 --- a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h +++ b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h @@ -38,10 +38,17 @@ * symbol, so that obsolete wrappers can be spotted. */ + #if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) #define in_ia32_syscall() (current_thread_info()->status & TS_COMPAT) #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) +#define cobalt_get_restart_block(p)(_thread_info(p)->restart_block) +#else +#define cobalt_get_restart_block(p)(&(p)->restart_block) +#endif + #if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) #define user_msghdr msghdr #endif @@ -137,10 +144,4 @@ devm_hwmon_device_register_with_groups(struct device *dev, const char *name, #error "Xenomai/cobalt requires Linux kernel 3.10 or above" #endif /* < 3.10 */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) -#define cobalt_get_restart_block(p)(_thread_info(p)->restart_block) -#else -#define cobalt_get_restart_block(p)(&(p)->restart_block) -#endif - #endif /* _COBALT_ASM_GENERIC_WRAPPERS_H */ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: sanitize calibration file
Module: xenomai-3 Branch: next Commit: 18b6e7b40bdbebbb0fc6b41837910828763622da URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=18b6e7b40bdbebbb0fc6b41837910828763622da Author: Philippe GerumDate: Thu Sep 17 04:01:49 2015 +0200 cobalt/arm64: sanitize calibration file --- .../arch/arm64/include/asm/xenomai/calibration.h | 44 +--- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/calibration.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/calibration.h index e303a04..e85521e 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/calibration.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/calibration.h @@ -1,13 +1,10 @@ /* - * Copyright (C) 2001,2002,2003,2004,2005 Philippe Gerum . + * Copyright (C) 2015 Philippe Gerum . * - * ARM port - * Copyright (C) 2005 Stelian Pop - * - * Xenomai is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * Xenomai is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2 of the License, + * or (at your option) any later version. * * Xenomai is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -19,41 +16,22 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ -#ifndef _COBALT_ARM_ASM_CALIBRATION_H -#define _COBALT_ARM_ASM_CALIBRATION_H - -unsigned int omap_rev(void); -#define cpu_is_omap44xx() ((omap_rev() & 0xff) == 0x44) +#ifndef _COBALT_ARM64_ASM_CALIBRATION_H +#define _COBALT_ARM64_ASM_CALIBRATION_H static inline void xnarch_get_latencies(struct xnclock_gravity *p) { unsigned int ulat; #if CONFIG_XENO_OPT_TIMING_SCHEDLAT != 0 ulat = CONFIG_XENO_OPT_TIMING_SCHEDLAT; -#elif defined(CONFIG_ARCH_AT91RM9200) - ulat = 8500; -#elif defined(CONFIG_ARCH_AT91SAM9263) - ulat = 11000; -#elif defined(CONFIG_SOC_IMX6Q) - ulat = 6000; -#elif defined(CONFIG_ARCH_MX51) - ulat = 5000; -#elif defined(CONFIG_ARCH_MX53) - ulat = 5000; -#elif defined(CONFIG_ARCH_MX6) - ulat = 2000; -#elif defined(CONFIG_SOC_IMX7) - ulat = 2000; -#elif defined(CONFIG_SOC_LS1021A) - ulat = 2800; -#elif defined(CONFIG_ARCH_OMAP) - ulat = cpu_is_omap44xx() ? 2500 : 5000; +#elif defined(CONFIG_ARCH_HISI) + ulat = 4000; #else - ulat = 9500;/* XXX sane? */ + ulat = 4000; #endif p->user = xnclock_ns_to_ticks(, ulat); p->kernel = xnclock_ns_to_ticks(, CONFIG_XENO_OPT_TIMING_KSCHEDLAT); p->irq = xnclock_ns_to_ticks(, CONFIG_XENO_OPT_TIMING_IRQLAT); } -#endif /* !_COBALT_ARM_ASM_CALIBRATION_H */ +#endif /* !_COBALT_ARM64_ASM_CALIBRATION_H */ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: machine.h: use slightly faster ffnz implementation
Module: xenomai-3 Branch: next Commit: 0f344322f9d8aef3fccd620c0dc160eda00de6c2 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0f344322f9d8aef3fccd620c0dc160eda00de6c2 Author: Dmitriy CherkasovDate: Wed Jun 17 16:09:20 2015 -0700 cobalt/arm64: machine.h: use slightly faster ffnz implementation --- kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h | 12 +++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h index 417a7b0..b8290bf 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h @@ -37,13 +37,23 @@ #include #include #include +#include /* D-side always behaves as PIPT on AArch64 (see arch/arm64/include/asm/cachetype.h) */ #define xnarch_cache_aliasing() 0 static inline __attribute_const__ unsigned long ffnz(unsigned long ul) { - return __builtin_ffsl(ul) - 1; + int __r; + + /* zero input is not valid */ + XENO_WARN_ON(COBALT, ul == 0); + + __asm__ ("rbit\t%0, %1\n" +"clz\t%0, %0\n" + : "=r" (__r) : "r"(ul) : "cc"); + + return __r; } #include ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: features.h: disable XNARCH_HAVE_LLMULSHFT, XNARCH_HAVE_NODIV_LLIMD for armv8/aarch64, as arm64 does not have these
Module: xenomai-3 Branch: next Commit: 175665544754ed1253c62b6151542559f9ad0f36 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=175665544754ed1253c62b6151542559f9ad0f36 Author: Dmitriy CherkasovDate: Thu May 7 16:40:07 2015 -0700 cobalt/arm64: features.h: disable XNARCH_HAVE_LLMULSHFT, XNARCH_HAVE_NODIV_LLIMD for armv8/aarch64, as arm64 does not have these --- kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/features.h |2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/features.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/features.h index 2dd1ada..cf7bbf4 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/features.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/features.h @@ -28,8 +28,10 @@ #define XENOMAI_FEAT_MAN (__xn_feat_generic_man_mask) +#ifndef __aarch64__ #define XNARCH_HAVE_LLMULSHFT1 #define XNARCH_HAVE_NODIV_LLIMD 1 +#endif struct cobalt_featinfo_archdep { /* no arch-specific feature */ }; ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : boilerplate/libc: provide placeholders for prioceiling ops
Module: xenomai-3 Branch: next Commit: 708dfaad8a3c0a67a28bb5e7157677c1208507c8 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=708dfaad8a3c0a67a28bb5e7157677c1208507c8 Author: Philippe GerumDate: Sun Mar 20 17:20:58 2016 +0100 boilerplate/libc: provide placeholders for prioceiling ops --- configure.ac |2 ++ include/boilerplate/libc.h | 19 +++ 2 files changed, 21 insertions(+) diff --git a/configure.ac b/configure.ac index c9d0fcf..dd3a1ec 100644 --- a/configure.ac +++ b/configure.ac @@ -514,6 +514,8 @@ AC_CHECK_FUNCS([pthread_mutexattr_setprotocol \ pthread_mutexattr_getprioceiling \ pthread_mutexattr_setprioceiling \ pthread_mutexattr_setrobust_np \ + pthread_mutex_getprioceiling\ + pthread_mutex_setprioceiling\ pthread_condattr_getclock \ pthread_condattr_setclock \ pthread_spin_lock fork \ diff --git a/include/boilerplate/libc.h b/include/boilerplate/libc.h index 80ababf..1b26c84 100644 --- a/include/boilerplate/libc.h +++ b/include/boilerplate/libc.h @@ -127,6 +127,25 @@ int pthread_mutexattr_getprioceiling(const pthread_mutexattr_t * } #endif /* !HAVE_PTHREAD_MUTEXATTR_GETPRIOCEILING */ +#ifndef HAVE_PTHREAD_MUTEX_SETPRIOCEILING +static inline +int pthread_mutex_setprioceiling(pthread_mutex_t *__restrict attr, +int prioceiling, +int *__restrict old_ceiling) +{ + return ENOSYS; +} +#endif /* !HAVE_PTHREAD_MUTEXATTR_SETPRIOCEILING */ + +#ifndef HAVE_PTHREAD_MUTEX_GETPRIOCEILING +static inline +int pthread_mutex_getprioceiling(pthread_mutex_t *__restrict attr, +int *__restrict prioceiling) +{ + return ENOSYS; +} +#endif /* !HAVE_PTHREAD_MUTEXATTR_GETPRIOCEILING */ + #ifndef HAVE_PTHREAD_ATTR_SETAFFINITY_NP #include static inline ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: fix inclusion guards
Module: xenomai-3 Branch: next Commit: 0a11e6031256bc2d532e7959396fb2cb35e8a334 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0a11e6031256bc2d532e7959396fb2cb35e8a334 Author: Philippe GerumDate: Sat Oct 17 14:40:53 2015 +0200 cobalt/arm64: fix inclusion guards --- kernel/cobalt/arch/arm64/include/asm/xenomai/features.h |8 kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h|6 +++--- kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h |6 +++--- kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h |6 +++--- kernel/cobalt/arch/arm64/include/asm/xenomai/syscall32.h |6 +++--- kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h|7 +++ kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/arith.h|6 +++--- kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/features.h |6 +++--- kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h |6 +++--- kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/syscall.h |6 +++--- kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/tsc.h |6 +++--- kernel/cobalt/arch/arm64/include/asm/xenomai/wrappers.h |6 +++--- 12 files changed, 37 insertions(+), 38 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/features.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/features.h index d485286..112408f 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/features.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/features.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005 Philippe Gerum . + * Copyright (C) 2015 Philippe Gerum . * * ARM port * Copyright (C) 2005 Stelian Pop @@ -19,12 +19,12 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ -#ifndef _COBALT_ARM_ASM_FEATURES_H -#define _COBALT_ARM_ASM_FEATURES_H +#ifndef _COBALT_ARM64_ASM_FEATURES_H +#define _COBALT_ARM64_ASM_FEATURES_H struct cobalt_featinfo; static inline void collect_arch_features(struct cobalt_featinfo *p) { } #include -#endif /* !_COBALT_ARM_ASM_FEATURES_H */ +#endif /* !_COBALT_ARM64_ASM_FEATURES_H */ diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h index 743d758..cfdf0b3 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h @@ -16,8 +16,8 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ -#ifndef _COBALT_ARM_ASM_FPTEST_H -#define _COBALT_ARM_ASM_FPTEST_H +#ifndef _COBALT_ARM64_ASM_FPTEST_H +#define _COBALT_ARM64_ASM_FPTEST_H #include #include @@ -44,4 +44,4 @@ static inline int fp_detect(void) return have_fp ? __COBALT_HAVE_FPU : 0; } -#endif /* _COBALT_ARM_ASM_FPTEST_H */ +#endif /* _COBALT_ARM64_ASM_FPTEST_H */ diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h index b8290bf..7444cc8 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h @@ -20,8 +20,8 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ -#ifndef _COBALT_ARM_ASM_MACHINE_H -#define _COBALT_ARM_ASM_MACHINE_H +#ifndef _COBALT_ARM64_ASM_MACHINE_H +#define _COBALT_ARM64_ASM_MACHINE_H #include #include @@ -58,4 +58,4 @@ static inline __attribute_const__ unsigned long ffnz(unsigned long ul) #include -#endif /* !_COBALT_ARM_ASM_MACHINE_H */ +#endif /* !_COBALT_ARM64_ASM_MACHINE_H */ diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h index 77c1716..949f287 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h @@ -19,8 +19,8 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ -#ifndef _COBALT_ARM_ASM_SYSCALL_H -#define _COBALT_ARM_ASM_SYSCALL_H +#ifndef _COBALT_ARM64_ASM_SYSCALL_H +#define _COBALT_ARM64_ASM_SYSCALL_H #include #include @@ -75,4 +75,4 @@ int xnarch_local_syscall(unsigned long a1, unsigned long a2, unsigned long a3, unsigned long a4, unsigned long a5); -#endif /* !_COBALT_ARM_ASM_SYSCALL_H */ +#endif /* !_COBALT_ARM64_ASM_SYSCALL_H */ diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall32.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall32.h index 95c5a11..a66ddd6 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall32.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall32.h @@ -16,9 +16,9 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ -#ifndef _COBALT_ARM_ASM_SYSCALL32_H -#define _COBALT_ARM_ASM_SYSCALL32_H +#ifndef
[Xenomai-git] Philippe Gerum : doc: prebuild
Module: xenomai-3 Branch: next Commit: ded4ede2d16dcac6975bedab5b9cda59b96739fa URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ded4ede2d16dcac6975bedab5b9cda59b96739fa Author: Philippe GerumDate: Sun May 21 18:03:47 2017 +0200 doc: prebuild --- doc/prebuilt/html/MIGRATION/index.html |6 ++-- doc/prebuilt/html/README.APPLICATIONS/index.html |2 +- doc/prebuilt/html/README.INSTALL/index.html|2 +- .../html/TROUBLESHOOTING.COBALT/index.html |2 +- .../html/TROUBLESHOOTING.MERCURY/index.html|2 +- doc/prebuilt/html/man1/xeno-config/index.html |2 +- .../html/xeno3prm/16550A__io_8h_source.html|2 +- .../html/xeno3prm/16550A__pci_8h_source.html |4 +-- .../html/xeno3prm/16550A__pnp_8h_source.html |2 +- doc/prebuilt/html/xeno3prm/8255_8h_source.html |2 +- doc/prebuilt/html/xeno3prm/af__inet_8h_source.html |2 +- .../html/xeno3prm/alchemy_2compat_8h_source.html |2 +- doc/prebuilt/html/xeno3prm/analogy_2driver_8h.html |2 +- .../html/xeno3prm/analogy_2driver_8h_source.html |2 +- doc/prebuilt/html/xeno3prm/analogy_8h.html |2 +- doc/prebuilt/html/xeno3prm/analogy_8h_source.html |2 +- doc/prebuilt/html/xeno3prm/annotated.html |2 +- doc/prebuilt/html/xeno3prm/apc_8h_source.html |2 +- doc/prebuilt/html/xeno3prm/api-tags.html |2 +- ..._2include_2asm_2xenomai_2machine_8h_source.html |2 +- ...include_2asm_2xenomai_2syscall32_8h_source.html |2 +- ..._2include_2asm_2xenomai_2machine_8h_source.html |2 +- ...include_2asm_2xenomai_2syscall32_8h_source.html |2 +- ..._2include_2asm_2xenomai_2machine_8h_source.html |2 +- ...include_2asm_2xenomai_2syscall32_8h_source.html |2 +- ..._2include_2asm_2xenomai_2machine_8h_source.html |2 +- ...include_2asm_2xenomai_2syscall32_8h_source.html |4 +-- ...m_2include_2asm_2xenomai_2fptest_8h_source.html |2 +- ...lude_2asm_2xenomai_2uapi_2fptest_8h_source.html |2 +- doc/prebuilt/html/xeno3prm/arp_8h_source.html |2 +- doc/prebuilt/html/xeno3prm/assert_8h_source.html |2 +- doc/prebuilt/html/xeno3prm/async_8c.html |2 +- doc/prebuilt/html/xeno3prm/atomic_8h_source.html |2 +- ...n_2include_2asm_2xenomai_2fptest_8h_source.html |2 +- ...lude_2asm_2xenomai_2uapi_2fptest_8h_source.html |2 +- .../boilerplate_2ancillaries_8h_source.html|2 +- .../html/xeno3prm/boilerplate_2list_8h_source.html |2 +- .../html/xeno3prm/boilerplate_2lock_8h_source.html |2 +- .../html/xeno3prm/boilerplate_2time_8h_source.html |2 +- .../xeno3prm/boilerplate_2tunables_8h_source.html |2 +- doc/prebuilt/html/xeno3prm/bufd_8h_source.html |2 +- .../html/xeno3prm/bufp-label_8c-example.html |2 +- .../html/xeno3prm/bufp-readwrite_8c-example.html |2 +- doc/prebuilt/html/xeno3prm/c1e_8h_source.html |2 +- doc/prebuilt/html/xeno3prm/calibration_8c.html |2 +- doc/prebuilt/html/xeno3prm/can-rtt_8c-example.html |2 +- doc/prebuilt/html/xeno3prm/channel__range_8h.html |2 +- .../html/xeno3prm/channel__range_8h_source.html|2 +- doc/prebuilt/html/xeno3prm/classes.html|2 +- doc/prebuilt/html/xeno3prm/clockobj_8h_source.html |2 +- doc/prebuilt/html/xeno3prm/cluster_8h_source.html |2 +- .../html/xeno3prm/cobalt-core_8h_source.html |4 +-- .../html/xeno3prm/cobalt-posix_8h_source.html |4 +-- .../html/xeno3prm/cobalt-rtdm_8h_source.html |4 +-- .../cobalt_2boilerplate_2limits_8h_source.html |2 +- .../cobalt_2boilerplate_2trace_8h_source.html |2 +- .../cobalt_2kernel_2ancillaries_8h_source.html |2 +- .../xeno3prm/cobalt_2kernel_2compat_8h_source.html |2 +- .../xeno3prm/cobalt_2kernel_2init_8h_source.html |2 +- .../xeno3prm/cobalt_2kernel_2list_8h_source.html |2 +- .../xeno3prm/cobalt_2kernel_2lock_8h_source.html |2 +- .../cobalt_2kernel_2registry_8h_source.html|2 +- .../cobalt_2kernel_2rtdm_2autotune_8h_source.html |2 +- .../cobalt_2kernel_2rtdm_2can_8h_source.html |2 +- .../cobalt_2kernel_2rtdm_2compat_8h_source.html|2 +- .../cobalt_2kernel_2rtdm_2ipc_8h_source.html |2 +- .../cobalt_2kernel_2rtdm_2rtdm_8h_source.html |2 +- .../cobalt_2kernel_2rtdm_2serial_8h_source.html|2 +- .../cobalt_2kernel_2rtdm_2testing_8h_source.html |2 +- .../xeno3prm/cobalt_2kernel_2rtdm_2udd_8h.html |2 +- .../cobalt_2kernel_2rtdm_2udd_8h_source.html |2 +- .../xeno3prm/cobalt_2kernel_2trace_8h_source.html |2 +- .../html/xeno3prm/cobalt_2pthread_8h_source.html | 10 +++--- .../html/xeno3prm/cobalt_2sys_2time_8h_source.html |2 +- .../html/xeno3prm/cobalt_2time_8h_source.html |2 +- .../html/xeno3prm/cobalt_2trace_8h_source.html |
[Xenomai-git] Philippe Gerum : lib/cobalt: use lazy schedparam propagation
Module: xenomai-3 Branch: next Commit: 25156eae5a5f4672a451ff34205d69d482e6d7b8 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=25156eae5a5f4672a451ff34205d69d482e6d7b8 Author: Philippe GerumDate: Fri Mar 18 12:12:27 2016 +0100 lib/cobalt: use lazy schedparam propagation Do not switch to secondary mode upon schedparam updates for propagating changes to the regular kernel, if the caller runs in primary mode when entering pthread_setschedparam*() or sched_setscheduler(). In such a case, the update request to the regular kernel is left pending until the target thread resumes execution in relaxed mode, at which point it is committed. CAUTION: This mechanism won't update the schedparams cached by the glibc for the caller in user-space, but this is the deal: we don't relax threads which issue pthread_setschedparam[_ex]() from primary mode anymore, but then only the kernel side (Cobalt and the host kernel) will be aware of the change, and glibc might cache obsolete information. If the caller already runs in relaxed mode on entry to these services, the update request takes place immediately, via the regular (g)libc calls. In any case, the new scheduling parameters for the target thread are immediately applied by Cobalt, regardless of the update path followed for the regular kernel. --- lib/cobalt/internal.c | 43 ++ lib/cobalt/sched.c | 13 lib/cobalt/sigshadow.c |8 + lib/cobalt/thread.c| 80 +--- 4 files changed, 86 insertions(+), 58 deletions(-) diff --git a/lib/cobalt/internal.c b/lib/cobalt/internal.c index 49744c4..ebc3624 100644 --- a/lib/cobalt/internal.c +++ b/lib/cobalt/internal.c @@ -516,6 +516,49 @@ int cobalt_sched_weighted_prio(int policy, return XENOMAI_SYSCALL2(sc_cobalt_sched_weightprio, policy, param_ex); } +int cobalt_xlate_schedparam(int policy, + const struct sched_param_ex *param_ex, + struct sched_param *param) +{ + int std_policy, priority; + + /* +* Translates Cobalt scheduling parameters to native ones, +* based on a best approximation for Cobalt policies which are +* not available from the host kernel. +*/ + std_policy = policy; + priority = param_ex->sched_priority; + + switch (policy) { + case SCHED_WEAK: + std_policy = priority ? SCHED_FIFO : SCHED_OTHER; + break; + default: + std_policy = SCHED_FIFO; + /* falldown wanted. */ + case SCHED_OTHER: + case SCHED_FIFO: + case SCHED_RR: + /* +* The Cobalt priority range is larger than those of +* the native SCHED_FIFO/RR classes, so we have to cap +* the priority value accordingly. We also remap +* "weak" (negative) priorities - which are only +* meaningful for the Cobalt core - to regular values. +*/ + if (priority > __cobalt_std_fifo_maxpri) + priority = __cobalt_std_fifo_maxpri; + } + + if (priority < 0) + priority = -priority; + + memset(param, 0, sizeof(*param)); + param->sched_priority = priority; + + return std_policy; +} /* * Temporary compatibility aliases which should be phased out at next diff --git a/lib/cobalt/sched.c b/lib/cobalt/sched.c index b0292b5..87b9235 100644 --- a/lib/cobalt/sched.c +++ b/lib/cobalt/sched.c @@ -26,7 +26,6 @@ #include #include #include -#include "current.h" #include "internal.h" /** @@ -297,11 +296,13 @@ int sched_setscheduler_ex(pid_t pid, return EINVAL; /* See pthread_setschedparam_ex(). */ - - std_policy = cobalt_xlate_schedparam(policy, param_ex, _param); - ret = __STD(sched_setscheduler(pid, std_policy, _param)); - if (ret) - return errno; + + if (cobalt_is_relaxed()) { + std_policy = cobalt_xlate_schedparam(policy, param_ex, _param); + ret = __STD(sched_setscheduler(pid, std_policy, _param)); + if (ret) + return errno; + } ret = -XENOMAI_SYSCALL5(sc_cobalt_sched_setscheduler_ex, pid, policy, param_ex, diff --git a/lib/cobalt/sigshadow.c b/lib/cobalt/sigshadow.c index f58e341..fc8adf6 100644 --- a/lib/cobalt/sigshadow.c +++ b/lib/cobalt/sigshadow.c @@ -57,6 +57,14 @@ int cobalt_sigshadow_handler(int sig, siginfo_t *si, void *ctxt) skip = nr > 3 ? 3 : 0; XENOMAI_SYSCALL3(sc_cobalt_backtrace, nr - skip, frames + skip, arg); break; + case SIGSHADOW_ACTION_HOME: + /* +* We have been asked to call home from the current +* context: sending a query for retrieving
[Xenomai-git] Jan Kiszka : lib/cobalt: Wrap pthread_setschedprio for proper real-time support
Module: xenomai-3 Branch: next Commit: d5ed53092d201dd055a65ba3c1b8cb5a4c21 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d5ed53092d201dd055a65ba3c1b8cb5a4c21 Author: Jan KiszkaDate: Tue Mar 8 14:46:59 2016 +0100 lib/cobalt: Wrap pthread_setschedprio for proper real-time support Implement pthread_setschedprio on top of pthread_setschedparam_ex with the help of the new __SCHED_CURRENT policy. This ensures that prio changes are directly applied to the real-time core, and that with just a single syscall. Signed-off-by: Jan Kiszka --- include/cobalt/pthread.h |2 ++ lib/cobalt/cobalt.wrappers |1 + lib/cobalt/thread.c|9 + lib/cobalt/wrappers.c |6 ++ 4 files changed, 18 insertions(+) diff --git a/include/cobalt/pthread.h b/include/cobalt/pthread.h index f1b1c8a..3e9bd47 100644 --- a/include/cobalt/pthread.h +++ b/include/cobalt/pthread.h @@ -53,6 +53,8 @@ COBALT_DECL(int, pthread_setschedparam(pthread_t thread, int policy, const struct sched_param *param)); +COBALT_DECL(int, pthread_setschedprio(pthread_t thread, int prio)); + COBALT_DECL(int, pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)); diff --git a/lib/cobalt/cobalt.wrappers b/lib/cobalt/cobalt.wrappers index 4f883f3..f8bda39 100644 --- a/lib/cobalt/cobalt.wrappers +++ b/lib/cobalt/cobalt.wrappers @@ -2,6 +2,7 @@ --wrap pthread_create --wrap pthread_setschedparam --wrap pthread_getschedparam +--wrap pthread_setschedprio --wrap pthread_yield --wrap sched_yield --wrap sched_get_priority_min diff --git a/lib/cobalt/thread.c b/lib/cobalt/thread.c index 908516f..62ca0a0 100644 --- a/lib/cobalt/thread.c +++ b/lib/cobalt/thread.c @@ -650,6 +650,15 @@ int pthread_setschedparam_ex(pthread_t thread, return ret; } +COBALT_IMPL(int, pthread_setschedprio, (pthread_t thread, int prio)) +{ + struct sched_param_ex param_ex = { + .sched_priority = prio, + }; + + return pthread_setschedparam_ex(thread, __SCHED_CURRENT, _ex); +} + /** * Get the scheduling policy and parameters of the specified thread. * diff --git a/lib/cobalt/wrappers.c b/lib/cobalt/wrappers.c index 8bd9190..8dd28fb 100644 --- a/lib/cobalt/wrappers.c +++ b/lib/cobalt/wrappers.c @@ -60,6 +60,12 @@ int __real_pthread_getschedparam(pthread_t thread, } __weak +int __real_pthread_setschedprio(pthread_t thread, int prio) +{ + return pthread_setschedprio(thread, prio); +} + +__weak int __real_sched_yield(void) { return sched_yield(); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: remove code for unrelated arm architecture
Module: xenomai-3 Branch: next Commit: 28280f48590a2ea59058e902a54b14475adf147f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=28280f48590a2ea59058e902a54b14475adf147f Author: Dmitriy CherkasovDate: Thu May 7 13:56:22 2015 -0700 cobalt/arm64: remove code for unrelated arm architecture --- .../arch/arm64/include/asm/xenomai/machine.h | 33 .../arch/arm64/include/asm/xenomai/uapi/arith.h|4 +-- 2 files changed, 2 insertions(+), 35 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h index d6e965f..cf07a3f 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h @@ -32,53 +32,20 @@ #include #include #include -#include #include #include #include #include -#include #include #define xnarch_cache_aliasing() cache_is_vivt() -#if __LINUX_ARM_ARCH__ < 5 -static inline __attribute_const__ unsigned long ffnz(unsigned long x) -{ - int r = 0; - - if (!x) - return 0; - if (!(x & 0x)) { - x >>= 16; - r += 16; - } - if (!(x & 0xff)) { - x >>= 8; - r += 8; - } - if (!(x & 0xf)) { - x >>= 4; - r += 4; - } - if (!(x & 3)) { - x >>= 2; - r += 2; - } - if (!(x & 1)) { - x >>= 1; - r += 1; - } - return r; -} -#else static inline __attribute_const__ unsigned long ffnz(unsigned long ul) { int __r; __asm__("clz\t%0, %1" : "=r" (__r) : "r"(ul & (-ul)) : "cc"); return 31 - __r; } -#endif #include diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/arith.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/arith.h index cf897b4..165cd9d 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/arith.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/arith.h @@ -20,7 +20,7 @@ #include -#if __LINUX_ARM_ARCH__ >= 4 && (!defined(CONFIG_THUMB2_KERNEL) || !defined(CONFIG_FTRACE)) +#if !defined(CONFIG_FTRACE) static inline __attribute__((__const__)) unsigned long long mach_arm_nodiv_ullimd(const unsigned long long op, const unsigned long long frac, @@ -49,7 +49,7 @@ mach_arm_nodiv_llimd(const long long op, #include -#if __LINUX_ARM_ARCH__ >= 4 && (!defined(CONFIG_THUMB2_KERNEL) || !defined(CONFIG_FTRACE)) +#if !defined(CONFIG_FTRACE) #define mach_arm_nodiv_ullimd_str \ "umull %[tl], %[rl], %[opl], %[fracl]\n\t" \ "umull %[rm], %[rh], %[oph], %[frach]\n\t" \ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/wrappers: add wrapper for reinit_completion()
Module: xenomai-3 Branch: next Commit: ebd5bc408c7c5c25aa91fdbdb375d4da0d434e6c URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=ebd5bc408c7c5c25aa91fdbdb375d4da0d434e6c Author: Philippe GerumDate: Thu Mar 3 09:16:21 2016 +0100 cobalt/wrappers: add wrapper for reinit_completion() --- kernel/cobalt/include/asm-generic/xenomai/wrappers.h |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h index 05be40d..7b191e4 100644 --- a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h +++ b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h @@ -55,7 +55,6 @@ #if LINUX_VERSION_CODE < KERNEL_VERSION(3,17,0) #include -#include #undef alloc_netdev #define alloc_netdev(sizeof_priv, name, name_assign_type, setup) \ @@ -68,6 +67,7 @@ trace_seq_buffer_ptr(struct trace_seq *s) { return s->buffer + s->len; } + #endif /* < 3.17 */ #if LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0) ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Don Mahurin : lib/cobalt/arm64: disable kuser tsc get setting for armv8/ aarch64
Module: xenomai-3 Branch: next Commit: bf35af478607b08a597664fca2791a366af9f107 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=bf35af478607b08a597664fca2791a366af9f107 Author: Don MahurinDate: Fri May 8 10:37:36 2015 -0700 lib/cobalt/arm64: disable kuser tsc get setting for armv8/aarch64 --- lib/cobalt/arch/arm64/features.c |4 1 file changed, 4 insertions(+) diff --git a/lib/cobalt/arch/arm64/features.c b/lib/cobalt/arch/arm64/features.c index edabcf2..7c7e76a 100644 --- a/lib/cobalt/arch/arm64/features.c +++ b/lib/cobalt/arch/arm64/features.c @@ -59,9 +59,13 @@ void cobalt_check_features(struct cobalt_featinfo *finfo) page_size = sysconf(_SC_PAGESIZE); +#ifndef __aarch64__ __xn_tscinfo.kuser_tsc_get = (__xn_rdtsc_t *)(0x1004 - ((*(unsigned *)(0x0ffc) + 3) << 5)); +#else + __xn_tscinfo.kuser_tsc_get = 0; +#endif phys_addr = (unsigned long)__xn_tscinfo.kinfo.counter; ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: add basic FPU support
Module: xenomai-3 Branch: next Commit: bd02767bd512231f639698cf7ba2c3b4f2f5821f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=bd02767bd512231f639698cf7ba2c3b4f2f5821f Author: Dmitriy CherkasovDate: Fri Sep 11 17:58:54 2015 -0700 cobalt/arm64: add basic FPU support --- kernel/cobalt/arch/arm64/Kconfig |2 +- .../cobalt/arch/arm64/include/asm/xenomai/fptest.h | 11 +- .../cobalt/arch/arm64/include/asm/xenomai/thread.h | 17 +- .../arch/arm64/include/asm/xenomai/uapi/fptest.h | 83 +++-- kernel/cobalt/arch/arm64/thread.c | 329 +--- lib/cobalt/arch/arm64/features.c |4 +- 6 files changed, 153 insertions(+), 293 deletions(-) diff --git a/kernel/cobalt/arch/arm64/Kconfig b/kernel/cobalt/arch/arm64/Kconfig index dd5a8c6..27b5026 100644 --- a/kernel/cobalt/arch/arm64/Kconfig +++ b/kernel/cobalt/arch/arm64/Kconfig @@ -8,7 +8,7 @@ config XENO_ARCH_WANT_TIP def_bool y config XENO_ARCH_FPU - def_bool VFP + def_bool y config XENO_ARCH_SYS3264 def_bool n diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h index a76f1e6..743d758 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/fptest.h @@ -20,15 +20,10 @@ #define _COBALT_ARM_ASM_FPTEST_H #include +#include #include -#ifdef CONFIG_VFP -#define have_vfp (elf_hwcap & HWCAP_VFP) -#else /* !CONFIG_VFP */ -#define have_vfp 0 -#endif /* !CONFIG_VFP */ - -#include +#define have_fp (elf_hwcap & HWCAP_FP) static inline int fp_kernel_supported(void) { @@ -46,7 +41,7 @@ static inline void fp_linux_end(void) static inline int fp_detect(void) { - return have_vfp ? __COBALT_HAVE_VFP : 0; + return have_fp ? __COBALT_HAVE_FPU : 0; } #endif /* _COBALT_ARM_ASM_FPTEST_H */ diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h index a8d7ed4..bfcceb4 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h @@ -21,21 +21,12 @@ #include -#ifdef CONFIG_XENO_ARCH_FPU -#ifdef CONFIG_VFP -#include -#endif /* CONFIG_VFP */ -#endif /* !CONFIG_XENO_ARCH_FPU */ struct xnarchtcb { struct xntcb core; #ifdef CONFIG_XENO_ARCH_FPU -#ifdef CONFIG_VFP - union vfp_state *fpup; + struct fpsimd_state *fpup; #define xnarch_fpu_ptr(tcb) ((tcb)->fpup) -#else -#define xnarch_fpu_ptr(tcb) NULL -#endif #endif struct { unsigned long pc; @@ -67,7 +58,7 @@ static inline void xnarch_enter_root(struct xnthread *root) { } int xnarch_escalate(void); -#if defined(CONFIG_XENO_ARCH_FPU) && defined(CONFIG_VFP) +#if defined(CONFIG_XENO_ARCH_FPU) static inline void xnarch_init_root_tcb(struct xnthread *thread) { @@ -88,7 +79,7 @@ void xnarch_switch_fpu(struct xnthread *from, struct xnthread *thread); int xnarch_handle_fpu_fault(struct xnthread *from, struct xnthread *to, struct ipipe_trap_data *d); -#else /* !CONFIG_XENO_ARCH_FPU || !CONFIG_VFP */ +#else /* !CONFIG_XENO_ARCH_FPU */ static inline void xnarch_init_root_tcb(struct xnthread *thread) { } static inline void xnarch_init_shadow_tcb(struct xnthread *thread) { } @@ -114,7 +105,7 @@ static inline int xnarch_handle_fpu_fault(struct xnthread *from, { return 0; } -#endif /* !CONFIG_XENO_ARCH_FPU || !CONFIG_VFP */ +#endif /* !CONFIG_XENO_ARCH_FPU */ static inline void xnarch_enable_kfpu(void) { } diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h index 65a3e31..25bc976 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h @@ -18,53 +18,86 @@ #ifndef _COBALT_ARM_ASM_UAPI_FPTEST_H #define _COBALT_ARM_ASM_UAPI_FPTEST_H -#ifdef __aarch64__ -/* CP10 and CP11, used for the FP/NEON operations, are already excluded from -the list of valid operands for the generic coprocessor instructions */ -#define __COBALT_HAVE_VFP 0 -#else -#define __COBALT_HAVE_VFP 0x1 -#endif +#define __COBALT_HAVE_FPU 0x1 static inline void fp_regs_set(int features, unsigned int val) { -#if __COBALT_HAVE_VFP != 0 - unsigned long long e[16]; + + unsigned long long e[32]; unsigned int i; - if (features & __COBALT_HAVE_VFP) { - for (i = 0; i < 16; i++) + if (features & __COBALT_HAVE_FPU) { + + for (i = 0; i < 32; i++) e[i] = val; - /* vldm %0!, {d0-d15}, - AKA fldmiax %0!, {d0-d15} */ - __asm__ __volatile__("ldc p11, cr0, [%0],#32*4": -"=r"(i): "0"([0]): "memory"); +
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: thread: use kernel switch_to
Module: xenomai-3 Branch: next Commit: d2c58ed8cfa734f0e0e8df83d50c26b92137a67a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=d2c58ed8cfa734f0e0e8df83d50c26b92137a67a Author: Dmitriy CherkasovDate: Fri May 15 23:26:18 2015 -0700 cobalt/arm64: thread: use kernel switch_to --- kernel/cobalt/arch/arm64/Makefile |2 +- kernel/cobalt/arch/arm64/switch.S | 167 - kernel/cobalt/arch/arm64/thread.c |5 +- 3 files changed, 2 insertions(+), 172 deletions(-) diff --git a/kernel/cobalt/arch/arm64/Makefile b/kernel/cobalt/arch/arm64/Makefile index a135f99..af0a0e8 100644 --- a/kernel/cobalt/arch/arm64/Makefile +++ b/kernel/cobalt/arch/arm64/Makefile @@ -1,5 +1,5 @@ obj-$(CONFIG_XENOMAI) += xenomai.o -xenomai-y := machine.o mayday.o thread.o switch.o syscall.o +xenomai-y := machine.o mayday.o thread.o syscall.o ccflags-y := -Iarch/arm64/xenomai/include -Iinclude/xenomai diff --git a/kernel/cobalt/arch/arm64/switch.S b/kernel/cobalt/arch/arm64/switch.S deleted file mode 100644 index 505fd5a..000 --- a/kernel/cobalt/arch/arm64/switch.S +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (C) 2005 Stelian Pop. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139, - * USA; either version 2 of the License, or (at your option) any later - * version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include -#include -#include -#include -#include -#ifdef CONFIG_VFP -#include -#endif - - .macro fpu_switch tmp -#ifdef CONFIG_VFP -#if __LINUX_ARM_ARCH__ <= 6 -#ifdef CONFIG_JUMP_LABEL -9998: nop - .pushsection __jump_table, "aw" - .word 9998b, f, __xeno_vfp_key - .popsection -#else - ldr \tmp, =elf_hwcap - ldr \tmp, [\tmp] - tst \tmp, #HWCAP_VFP - beq f -#endif -#endif - @ Always disable VFP so we can lazily save/restore the old - @ state. This occurs in the context of the previous thread. - VFPFMRX \tmp, FPEXC - bic \tmp, \tmp, #FPEXC_EN - VFPFMXR FPEXC, \tmp -#if __LINUX_ARM_ARCH__ <= 6 -: -#endif -#endif - .endm - - .text - -#if defined(CONFIG_VFP) && defined(CONFIG_XENO_ARCH_FPU) -/* Copied from vfp_save_state in arch/arm/vfp/vfphw.S - * r0 = pointer to union vfp_state, r1 = fpexc - */ -ENTRY(__asm_vfp_save) - VFPFSTMIA r0, r2 @ save the working registers - VFPFMRX r2, FPSCR @ current status - tst r1, #FPEXC_EX @ is there additional state to save? - beq 1f - VFPFMRX r3, FPINST @ FPINST (only if FPEXC.EX is set) - tst r1, #FPEXC_FP2V @ is there an FPINST2 to read? - beq 1f - VFPFMRX r12, FPINST2@ FPINST2 if needed (and present) -1: - stmia r0, {r1, r2, r3, r12} @ save FPEXC, FPSCR, FPINST, FPINST2 - mov pc, lr -ENDPROC(__asm_vfp_save) - -/* Copied from no_old_VFP_process in arch/arm/vfp/vfphw.S - * r0 = pointer to union vfp_state - * r1 = current cpu - */ -ENTRY(__asm_vfp_load) -#ifdef CONFIG_SMP - str r1, [r0, #VFP_CPU] -#endif - VFPFLDMIA r0, r2 @ reload the working registers while - @ FPEXC is in a safe state - ldmia r0, {r1, r2, r3, r12} @ load FPEXC, FPSCR, FPINST, FPINST2 - tst r1, #FPEXC_EX @ is there additional state to restore? - beq 1f - VFPFMXR FPINST, r3 @ restore FPINST (only if FPEXC.EX is set) - tst r1, #FPEXC_FP2V @ is there an FPINST2 to write? - beq 1f - VFPFMXR FPINST2, r12@ FPINST2 if needed (and present) -1: - VFPFMXR FPSCR, r2 @ restore status - mov pc, lr -ENDPROC(__asm_vfp_load) -#endif - -#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) - .macro load_tls base, tp, tpuser - ldr \tp, [\base, #TI_TP_VALUE] - .endm - - .macro switch_tls base, tp, tpuser, tmp1, tmp2 - set_tls \tp, \tmp1, \tmp2 - .endm -#else - .macro load_tls base, tp, tpuser - ldr \tp, [\base, #TI_TP_VALUE] - ldr \tpuser, [\base, #TI_TP_VALUE + 4] - .endm -#endif - -/* -/* - * Switch context routine. - * - * Registers
[Xenomai-git] Philippe Gerum : cobalt/thread: add schedparam lazy propagation
Module: xenomai-3 Branch: next Commit: 0afa49a1e4ba8e09db98aecc36236d7e9a2f393a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=0afa49a1e4ba8e09db98aecc36236d7e9a2f393a Author: Philippe GerumDate: Fri Mar 18 12:12:50 2016 +0100 cobalt/thread: add schedparam lazy propagation Provide a mechanism for carrying out a lazy propagation of schedparam updates to the regular kernel, so that userland does not have to switch to secondary mode for this. When userland issues sc_cobalt_thread_setschedparam_ex for updating the scheduling parameters of a Xenomai thread, a request for propagating this change to the regular kernel is made pending. Such request will be committed later, either when: - the thread relaxes if it is running in primary mode when the update request is received; - next time the thread calls back into the Cobalt core as a result of receiving a HOME action from a SIGSHADOW notification, which is sent if such thread was relaxed at the time of the update request. As a result, the target thread will have propagated the schedparams update to the regular kernel as soon as it resumes (relaxed) execution in user-space. --- include/cobalt/kernel/thread.h |8 + include/cobalt/uapi/kernel/thread.h |1 + include/cobalt/uapi/signal.h|1 + kernel/cobalt/posix/syscall.c |9 ++ kernel/cobalt/thread.c | 55 +++ 5 files changed, 74 insertions(+) diff --git a/include/cobalt/kernel/thread.h b/include/cobalt/kernel/thread.h index 07b6996..a4d826e 100644 --- a/include/cobalt/kernel/thread.h +++ b/include/cobalt/kernel/thread.h @@ -567,6 +567,14 @@ int xnthread_set_schedparam(struct xnthread *thread, int xnthread_killall(int grace, int mask); +void __xnthread_propagate_schedparam(struct xnthread *curr); + +static inline void xnthread_propagate_schedparam(struct xnthread *curr) +{ + if (xnthread_test_info(curr, XNSCHEDP)) + __xnthread_propagate_schedparam(curr); +} + extern struct xnthread_personality xenomai_personality; /** @} */ diff --git a/include/cobalt/uapi/kernel/thread.h b/include/cobalt/uapi/kernel/thread.h index 37637f6..6f30fcd 100644 --- a/include/cobalt/uapi/kernel/thread.h +++ b/include/cobalt/uapi/kernel/thread.h @@ -71,6 +71,7 @@ #define XNROBBED 0x0020 /**< Robbed from resource ownership */ #define XNCANCELD 0x0040 /**< Cancellation request is pending */ #define XNPIALERT 0x0080 /**< Priority inversion alert (SIGDEBUG sent) */ +#define XNSCHEDP 0x0100 /**< schedparam propagation is pending */ /* Local information flags (private to current thread) */ diff --git a/include/cobalt/uapi/signal.h b/include/cobalt/uapi/signal.h index b5483d7..8a7ea15 100644 --- a/include/cobalt/uapi/signal.h +++ b/include/cobalt/uapi/signal.h @@ -47,6 +47,7 @@ /* SIGSHADOW action codes. */ #define SIGSHADOW_ACTION_HARDEN1 #define SIGSHADOW_ACTION_BACKTRACE 2 +#define SIGSHADOW_ACTION_HOME 3 #define SIGSHADOW_BACKTRACE_DEPTH 16 #define SIGDEBUG SIGXCPU diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c index 2582949..0aeff28 100644 --- a/kernel/cobalt/posix/syscall.c +++ b/kernel/cobalt/posix/syscall.c @@ -731,6 +731,15 @@ restart: goto ret_handled; } switched = 1; + } else { + /* +* We want to run the syscall in the current Linux +* domain. This is a slow path, so proceed with any +* pending schedparam update on the fly. +*/ + switched = 0; + if (thread) + xnthread_propagate_schedparam(thread); } ret = handler(__xn_reg_arglist(regs)); diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c index ad70664..71b4058 100644 --- a/kernel/cobalt/thread.c +++ b/kernel/cobalt/thread.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -1964,6 +1965,11 @@ int __xnthread_set_schedparam(struct xnthread *thread, thread->lock_count == 0) xnsched_putback(thread); + xnthread_set_info(thread, XNSCHEDP); + /* Ask the target thread to call back if relaxed. */ + if (xnthread_test_state(thread, XNRELAX)) + xnthread_signal(thread, SIGSHADOW, SIGSHADOW_ACTION_HOME); + return ret; } @@ -2085,6 +2091,40 @@ static void post_wakeup(struct task_struct *p) ipipe_post_work_root(, work); } +void __xnthread_propagate_schedparam(struct xnthread *curr) +{ + int kpolicy = SCHED_FIFO, kprio = curr->bprio, ret; + struct task_struct *p = current; + struct sched_param param; + spl_t s; + + /* +* Test-set race for XNSCHEDP is ok, the propagation is meant +* to be done asap but not guaranteed to be
[Xenomai-git] Philippe Gerum : cobalt/arm64: leave mm tracking to the pipeline
Module: xenomai-3 Branch: next Commit: 4eee89aeaf63ce16129cca77ca8ef95a311aed54 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=4eee89aeaf63ce16129cca77ca8ef95a311aed54 Author: Philippe GerumDate: Thu Sep 17 15:08:34 2015 +0200 cobalt/arm64: leave mm tracking to the pipeline --- kernel/cobalt/arch/arm64/Kconfig |3 --- 1 file changed, 3 deletions(-) diff --git a/kernel/cobalt/arch/arm64/Kconfig b/kernel/cobalt/arch/arm64/Kconfig index 927c647..dd5a8c6 100644 --- a/kernel/cobalt/arch/arm64/Kconfig +++ b/kernel/cobalt/arch/arm64/Kconfig @@ -4,9 +4,6 @@ source "drivers/xenomai/Kconfig" config XENO_ARCH_UNLOCKED_SWITCH def_bool IPIPE_WANT_PREEMPTIBLE_SWITCH -config IPIPE_WANT_ACTIVE_MM - def_bool y - config XENO_ARCH_WANT_TIP def_bool y ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Don Mahurin : cobalt/arm64: fix warning: expects argument of type ' long unsigned int', but argument has type 'u64'
Module: xenomai-3 Branch: next Commit: f7f0262c50dbca8f0b8521a2f5a3df3adf8a0fb1 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f7f0262c50dbca8f0b8521a2f5a3df3adf8a0fb1 Author: Don MahurinDate: Thu May 14 17:34:53 2015 -0700 cobalt/arm64: fix warning: expects argument of type 'long unsigned int', but argument has type 'u64' --- kernel/cobalt/posix/syscall.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c index 8186a0f..2926d7e 100644 --- a/kernel/cobalt/posix/syscall.c +++ b/kernel/cobalt/posix/syscall.c @@ -666,7 +666,7 @@ linux_syscall: return KEVENT_PROPAGATE; bad_syscall: - printk(XENO_WARNING "bad syscall <%#lx>\n", __xn_syscall(regs)); + printk(XENO_WARNING "bad syscall <%#llx>\n", __xn_syscall(regs)); __xn_error_return(regs, -ENOSYS); ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : testsuite/smokey: add test checking Cobalt' s cpu affinity control
Module: xenomai-3 Branch: next Commit: 6a6824a1c23b84e9ec7a9f64bf8a5ff8faf3ae3e URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=6a6824a1c23b84e9ec7a9f64bf8a5ff8faf3ae3e Author: Philippe GerumDate: Fri Feb 26 11:44:16 2016 +0100 testsuite/smokey: add test checking Cobalt's cpu affinity control --- configure.ac |1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index 457d026..9eeb34d 100644 --- a/configure.ac +++ b/configure.ac @@ -926,6 +926,7 @@ AC_CONFIG_FILES([ \ testsuite/smokey/net_packet_dgram/Makefile \ testsuite/smokey/net_packet_raw/Makefile \ testsuite/smokey/net_common/Makefile \ + testsuite/smokey/cpu-affinity/Makefile \ testsuite/clocktest/Makefile \ testsuite/xeno-test/Makefile \ utils/Makefile \ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: use regular context switching code
Module: xenomai-3 Branch: next Commit: 8c32f01c118c3aeaa61a245562374b6bf7c9a827 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8c32f01c118c3aeaa61a245562374b6bf7c9a827 Author: Philippe GerumDate: Sat Oct 17 18:07:59 2015 +0200 cobalt/arm64: use regular context switching code Instead of open coding a copy of the regular context switching code, use __switch_to() directly, assuming the pipeline properly serializes switches from all domains. --- kernel/cobalt/arch/arm64/thread.c | 66 +++-- 1 file changed, 5 insertions(+), 61 deletions(-) diff --git a/kernel/cobalt/arch/arm64/thread.c b/kernel/cobalt/arch/arm64/thread.c index 35dbd72..5282b0c 100644 --- a/kernel/cobalt/arch/arm64/thread.c +++ b/kernel/cobalt/arch/arm64/thread.c @@ -34,7 +34,7 @@ #include #include -#if defined(CONFIG_XENO_ARCH_FPU) +#ifdef CONFIG_XENO_ARCH_FPU #define FPSIMD_EN (0x3 << 20) @@ -60,13 +60,6 @@ static void enable_fpsimd(void) set_cpacr(cpacr); } -static void disable_fpsimd(void) -{ - unsigned long cpacr = get_cpacr(); - cpacr &= ~FPSIMD_EN; - set_cpacr(cpacr); -} - int xnarch_fault_fpu_p(struct ipipe_trap_data *d) { return (d->exception == IPIPE_TRAP_FPU_ACC); @@ -130,55 +123,17 @@ void xnarch_init_shadow_tcb(struct xnthread *thread) tcb->fpup = &(tcb->core.host_task->thread.fpsimd_state); xnthread_clear_state(thread, XNFPU); } -#endif /* CONFIG_XENO_ARCH_FPU */ -/* Switch support functions */ -static void xnarch_tls_thread_switch(struct task_struct *next) -{ - unsigned long tpidr, tpidrro; - - if (!is_compat_task()) { - asm("mrs %0, tpidr_el0" : "=r" (tpidr)); - current->thread.tp_value = tpidr; - } - - if (is_compat_thread(task_thread_info(next))) { - tpidr = 0; - tpidrro = next->thread.tp_value; - } else { - tpidr = next->thread.tp_value; - tpidrro = 0; - } - - asm( - " msr tpidr_el0, %0\n" - " msr tpidrro_el0, %1" - : : "r" (tpidr), "r" (tpidrro)); -} - -#ifdef CONFIG_PID_IN_CONTEXTIDR -static inline void xnarch_contextidr_thread_switch(struct task_struct *next) -{ - asm( - " msr contextidr_el1, %0\n" - " isb" - : - : "r" (task_pid_nr(next))); -} -#else -static inline void xnarch_contextidr_thread_switch(struct task_struct *next) -{ -} -#endif -/* End switch support functions */ +#endif /* CONFIG_XENO_ARCH_FPU */ void xnarch_switch_to(struct xnthread *out, struct xnthread *in) { struct xnarchtcb *out_tcb = >tcb, *in_tcb = >tcb; struct mm_struct *prev_mm, *next_mm; - struct task_struct *next; + struct task_struct *prev, *next; next = in_tcb->core.host_task; + prev = out_tcb->core.host_task; prev_mm = out_tcb->core.active_mm; next_mm = in_tcb->core.mm; @@ -198,18 +153,7 @@ void xnarch_switch_to(struct xnthread *out, struct xnthread *in) enter_lazy_tlb(prev_mm, next); } - xnarch_tls_thread_switch(in_tcb->core.tip->task); - xnarch_contextidr_thread_switch(in_tcb->core.tip->task); - - /* -* Complete any pending TLB or cache maintenance on this CPU in case -* the thread migrates to a different CPU. -*/ - dsb(ish); - - disable_fpsimd(); - - cpu_switch_to(out_tcb->core.tip->task, in_tcb->core.tip->task); + __switch_to(prev, next); } int xnarch_escalate(void) ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: xenomai/syscall.h: update syscall register
Module: xenomai-3 Branch: next Commit: 22ae58bde514a035c19cfba070023a6608738406 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=22ae58bde514a035c19cfba070023a6608738406 Author: Dmitriy CherkasovDate: Fri May 8 15:54:18 2015 -0700 cobalt/arm64: xenomai/syscall.h: update syscall register --- kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h |6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h index 2fdd890..7bf95fb 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h @@ -40,10 +40,10 @@ #define __xn_reg_sys(__regs) ((__regs)->orig_x0) /* In OABI_COMPAT mode, handle both OABI and EABI userspace syscalls */ #ifdef CONFIG_OABI_COMPAT -#define __xn_syscall_p(__regs) (((__regs)->regs[7] == __NR_OABI_SYSCALL_BASE + XENO_ARM_SYSCALL) || \ -((__regs)->regs[7] == __ARM_NR_ipipe)) +#define __xn_syscall_p(__regs) (((__regs)->regs[8] == __NR_OABI_SYSCALL_BASE + XENO_ARM_SYSCALL) || \ +((__regs)->regs[8] == __ARM_NR_ipipe)) #else /* !CONFIG_OABI_COMPAT */ -#define __xn_syscall_p(__regs) ((__regs)->regs[7] == __ARM_NR_ipipe) +#define __xn_syscall_p(__regs) ((__regs)->regs[8] == __ARM_NR_ipipe) #endif /* !CONFIG_OABI_COMPAT */ #define __xn_syscall(__regs) (__xn_reg_sys(__regs) & ~__COBALT_SYSCALL_BIT) ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : config: bump version code
Module: xenomai-3 Branch: next Commit: 7c1426ba3d009ac9865ff624d4da83544e7a762b URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=7c1426ba3d009ac9865ff624d4da83544e7a762b Author: Philippe GerumDate: Sun May 21 17:59:45 2017 +0200 config: bump version code --- config/version-code |2 +- config/version-label |2 +- config/version-name |2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/version-code b/config/version-code index b0f2dcb..eca690e 100644 --- a/config/version-code +++ b/config/version-code @@ -1 +1 @@ -3.0.4 +3.0.5 diff --git a/config/version-label b/config/version-label index b0f2dcb..eca690e 100644 --- a/config/version-label +++ b/config/version-label @@ -1 +1 @@ -3.0.4 +3.0.5 diff --git a/config/version-name b/config/version-name index 76b0401..2c34bcc 100644 --- a/config/version-name +++ b/config/version-name @@ -1 +1 @@ -Washed Out Harlequin +Sisyphus's Boulder ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: set cache aliasing and disable floating point coprocessor instructions form aarch64 /arm64
Module: xenomai-3 Branch: next Commit: 168b98da25fa51798c6bba16c681e5cf5a9330cd URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=168b98da25fa51798c6bba16c681e5cf5a9330cd Author: Dmitriy CherkasovDate: Thu May 7 16:41:45 2015 -0700 cobalt/arm64: set cache aliasing and disable floating point coprocessor instructions form aarch64/arm64 --- kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h|3 ++- .../cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h | 13 - 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h index cf07a3f..e078564 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/machine.h @@ -38,7 +38,8 @@ #include #include -#define xnarch_cache_aliasing() cache_is_vivt() +/* D-side always behaves as PIPT on AArch64 (see arch/arm64/include/asm/cachetype.h) */ +#define xnarch_cache_aliasing() 0 static inline __attribute_const__ unsigned long ffnz(unsigned long ul) { diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h index b81d109..65a3e31 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/fptest.h @@ -18,10 +18,17 @@ #ifndef _COBALT_ARM_ASM_UAPI_FPTEST_H #define _COBALT_ARM_ASM_UAPI_FPTEST_H +#ifdef __aarch64__ +/* CP10 and CP11, used for the FP/NEON operations, are already excluded from +the list of valid operands for the generic coprocessor instructions */ +#define __COBALT_HAVE_VFP 0 +#else #define __COBALT_HAVE_VFP 0x1 +#endif static inline void fp_regs_set(int features, unsigned int val) { +#if __COBALT_HAVE_VFP != 0 unsigned long long e[16]; unsigned int i; @@ -34,12 +41,15 @@ static inline void fp_regs_set(int features, unsigned int val) __asm__ __volatile__("ldc p11, cr0, [%0],#32*4": "=r"(i): "0"([0]): "memory"); } +#endif } static inline unsigned int fp_regs_check(int features, unsigned int val, int (*report)(const char *fmt, ...)) { - unsigned int result = val, i; + unsigned int result = val; +#if __COBALT_HAVE_VFP != 0 + unsigned int i; unsigned long long e[16]; if (features & __COBALT_HAVE_VFP) { @@ -54,6 +64,7 @@ static inline unsigned int fp_regs_check(int features, unsigned int val, result = e[i]; } } +#endif return result; } ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Don Mahurin : lib/cobalt/arm64: implement syscall for armv8/aarch64
Module: xenomai-3 Branch: next Commit: c86f4ee5d0ac59399bf26d40eed32c6530cd688a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c86f4ee5d0ac59399bf26d40eed32c6530cd688a Author: Don MahurinDate: Fri May 8 10:39:32 2015 -0700 lib/cobalt/arm64: implement syscall for armv8/aarch64 --- lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h |8 1 file changed, 8 insertions(+) diff --git a/lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h b/lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h index 8f48eb1..1d5806c 100644 --- a/lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h +++ b/lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h @@ -88,6 +88,7 @@ #define __sys2(x) #x #define __sys1(x) __sys2(x) +#ifndef __aarch64__ #ifdef __ARM_EABI__ #define __SYS_REG , "r7" #define __SYS_REG_DECL register unsigned long __r7 __asm__ ("r7") @@ -102,6 +103,13 @@ #define __NR_OABI_SYSCALL_BASE 0x90 #define __SYS_CALLOP "swi\t" __sys1(__NR_OABI_SYSCALL_BASE + XENO_ARM_SYSCALL) "" #endif +#else +#define __SYS_REG , "r8" +#define __SYS_REG_DECL register unsigned long __r8 __asm__ ("r8") +#define __SYS_REG_SET __r8 = XENO_ARM_SYSCALL +#define __SYS_REG_INPUT ,"r" (__r8) +#define __SYS_CALLOP "svc\t0" +#endif #define XENOMAI_DO_SYSCALL(nr, op, args...)\ ({ \ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: switch to regular system call convention
Module: xenomai-3 Branch: next Commit: 1fb07486310af3339c77de83c0fa171baa59ad47 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=1fb07486310af3339c77de83c0fa171baa59ad47 Author: Philippe GerumDate: Mon Oct 19 15:54:55 2015 +0200 cobalt/arm64: switch to regular system call convention --- .../arch/arm64/include/asm/xenomai/syscall.h | 29 +--- .../arch/arm64/include/asm/xenomai/uapi/syscall.h |8 +- lib/cobalt/arch/arm64/features.c |8 - .../arch/arm64/include/asm/xenomai/syscall.h | 180 lib/cobalt/arch/arm64/include/asm/xenomai/tsc.h| 19 +-- 5 files changed, 78 insertions(+), 166 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h index 949f287..9fc6522 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h @@ -28,31 +28,16 @@ #include #include -#ifndef __NR_SYSCALL_BASE -#define __NR_SYSCALL_BASE 0 -#endif - -#ifndef __ARM_NR_ipipe -/* Legacy pipelines do not define this. */ -#define __ARM_NR_ipipe (__NR_SYSCALL_BASE + XENO_ARM_SYSCALL) -#endif - -#define __xn_reg_sys(__regs) ((__regs)->orig_x0) -/* In OABI_COMPAT mode, handle both OABI and EABI userspace syscalls */ -#ifdef CONFIG_OABI_COMPAT -#define __xn_syscall_p(__regs) (((__regs)->regs[8] == __NR_OABI_SYSCALL_BASE + XENO_ARM_SYSCALL) || \ -((__regs)->regs[8] == __ARM_NR_ipipe)) -#else /* !CONFIG_OABI_COMPAT */ -#define __xn_syscall_p(__regs) ((__regs)->regs[8] == __ARM_NR_ipipe) -#endif /* !CONFIG_OABI_COMPAT */ +#define __xn_reg_sys(__regs) ((unsigned long)(__regs)->syscallno) +#define __xn_syscall_p(regs) ((__xn_reg_sys(regs) & __COBALT_SYSCALL_BIT) != 0) #define __xn_syscall(__regs) ((unsigned long)(__xn_reg_sys(__regs) & ~__COBALT_SYSCALL_BIT)) #define __xn_reg_rval(__regs) ((__regs)->regs[0]) -#define __xn_reg_arg1(__regs) ((__regs)->regs[1]) -#define __xn_reg_arg2(__regs) ((__regs)->regs[2]) -#define __xn_reg_arg3(__regs) ((__regs)->regs[3]) -#define __xn_reg_arg4(__regs) ((__regs)->regs[4]) -#define __xn_reg_arg5(__regs) ((__regs)->regs[5]) +#define __xn_reg_arg1(__regs) ((__regs)->regs[0]) +#define __xn_reg_arg2(__regs) ((__regs)->regs[1]) +#define __xn_reg_arg3(__regs) ((__regs)->regs[2]) +#define __xn_reg_arg4(__regs) ((__regs)->regs[3]) +#define __xn_reg_arg5(__regs) ((__regs)->regs[4]) #define __xn_reg_pc(__regs)((__regs)->pc) #define __xn_reg_sp(__regs)((__regs)->sp) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/syscall.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/syscall.h index 60dabd5..5b319d6 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/syscall.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/uapi/syscall.h @@ -23,12 +23,6 @@ #define __xn_syscode(__nr) (__COBALT_SYSCALL_BIT | (__nr)) -#define XENO_ARM_SYSCALL0x000F0042 /* carefully chosen... */ - -#define XENOMAI_SYSARCH_ATOMIC_ADD_RETURN 0 -#define XENOMAI_SYSARCH_ATOMIC_SET_MASK1 -#define XENOMAI_SYSARCH_ATOMIC_CLEAR_MASK 2 -#define XENOMAI_SYSARCH_XCHG 3 -#define XENOMAI_SYSARCH_TSCINFO 4 +#define XENOMAI_SYSARCH_TSCINFO0 #endif /* !_COBALT_ARM64_ASM_UAPI_SYSCALL_H */ diff --git a/lib/cobalt/arch/arm64/features.c b/lib/cobalt/arch/arm64/features.c index f5253a6..254c8ae 100644 --- a/lib/cobalt/arch/arm64/features.c +++ b/lib/cobalt/arch/arm64/features.c @@ -59,14 +59,6 @@ void cobalt_check_features(struct cobalt_featinfo *finfo) page_size = sysconf(_SC_PAGESIZE); -#ifndef __aarch64__ - __xn_tscinfo.kuser_tsc_get = - (__xn_rdtsc_t *)(0x1004 - - ((*(unsigned *)(0x0ffc) + 3) << 5)); -#else - __xn_tscinfo.kuser_tsc_get = 0; -#endif - phys_addr = (unsigned long)__xn_tscinfo.kinfo.counter; addr = __STD(mmap(NULL, page_size, PROT_READ, MAP_SHARED, diff --git a/lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h b/lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h index 8e7ad61..d2dfda6 100644 --- a/lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h +++ b/lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h @@ -1,8 +1,5 @@ /* - * Copyright (C) 2001,2002,2003,2004 Philippe Gerum . - * - * ARM port - * Copyright (C) 2005 Stelian Pop + * Copyright (C) 2015 Philippe Gerum . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -25,119 +22,76 @@ #include #include -/* - * Some of the following macros have been adapted from Linux's - * implementation of the syscall mechanism in : - */ - -#define LOADARGS_0(syscode, dummy...) \ - __a0 = (unsigned long) (syscode) -#define
[Xenomai-git] Philippe Gerum : cobalt/arm64: assume TLS is properly supported
Module: xenomai-3 Branch: next Commit: 5d60ac62ab2d09bf6aaef1802cdc089e2e735b9f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=5d60ac62ab2d09bf6aaef1802cdc089e2e735b9f Author: Philippe GerumDate: Thu Sep 17 02:19:57 2015 +0200 cobalt/arm64: assume TLS is properly supported --- lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h |9 +++-- 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h b/lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h index 1d5806c..8e7ad61 100644 --- a/lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h +++ b/lib/cobalt/arch/arm64/include/asm/xenomai/syscall.h @@ -18,8 +18,8 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#ifndef _LIB_COBALT_ARM_SYSCALL_H -#define _LIB_COBALT_ARM_SYSCALL_H +#ifndef _LIB_COBALT_ARM64_SYSCALL_H +#define _LIB_COBALT_ARM64_SYSCALL_H #include #include @@ -29,9 +29,6 @@ * Some of the following macros have been adapted from Linux's * implementation of the syscall mechanism in : */ -#if defined(HAVE_TLS) && __GNUC__ == 4 && __GNUC_MINOR__ >= 3 -#error TLS support (__thread) is broken with GCC >= 4.3, use --disable-tls when configuring -#endif #define LOADARGS_0(syscode, dummy...) \ __a0 = (unsigned long) (syscode) @@ -143,4 +140,4 @@ #define XENOMAI_SYSBIND(breq) \ XENOMAI_DO_SYSCALL(1,sc_cobalt_bind,breq) -#endif /* !_LIB_COBALT_ARM_SYSCALL_H */ +#endif /* !_LIB_COBALT_ARM64_SYSCALL_H */ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: add README for I-pipe support
Module: xenomai-3 Branch: next Commit: 6ede4c6146ada7a8236ed5b14832bcc6c295d1ee URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=6ede4c6146ada7a8236ed5b14832bcc6c295d1ee Author: Philippe GerumDate: Sun Nov 1 17:22:33 2015 +0100 cobalt/arm64: add README for I-pipe support --- kernel/cobalt/arch/arm64/patches/README | 16 1 file changed, 16 insertions(+) diff --git a/kernel/cobalt/arch/arm64/patches/README b/kernel/cobalt/arch/arm64/patches/README new file mode 100644 index 000..fd85e06 --- /dev/null +++ b/kernel/cobalt/arch/arm64/patches/README @@ -0,0 +1,16 @@ +-- arch/arm64/patches + +Xenomai needs special kernel support to deliver fast and deterministic +response time to external interrupts, and also to provide real-time +services highly integrated with the standard Linux kernel. + +This support is provided by the interrupt pipeline (aka I-pipe) in the +form of a kernel patch you have to apply against a vanilla kernel +tree, before you attempt to compile the Xenomai codebase against the +latter kernel. + +The Xenomai arm64 port is work in progress. The I-pipe support for +this architecture is exclusively available from this development tree +at the moment: + +git://git.xenomai.org/ipipe.git, branch devel/ipipe-3.18-linaro-arm64. ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Don Mahurin : lib/cobalt/arm64: add __LINUX_ARM_ARCH__ form armv8/aarch64
Module: xenomai-3 Branch: next Commit: f3716895d211c24b53f32ebefcd547c5ae983822 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f3716895d211c24b53f32ebefcd547c5ae983822 Author: Don MahurinDate: Fri May 8 10:39:01 2015 -0700 lib/cobalt/arm64: add __LINUX_ARM_ARCH__ form armv8/aarch64 --- lib/cobalt/arch/arm64/include/asm/xenomai/features.h |4 1 file changed, 4 insertions(+) diff --git a/lib/cobalt/arch/arm64/include/asm/xenomai/features.h b/lib/cobalt/arch/arm64/include/asm/xenomai/features.h index 10bd0c7..0d6702b 100644 --- a/lib/cobalt/arch/arm64/include/asm/xenomai/features.h +++ b/lib/cobalt/arch/arm64/include/asm/xenomai/features.h @@ -47,6 +47,10 @@ #define __LINUX_ARM_ARCH__ 7 #endif /* armv7 */ +#if defined(__aarch64__) +#define __LINUX_ARM_ARCH__ 8 +#endif /* armv8 */ + #ifndef __LINUX_ARM_ARCH__ #error "Could not find current ARM architecture" #endif ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm64: use lazy fpsimd switch mode
Module: xenomai-3 Branch: next Commit: 953b52cd6623cf4dbd36b44959676b1b0f65654f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=953b52cd6623cf4dbd36b44959676b1b0f65654f Author: Philippe GerumDate: Mon Oct 19 10:38:21 2015 +0200 cobalt/arm64: use lazy fpsimd switch mode --- kernel/cobalt/arch/arm64/thread.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/cobalt/arch/arm64/thread.c b/kernel/cobalt/arch/arm64/thread.c index 5282b0c..2238751 100644 --- a/kernel/cobalt/arch/arm64/thread.c +++ b/kernel/cobalt/arch/arm64/thread.c @@ -153,7 +153,7 @@ void xnarch_switch_to(struct xnthread *out, struct xnthread *in) enter_lazy_tlb(prev_mm, next); } - __switch_to(prev, next); + ipipe_switch_to(prev, next); } int xnarch_escalate(void) ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Don Mahurin : lib/cobalt/arm64: replace tsc counter
Module: xenomai-3 Branch: next Commit: 56f093e710469d12299114d75a58b942d9ca7503 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=56f093e710469d12299114d75a58b942d9ca7503 Author: Don MahurinDate: Wed May 13 09:36:25 2015 -0700 lib/cobalt/arm64: replace tsc counter --- lib/cobalt/arch/arm64/include/asm/xenomai/tsc.h | 19 +++ 1 file changed, 19 insertions(+) diff --git a/lib/cobalt/arch/arm64/include/asm/xenomai/tsc.h b/lib/cobalt/arch/arm64/include/asm/xenomai/tsc.h index 594c4ad..a055427 100644 --- a/lib/cobalt/arch/arm64/include/asm/xenomai/tsc.h +++ b/lib/cobalt/arch/arm64/include/asm/xenomai/tsc.h @@ -27,6 +27,8 @@ #include #include +#include +#include /* * Putting kuser_tsc_get and kinfo.counter in the same struct results @@ -39,10 +41,27 @@ struct __xn_full_tscinfo { }; extern struct __xn_full_tscinfo __xn_tscinfo; +static inline uint64_t get_counter(void) +{ +uint64_t cval; + +#ifdef __aarch64__ + asm volatile("isb; mrs %0, cntvct_el0; isb; " : "=r" (cval) :: "memory"); +#else + asm volatile("isb; mrrc p15, 1, %Q0, %R0, c14; isb" : "=r" (cval) :: "memory"); +#endif + + return cval; +} + static inline __attribute__((always_inline)) unsigned long long cobalt_read_tsc(void) { +#ifndef __aarch64__ return __xn_tscinfo.kuser_tsc_get(__xn_tscinfo.kinfo.counter); +#else + return get_counter(); +#endif } #endif /* !_LIB_COBALT_ARM_TSC_H */ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm: add calibration data for STIH4x SoC
Module: xenomai-3 Branch: next Commit: 881461f1381f68201c1ceb8ad46e904b9e43528e URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=881461f1381f68201c1ceb8ad46e904b9e43528e Author: Philippe GerumDate: Sat Jun 3 17:48:50 2017 +0200 cobalt/arm: add calibration data for STIH4x SoC --- kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h |2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h b/kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h index e303a04..fa96f65 100644 --- a/kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h +++ b/kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h @@ -48,6 +48,8 @@ static inline void xnarch_get_latencies(struct xnclock_gravity *p) ulat = 2800; #elif defined(CONFIG_ARCH_OMAP) ulat = cpu_is_omap44xx() ? 2500 : 5000; +#elif defined(CONFIG_ARCH_STI) + ulat = 6000; #else ulat = 9500;/* XXX sane? */ #endif ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Dmitriy Cherkasov : cobalt/arm64: thread.h & syscall.h: fix register references for arm64
Module: xenomai-3 Branch: next Commit: 44f04f77339c6ac3d3a87d568de49c664e2b10d0 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=44f04f77339c6ac3d3a87d568de49c664e2b10d0 Author: Dmitriy CherkasovDate: Thu May 7 16:41:09 2015 -0700 cobalt/arm64: thread.h & syscall.h: fix register references for arm64 --- kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h |8 ++-- kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h |2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h index f0a1090..2fdd890 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/syscall.h @@ -28,12 +28,16 @@ #include #include +#ifndef __NR_SYSCALL_BASE +#define __NR_SYSCALL_BASE 0 +#endif + #ifndef __ARM_NR_ipipe /* Legacy pipelines do not define this. */ #define __ARM_NR_ipipe (__NR_SYSCALL_BASE + XENO_ARM_SYSCALL) #endif -#define __xn_reg_sys(__regs) ((__regs)->ARM_ORIG_r0) +#define __xn_reg_sys(__regs) ((__regs)->orig_x0) /* In OABI_COMPAT mode, handle both OABI and EABI userspace syscalls */ #ifdef CONFIG_OABI_COMPAT #define __xn_syscall_p(__regs) (((__regs)->regs[7] == __NR_OABI_SYSCALL_BASE + XENO_ARM_SYSCALL) || \ @@ -49,7 +53,7 @@ #define __xn_reg_arg3(__regs) ((__regs)->regs[3]) #define __xn_reg_arg4(__regs) ((__regs)->regs[4]) #define __xn_reg_arg5(__regs) ((__regs)->regs[5]) -#define __xn_reg_pc(__regs)((__regs)->ip) +#define __xn_reg_pc(__regs)((__regs)->pc) #define __xn_reg_sp(__regs)((__regs)->sp) static inline void __xn_error_return(struct pt_regs *regs, int v) diff --git a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h index 11439a3..958f340 100644 --- a/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h +++ b/kernel/cobalt/arch/arm64/include/asm/xenomai/thread.h @@ -52,7 +52,7 @@ struct xnarchtcb { #define xnarch_fault_regs(d) ((d)->regs) #define xnarch_fault_trap(d) ((d)->exception) #define xnarch_fault_code(d) (0) -#define xnarch_fault_pc(d) ((d)->regs->ARM_pc - (thumb_mode((d)->regs) ? 2 : 4)) /* XXX ? */ +#define xnarch_fault_pc(d) ((d)->regs->pc - 4) /* XXX ? */ #define xnarch_fault_pf_p(d) ((d)->exception == IPIPE_TRAP_ACCESS) #define xnarch_fault_bp_p(d) ((current->ptrace & PT_PTRACED) && \ ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git
[Xenomai-git] Philippe Gerum : cobalt/arm: add calibration data for STIH4x SoC
Module: xenomai-3 Branch: stable-3.0.x Commit: 881461f1381f68201c1ceb8ad46e904b9e43528e URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=881461f1381f68201c1ceb8ad46e904b9e43528e Author: Philippe GerumDate: Sat Jun 3 17:48:50 2017 +0200 cobalt/arm: add calibration data for STIH4x SoC --- kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h |2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h b/kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h index e303a04..fa96f65 100644 --- a/kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h +++ b/kernel/cobalt/arch/arm/include/asm/xenomai/calibration.h @@ -48,6 +48,8 @@ static inline void xnarch_get_latencies(struct xnclock_gravity *p) ulat = 2800; #elif defined(CONFIG_ARCH_OMAP) ulat = cpu_is_omap44xx() ? 2500 : 5000; +#elif defined(CONFIG_ARCH_STI) + ulat = 6000; #else ulat = 9500;/* XXX sane? */ #endif ___ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git