Subversion Repositories HelenOS

Rev

Rev 2030 | Rev 2042 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2030 Rev 2039
Line 54... Line 54...
54
#include <debug.h>
54
#include <debug.h>
55
#include <symtab.h>
55
#include <symtab.h>
56
#include <cpu.h>
56
#include <cpu.h>
57
#include <mm/tlb.h>
57
#include <mm/tlb.h>
58
#include <arch/mm/tlb.h>
58
#include <arch/mm/tlb.h>
-
 
59
#include <mm/as.h>
59
#include <mm/frame.h>
60
#include <mm/frame.h>
60
#include <main/version.h>
61
#include <main/version.h>
61
#include <mm/slab.h>
62
#include <mm/slab.h>
62
#include <proc/scheduler.h>
63
#include <proc/scheduler.h>
63
#include <proc/thread.h>
64
#include <proc/thread.h>
Line 856... Line 857...
856
   
857
   
857
    printf("*\t\tRun all safe tests\n");
858
    printf("*\t\tRun all safe tests\n");
858
    return 1;
859
    return 1;
859
}
860
}
860
 
861
 
861
static bool run_test(const test_t * test)
862
static void test_wrapper(void *arg)
862
{
863
{
863
    printf("%s\t\t%s\n", test->name, test->desc);
864
    test_t *test = (test_t *) arg;
864
   
865
   
865
    /* Update and read thread accounting
866
    /* Update and read thread accounting
866
       for benchmarking */
867
       for benchmarking */
867
    ipl_t ipl = interrupts_disable();
868
    ipl_t ipl = interrupts_disable();
868
    spinlock_lock(&THREAD->lock);
869
    spinlock_lock(&TASK->lock);
869
    thread_update_accounting();
870
    uint64_t t0 = task_get_accounting(TASK);
870
    uint64_t t0 = THREAD->cycles;
-
 
871
    spinlock_unlock(&THREAD->lock);
871
    spinlock_unlock(&TASK->lock);
872
    interrupts_restore(ipl);
872
    interrupts_restore(ipl);
873
   
873
   
874
    /* Execute the test */
874
    /* Execute the test */
875
    char * ret = test->entry();
875
    char * ret = test->entry();
876
   
876
   
877
    /* Update and read thread accounting */
877
    /* Update and read thread accounting */
878
    ipl = interrupts_disable();
878
    ipl = interrupts_disable();
879
    spinlock_lock(&THREAD->lock);
879
    spinlock_lock(&TASK->lock);
880
    thread_update_accounting();
-
 
881
    uint64_t dt = THREAD->cycles - t0;
880
    uint64_t dt = task_get_accounting(TASK) - t0;
882
    spinlock_unlock(&THREAD->lock);
881
    spinlock_unlock(&TASK->lock);
883
    interrupts_restore(ipl);
882
    interrupts_restore(ipl);
884
   
883
   
885
    printf("Time: %llu cycles\n", dt);
884
    printf("Time: %llu cycles\n", dt);
886
   
885
   
887
    if (ret == NULL) {
886
    if (ret == NULL) {
888
        printf("Test passed\n");
887
        printf("Test passed\n");
889
        return true;
888
//      return true;
-
 
889
        return;
890
    }
890
    }
891
 
891
 
892
    printf("%s\n", ret);
892
    printf("%s\n", ret);
-
 
893
//  return false;
-
 
894
}
-
 
895
 
-
 
896
static bool run_test(const test_t *test)
-
 
897
{
-
 
898
    printf("%s\t\t%s\n", test->name, test->desc);
-
 
899
   
-
 
900
    /* Create separate task and thread
-
 
901
       for the test */
-
 
902
    task_t *ta = task_create(AS_KERNEL, "test");
-
 
903
    if (ta == NULL) {
-
 
904
        printf("Unable to create test task\n");
893
    return false;
905
        return false;
-
 
906
    }
-
 
907
   
-
 
908
    thread_t *t = thread_create(test_wrapper, (void *) test, ta, 0, "test_main");
-
 
909
    if (t == NULL) {
-
 
910
        printf("Unable to create test main thread\n");
-
 
911
        task_destroy(ta);
-
 
912
        return false;
-
 
913
    }
-
 
914
   
-
 
915
    /* Run the test */
-
 
916
    thread_ready(t);
-
 
917
    thread_join(t);
-
 
918
    thread_detach(t);
-
 
919
   
-
 
920
    return true;
894
}
921
}
895
 
922
 
896
/** Command for returning kernel tests
923
/** Command for returning kernel tests
897
 *
924
 *
898
 * @param argv Argument vector.
925
 * @param argv Argument vector.