Ejemplo n.º 1
0
                                         int mmap_thread() {
                                           __CPROVER_atomic_begin();
                                             __CPROVER_assume(sem == 1); __assume_dummy=0;                        
                                             sem = 0;                                                             
                                             assert(vm_consistent == 1);                                          
                                             //noReorderBegin();
                                               assert(((want_sem == 0) | (mtx == 0)) | (sem != 0));               
                                               want_mtx = 1;                                                      
                                               __CPROVER_assume(mtx == 0); __assume_dummy=0;                      
                                               mtx = 1;                                                           
                                               want_mtx = 0;                                                      
                                               assert(state != 3);                                                
                                               state = 3;                                                         
                                               state = 1;                                                         
                                               state = 3;                                                         
                                               state = 2;                                                         
                                               mtx = 0;                                                           
                                             //noReorderBegin();
                                           __CPROVER_atomic_end();
__CPROVER_atomic_begin();                  vm_consistent = 0;                                                     __CPROVER_atomic_end();
__CPROVER_atomic_begin();                  vm_consistent = 1;                                                     __CPROVER_atomic_end();
__CPROVER_atomic_begin();                  sem = 1;                                                               __CPROVER_atomic_end();
                                           __mmap_thread_finished = 1;
                                         }
/* Common code for rcu_idle_enter() and rcu_irq_exit(), see kernel/rcu/tree.c. */
static void rcu_idle_enter_common(long long newval)
{
 /* MUTANT (negate) */	if(! (newval)) {
		__CPROVER_atomic_begin(); if (!covered[0]) {covered[0] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
		RCU_TRACE(trace_rcu_dyntick(TPS("--="),
rcu_dynticks_nesting, newval));
		__CPROVER_atomic_begin(); if (!covered[1]) {covered[1] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
		rcu_dynticks_nesting = newval;
		__CPROVER_atomic_begin(); if (!covered[2]) {covered[2] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
		return;
	__CPROVER_atomic_begin(); if (!covered[3]) {covered[3] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
	}
	__CPROVER_atomic_begin(); if (!covered[4]) {covered[4] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
	RCU_TRACE(trace_rcu_dyntick(TPS("Start"),
				    __CPROVER_atomic_begin(); if (!covered[5]) {covered[5] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
				    rcu_dynticks_nesting, newval));
	__CPROVER_atomic_begin(); if (!covered[6]) {covered[6] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
	if (IS_ENABLED(CONFIG_RCU_TRACE) && !is_idle_task(current)) {
		__CPROVER_atomic_begin(); if (!covered[7]) {covered[7] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
		struct task_struct *idle __maybe_unused = idle_task(smp_processor_id());

		__CPROVER_atomic_begin(); if (!covered[8]) {covered[8] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
		RCU_TRACE(trace_rcu_dyntick(TPS("Entry error: not idle task"),
					    __CPROVER_atomic_begin(); if (!covered[9]) {covered[9] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
					    rcu_dynticks_nesting, newval));
		__CPROVER_atomic_begin(); if (!covered[10]) {covered[10] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
		ftrace_dump(DUMP_ALL);
		__CPROVER_atomic_begin(); if (!covered[11]) {covered[11] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
		WARN_ONCE(1, "Current pid: %d comm: %s / Idle pid: %d comm: %s",
			  __CPROVER_atomic_begin(); if (!covered[12]) {covered[12] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
			  current->pid, current->comm,
			  idle->pid, idle->comm); /* must be idle task! */
	__CPROVER_atomic_begin(); if (!covered[13]) {covered[13] = 1; total_covered += 1;} __CPROVER_atomic_end(); 
	}
Ejemplo n.º 3
0
Archivo: main.c Proyecto: olivo/BP
void* qrcu_reader1() {
  int myidx;
  
  /* rcu_read_lock */
  while (1) {
    myidx = idx;
    if (NONDET) {
#ifdef SATABS
      { __CPROVER_atomic_begin();
#else
      { __blockattribute__((atomic))
#endif
	assume(myidx <= 0);
	assume(ctr1>0);
	ctr1++;
#ifdef SATABS
      __CPROVER_atomic_end(); }
#else
      }
#endif
      break;
    } else {
      if (NONDET) {
#ifdef SATABS
  { __CPROVER_atomic_begin();
#else
	{ __blockattribute__((atomic))
#endif
	  assume(myidx > 0);
	  assume(ctr2>0);
	  ctr2++;
#ifdef SATABS
  __CPROVER_atomic_end(); }
#else
	}
#endif
	break;
      } else {}
    }
  }
  /* This is a simpler code for rcu_read_lock, but the frontend generates too many transitions
  while (1) {
    myidx = idx;
    if (myidx <= 0 && ctr1>0) {
      ctr1++; break;
    } else {
      if (myidx > 0 && ctr2>0) {
	ctr2++; break;
      } else {}
    }
    } */

  readerprogress1 = 1; /*** readerprogress[me] = 1; ***/
  readerprogress1 = 2; /*** readerprogress[me] = 2 ***/

  /* rcu_read_unlock */
#ifdef SATABS
  { __CPROVER_atomic_begin();
#else
  { __blockattribute__((atomic))
#endif
      if (myidx <= 0) { ctr1--; } // use ctr1
      else { ctr2--; } // use ctr2
#ifdef SATABS
  __CPROVER_atomic_end(); }
#else
  }
#endif
}
Ejemplo n.º 4
0
Archivo: main.c Proyecto: olivo/BP
void* qrcu_updater() {
  int i;
  int readerstart1;
  int readerstart2;
  int readerstart3;
  int sum;

#ifndef SATABS
  glb_init(idx==0);
  glb_init(ctr1==1);
  glb_init(ctr2==0);
  glb_init(readerprogress1==0);
  glb_init(readerprogress2==0);
  glb_init(readerprogress3==0);
  glb_init(mutex==0);  
#endif

  /* Snapshot reader state. */
#ifdef SATABS
  { __CPROVER_atomic_begin();
#else
  { __blockattribute__((atomic))
#endif
      readerstart1 = readerprogress1;
      readerstart2 = readerprogress2;
      readerstart3 = readerprogress3;
#ifdef SATABS
  __CPROVER_atomic_end(); }
#else
  }
#endif

  sum_unordered;
  if (sum <= 1) { sum_unordered; }
  if (sum > 1) {
    acquire(mutex);
    if (idx <= 0) { ctr2++; idx = 1; ctr1--; }
    else { ctr1++; idx = 0; ctr2--; }
    if (idx <= 0) { while (ctr2 > 0); }
    else { while (ctr1 > 0); }
    release(mutex);
  }

  /* Verify reader progress. */
#ifdef SATABS
  { __CPROVER_atomic_begin();
#else
  { __blockattribute__((atomic))
#endif
      if (NONDET) {
	assume(readerstart1 == 1);
	assume(readerprogress1 == 1);
	assert(0);
      } else {
	if (NONDET) {
	  assume(readerstart2 == 1);
	  assume(readerprogress2 == 1);
	  assert(0);
	} else {
	  if (NONDET) {
	    assume(readerstart2 == 1);
	    assume(readerprogress2 == 1);
	    assert(0);
	  } else { }
	}
      }
#ifdef SATABS
  __CPROVER_atomic_end(); }
#else
  }
#endif
  /* Frontend generates too many transitions:
  { __blockattribute__((atomic))
      sum = 0;
      if (readerstart1 == 1 && readerprogress1 == 1)
	sum++;
      if (readerstart2 == 1 && readerprogress2 == 1)
	sum++;
      assert(sum == 0);
      } */

}
Ejemplo n.º 5
0
Archivo: basics.c Proyecto: olivo/BP
void atomic_end(){
	__CPROVER_atomic_end();
}
Ejemplo n.º 6
0
                                         void main() {
__CPROVER_atomic_begin();                  mtx = 0;                                                               __CPROVER_atomic_end();
__CPROVER_atomic_begin();                  want_mtx = 0;                                                          __CPROVER_atomic_end();
__CPROVER_atomic_begin();                  sem = 1;                                                               __CPROVER_atomic_end();
__CPROVER_atomic_begin();                  want_sem = 0;                                                          __CPROVER_atomic_end();
__CPROVER_atomic_begin();                  state = 0;                                                             __CPROVER_atomic_end();
__CPROVER_atomic_begin();                  vm_consistent = 1;                                                     __CPROVER_atomic_end();
                                           __CPROVER_ASYNC_1: mmap_thread();
                                           __CPROVER_ASYNC_1: ioctl_thread();
                                           __CPROVER_ASYNC_1: rw_thread();
                                           __CPROVER_assume(__mmap_thread_finished == 1); __assume_dummy=0;
                                           __CPROVER_assume(__rw_thread_finished == 1); __assume_dummy=0;
                                           __CPROVER_assume(__ioctl_thread_finished == 1); __assume_dummy=0;
                                           assert(0);
                                         }
Ejemplo n.º 7
0
void lock(){
  __CPROVER_atomic_begin();
  __CPROVER_assume(_lock==0);
  _lock = 1;
  __CPROVER_atomic_end();
};