Changes in / [02f4eb8:26d944c]


Ignore:
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/kernel/startup.cfa

    r02f4eb8 r26d944c  
    1919// C Includes
    2020#include <errno.h>              // errno
     21#include <signal.h>
    2122#include <string.h>             // strerror
    2223#include <unistd.h>             // sysconf
     24
    2325extern "C" {
    2426      #include <limits.h>       // PTHREAD_STACK_MIN
     27        #include <unistd.h>       // syscall
    2528        #include <sys/eventfd.h>  // eventfd
    2629      #include <sys/mman.h>     // mprotect
    2730      #include <sys/resource.h> // getrlimit
     31        #include <sys/syscall.h>  // __NR_xxx
    2832}
    2933
     
    98102extern void __wake_proc(processor *);
    99103
     104#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
     105        // No forward declaration needed
     106        #define __kernel_rseq_register rseq_register_current_thread
     107        #define __kernel_rseq_unregister rseq_unregister_current_thread
     108#elif defined(CFA_HAVE_LINUX_RSEQ_H)
     109        void __kernel_raw_rseq_register  (void);
     110        void __kernel_raw_rseq_unregister(void);
     111
     112        #define __kernel_rseq_register __kernel_raw_rseq_register
     113        #define __kernel_rseq_unregister __kernel_raw_rseq_unregister
     114#else
     115        // No forward declaration needed
     116        // No initialization needed
     117        static inline void noop(void) {};
     118
     119        #define __kernel_rseq_register noop
     120        #define __kernel_rseq_unregister noop
     121#endif
     122
    100123//-----------------------------------------------------------------------------
    101124// Kernel storage
     
    141164#elif defined(CFA_HAVE_LINUX_RSEQ_H)
    142165        extern "Cforall" {
    143                 // thread_local volatile struct rseq __cfaabi_rseq;
     166                __attribute__((aligned(128))) thread_local volatile struct rseq __cfaabi_rseq @= {
     167                        .cpu_id : RSEQ_CPU_ID_UNINITIALIZED,
     168                };
    144169        }
    145170#else
     
    230255
    231256        register_tls( mainProcessor );
     257
     258        __kernel_rseq_register();
    232259
    233260        //initialize the global state variables
     
    296323        mainProcessor->local_data = 0p;
    297324
     325        __kernel_rseq_unregister();
     326
    298327        unregister_tls( mainProcessor );
    299328
     
    347376        register_tls( proc );
    348377
    349         #if defined(CFA_HAVE_LINUX_LIBRSEQ)
    350                 rseq_register_current_thread();
    351         #endif
     378        __kernel_rseq_register();
    352379
    353380        // SKULLDUGGERY: We want to create a context for the processor coroutine
     
    389416
    390417        proc->local_data = 0p;
     418
     419        __kernel_rseq_unregister();
    391420
    392421        unregister_tls( proc );
     
    803832}
    804833#endif
     834
     835#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
     836        // No definition needed
     837#elif defined(CFA_HAVE_LINUX_RSEQ_H)
     838
     839        #if defined( __x86_64 ) || defined( __i386 )
     840                #define RSEQ_SIG        0x53053053
     841        #elif defined( __ARM_ARCH )
     842                #ifdef __ARMEB__
     843                #define RSEQ_SIG    0xf3def5e7      /* udf    #24035    ; 0x5de3 (ARMv6+) */
     844                #else
     845                #define RSEQ_SIG    0xe7f5def3      /* udf    #24035    ; 0x5de3 */
     846                #endif
     847        #endif
     848
     849        extern void __disable_interrupts_hard();
     850        extern void __enable_interrupts_hard();
     851
     852        void __kernel_raw_rseq_register  (void) {
     853                /* paranoid */ verify( __cfaabi_rseq.cpu_id == RSEQ_CPU_ID_UNINITIALIZED );
     854
     855                // int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, (sigset_t *)0p, _NSIG / 8);
     856                int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, RSEQ_SIG);
     857                if(ret != 0) {
     858                        int e = errno;
     859                        switch(e) {
     860                        case EINVAL: abort("KERNEL ERROR: rseq register invalid argument");
     861                        case ENOSYS: abort("KERNEL ERROR: rseq register no supported");
     862                        case EFAULT: abort("KERNEL ERROR: rseq register with invalid argument");
     863                        case EBUSY : abort("KERNEL ERROR: rseq register already registered");
     864                        case EPERM : abort("KERNEL ERROR: rseq register sig  argument  on unregistration does not match the signature received on registration");
     865                        default: abort("KERNEL ERROR: rseq register unexpected return %d", e);
     866                        }
     867                }
     868        }
     869
     870        void __kernel_raw_rseq_unregister(void) {
     871                /* paranoid */ verify( __cfaabi_rseq.cpu_id >= 0 );
     872
     873                // int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, (sigset_t *)0p, _NSIG / 8);
     874                int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, RSEQ_SIG);
     875                if(ret != 0) {
     876                        int e = errno;
     877                        switch(e) {
     878                        case EINVAL: abort("KERNEL ERROR: rseq unregister invalid argument");
     879                        case ENOSYS: abort("KERNEL ERROR: rseq unregister no supported");
     880                        case EFAULT: abort("KERNEL ERROR: rseq unregister with invalid argument");
     881                        case EBUSY : abort("KERNEL ERROR: rseq unregister already registered");
     882                        case EPERM : abort("KERNEL ERROR: rseq unregister sig  argument  on unregistration does not match the signature received on registration");
     883                        default: abort("KERNEL ERROR: rseq unregisteunexpected return %d", e);
     884                        }
     885                }
     886        }
     887#else
     888        // No definition needed
     889#endif
  • libcfa/src/concurrency/kernel_private.hfa

    r02f4eb8 r26d944c  
    3030        #include <rseq/rseq.h>
    3131#elif defined(CFA_HAVE_LINUX_RSEQ_H)
    32         // #include <linux/rseq.h>
     32        #include <linux/rseq.h>
    3333#else
    3434        #ifndef _GNU_SOURCE
     
    6060#elif defined(CFA_HAVE_LINUX_RSEQ_H)
    6161        extern "Cforall" {
    62                 // extern __attribute__((aligned(128))) thread_local volatile struct rseq __cfaabi_rseq;
     62                extern __attribute__((aligned(128))) thread_local volatile struct rseq __cfaabi_rseq;
    6363        }
    6464#else
     
    6969        /* paranoid */ verify( ! __preemption_enabled() );
    7070#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
    71         return rseq_current_cpu_raw();
     71        return rseq_current_cpu();
    7272#elif defined(CFA_HAVE_LINUX_RSEQ_H)
    73         // return __cfaabi_rseq.cpu_id;
     73        int r = __cfaabi_rseq.cpu_id;
     74        /* paranoid */ verify( r >= 0 );
     75        return r;
    7476#else
    7577        return sched_getcpu();
  • src/AST/Pass.impl.hpp

    r02f4eb8 r26d944c  
    479479                        guard_symtab guard { *this };
    480480                        // implicit add __func__ identifier as specified in the C manual 6.4.2.2
    481                         static ast::ptr< ast::ObjectDecl > func{ new ast::ObjectDecl{ 
     481                        static ast::ptr< ast::ObjectDecl > func{ new ast::ObjectDecl{
    482482                                CodeLocation{}, "__func__",
    483483                                new ast::ArrayType{
     
    522522        VISIT({
    523523                guard_symtab guard { * this };
    524                 maybe_accept( node, &StructDecl::params  );
    525                 maybe_accept( node, &StructDecl::members );
     524                maybe_accept( node, &StructDecl::params     );
     525                maybe_accept( node, &StructDecl::members    );
     526                maybe_accept( node, &StructDecl::attributes );
    526527        })
    527528
     
    543544        VISIT({
    544545                guard_symtab guard { * this };
    545                 maybe_accept( node, &UnionDecl::params  );
    546                 maybe_accept( node, &UnionDecl::members );
     546                maybe_accept( node, &UnionDecl::params     );
     547                maybe_accept( node, &UnionDecl::members    );
     548                maybe_accept( node, &UnionDecl::attributes );
    547549        })
    548550
     
    562564        VISIT(
    563565                // unlike structs, traits, and unions, enums inject their members into the global scope
    564                 maybe_accept( node, &EnumDecl::params  );
    565                 maybe_accept( node, &EnumDecl::members );
     566                maybe_accept( node, &EnumDecl::params     );
     567                maybe_accept( node, &EnumDecl::members    );
     568                maybe_accept( node, &EnumDecl::attributes );
    566569        )
    567570
     
    577580        VISIT({
    578581                guard_symtab guard { *this };
    579                 maybe_accept( node, &TraitDecl::params  );
    580                 maybe_accept( node, &TraitDecl::members );
     582                maybe_accept( node, &TraitDecl::params     );
     583                maybe_accept( node, &TraitDecl::members    );
     584                maybe_accept( node, &TraitDecl::attributes );
    581585        })
    582586
  • src/Common/PassVisitor.impl.h

    r02f4eb8 r26d944c  
    636636                maybeAccept_impl( node->parameters, *this );
    637637                maybeAccept_impl( node->members   , *this );
     638                maybeAccept_impl( node->attributes, *this );
    638639        }
    639640
     
    656657                maybeAccept_impl( node->parameters, *this );
    657658                maybeAccept_impl( node->members   , *this );
     659                maybeAccept_impl( node->attributes, *this );
    658660        }
    659661
     
    676678                maybeMutate_impl( node->parameters, *this );
    677679                maybeMutate_impl( node->members   , *this );
     680                maybeMutate_impl( node->attributes, *this );
    678681        }
    679682
     
    697700                maybeAccept_impl( node->parameters, *this );
    698701                maybeAccept_impl( node->members   , *this );
     702                maybeAccept_impl( node->attributes, *this );
    699703        }
    700704
     
    714718                maybeAccept_impl( node->parameters, *this );
    715719                maybeAccept_impl( node->members   , *this );
     720                maybeAccept_impl( node->attributes, *this );
    716721        }
    717722
     
    732737                maybeMutate_impl( node->parameters, *this );
    733738                maybeMutate_impl( node->members   , *this );
     739                maybeMutate_impl( node->attributes, *this );
    734740        }
    735741
     
    750756        maybeAccept_impl( node->parameters, *this );
    751757        maybeAccept_impl( node->members   , *this );
     758        maybeAccept_impl( node->attributes, *this );
    752759
    753760        VISIT_END( node );
     
    763770        maybeAccept_impl( node->parameters, *this );
    764771        maybeAccept_impl( node->members   , *this );
     772        maybeAccept_impl( node->attributes, *this );
    765773
    766774        VISIT_END( node );
     
    776784        maybeMutate_impl( node->parameters, *this );
    777785        maybeMutate_impl( node->members   , *this );
     786        maybeMutate_impl( node->attributes, *this );
    778787
    779788        MUTATE_END( Declaration, node );
     
    790799                maybeAccept_impl( node->parameters, *this );
    791800                maybeAccept_impl( node->members   , *this );
     801                maybeAccept_impl( node->attributes, *this );
    792802        }
    793803
     
    805815                maybeAccept_impl( node->parameters, *this );
    806816                maybeAccept_impl( node->members   , *this );
     817                maybeAccept_impl( node->attributes, *this );
    807818        }
    808819
     
    820831                maybeMutate_impl( node->parameters, *this );
    821832                maybeMutate_impl( node->members   , *this );
     833                maybeMutate_impl( node->attributes, *this );
    822834        }
    823835
     
    38563868
    38573869//--------------------------------------------------------------------------
    3858 // Attribute
     3870// Constant
    38593871template< typename pass_type >
    38603872void PassVisitor< pass_type >::visit( Constant * node ) {
  • src/SymTab/Validate.cc

    r02f4eb8 r26d944c  
    11521152                GuardScope( typedeclNames );
    11531153                mutateAll( aggr->parameters, * visitor );
     1154                mutateAll( aggr->attributes, * visitor );
    11541155
    11551156                // unroll mutateAll for aggr->members so that implicit typedefs for nested types are added to the aggregate body.
  • tests/.expect/typedefRedef-ERR1.txt

    r02f4eb8 r26d944c  
    1 typedefRedef.cfa:69:25: warning: Compiled
     1typedefRedef.cfa:75:25: warning: Compiled
    22typedefRedef.cfa:4:1 error: Cannot redefine typedef: Foo
    3 typedefRedef.cfa:59:1 error: Cannot redefine typedef: ARR
     3typedefRedef.cfa:65:1 error: Cannot redefine typedef: ARR
  • tests/.expect/typedefRedef.txt

    r02f4eb8 r26d944c  
    1 typedefRedef.cfa:69:25: warning: Compiled
     1typedefRedef.cfa:75:25: warning: Compiled
  • tests/typedefRedef.cfa

    r02f4eb8 r26d944c  
    4545typedef int X2;
    4646
     47X2 value  __attribute__((aligned(4 * sizeof(X2))));
     48
     49__attribute__((aligned(4 * sizeof(X2)))) struct rseq_cs {
     50        int foo;
     51};
     52
    4753// xxx - this doesn't work yet due to parsing problems with generic types
    4854// #ifdef __CFA__
Note: See TracChangeset for help on using the changeset viewer.