From owner-p4-projects@FreeBSD.ORG Sun Mar 17 13:45:38 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 317BBB4F; Sun, 17 Mar 2013 13:45:38 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id E3F0BB4D for ; Sun, 17 Mar 2013 13:45:37 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id D414A1EB for ; Sun, 17 Mar 2013 13:45:37 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HDjbuE056663 for ; Sun, 17 Mar 2013 13:45:37 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HDjb7P056659 for perforce@freebsd.org; Sun, 17 Mar 2013 13:45:37 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sun, 17 Mar 2013 13:45:37 GMT Message-Id: <201303171345.r2HDjb7P056659@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222967 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Mar 2013 13:45:38 -0000 http://p4web.freebsd.org/@@222967?ac=10 Change 222967 by rwatson@rwatson_cinnamon on 2013/03/17 13:45:03 Associate a tesla_store instance with each kernel thread; in the future we might want to use TSD instead. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/sys/proc.h#2 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/sys/proc.h#2 (text+ko) ==== @@ -171,6 +171,7 @@ struct sbuf; struct sleepqueue; struct td_sched; +struct tesla_store; struct thread; struct trapframe; struct turnstile; @@ -317,6 +318,7 @@ struct proc *td_rfppwait_p; /* (k) The vforked child */ struct vm_page **td_ma; /* (k) uio pages held */ int td_ma_cnt; /* (k) size of *td_ma */ + struct tesla_store *td_tesla; /* (k) TESLA per-thread state */ }; struct mtx *thread_lock_block(struct thread *); From owner-p4-projects@FreeBSD.ORG Sun Mar 17 13:49:42 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id B4843D09; Sun, 17 Mar 2013 13:49:42 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 76900D07 for ; Sun, 17 Mar 2013 13:49:42 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 661F220E for ; Sun, 17 Mar 2013 13:49:42 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HDngBo056804 for ; Sun, 17 Mar 2013 13:49:42 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HDngA0056801 for perforce@freebsd.org; Sun, 17 Mar 2013 13:49:42 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sun, 17 Mar 2013 13:49:42 GMT Message-Id: <201303171349.r2HDngA0056801@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222968 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Mar 2013 13:49:42 -0000 http://p4web.freebsd.org/@@222968?ac=10 Change 222968 by rwatson@rwatson_cinnamon on 2013/03/17 13:48:44 Various header and definition fixes to allow increasing amounts of libtesla to compile in the FreeBSD kernel. Primarily, this consited of adding missing includes, and preventing inclusion of specific headers (e.g., stdio) when _KERNEL. There was also a syntax issue with assertions, which is not tested with the userspace version of libtesla and may require further refinement. Now comes the harder bit. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/debug.c#2 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/key.c#2 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/libtesla.h#2 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#2 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#2 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#2 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/debug.c#2 (text+ko) ==== @@ -32,7 +32,10 @@ */ #include "tesla_internal.h" + +#ifndef _KERNEL #include +#endif char* transition_matrix(const struct tesla_transitions *trans) ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/key.c#2 (text+ko) ==== @@ -32,8 +32,10 @@ #include "tesla_internal.h" +#ifndef _KERNEL #include #include +#endif #define IS_SET(mask, index) (mask & (1 << index)) ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/libtesla.h#2 (text+ko) ==== @@ -34,7 +34,11 @@ #ifndef _TESLA_STATE #define _TESLA_STATE +#ifdef _KERNEL +#include +#else #include /* int32_t, uint32_t */ +#endif /* * libtesla functions mostly return error values, and therefore return ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#2 (text+ko) ==== @@ -33,11 +33,11 @@ #include "tesla_internal.h" +#ifdef _KERNEL +MALLOC_DEFINE(M_TESLA, "tesla", "TESLA internal state"); +#else #include #include - -#ifdef _KERNEL -MALLOC_DEFINE(M_TESLA, "tesla", "TESLA internal state"); #endif @@ -135,7 +135,7 @@ struct tesla_table *ttp = tclass->ts_table; assert(ttp != NULL); - tesla_assert(ttp->tt_length != 0, "Uninitialized tesla_table"); + tesla_assert(ttp->tt_length != 0, ("Uninitialized tesla_table")); if (ttp->tt_free == 0) return (TESLA_ERROR_ENOMEM); @@ -154,7 +154,7 @@ break; } - tesla_assert(*out != NULL, "no free instances but tt_free was > 0"); + tesla_assert(*out != NULL, ("no free instances but tt_free was > 0")); return (TESLA_SUCCESS); } ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#2 (text+ko) ==== @@ -36,21 +36,26 @@ #ifdef _KERNEL #include "opt_kdb.h" #include +#include #include #include #include #include #include +#include +#include #include + +#include #else #include #include #include #include #include -#endif #include +#endif //! Is @ref x a subset of @ref y? #define SUBSET(x,y) ((x & y) == x) @@ -98,8 +103,13 @@ #define __debug +#ifdef _KERNEL +#include +#define DEBUG_PRINT(...) printf(__VA_ARGS__) +#else #include #define DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__) +#endif #define VERBOSE_PRINT(...) if (verbose_debug()) DEBUG_PRINT(__VA_ARGS__) /** Are we in (verbose) debug mode? */ @@ -127,7 +137,7 @@ #define tesla_assert(...) KASSERT(__VA_ARGS__) /** Emulate simple POSIX assertions. */ -#define assert(cond) KASSERT(cond, "Assertion failed: '" # cond "'") +#define assert(cond) KASSERT((cond), ("Assertion failed: '%s'", #cond)) #define tesla_malloc(len) malloc(len, M_TESLA, M_WAITOK | M_ZERO) #define tesla_free(x) free(x, M_TESLA) ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#2 (text+ko) ==== @@ -32,8 +32,10 @@ #include "tesla_internal.h" +#ifndef _KERNEL #include #include +#endif #define CHECK(fn, ...) do { \ int err = fn(__VA_ARGS__); \ From owner-p4-projects@FreeBSD.ORG Sun Mar 17 15:08:09 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 331C387A; Sun, 17 Mar 2013 15:08:09 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id E4ADB877 for ; Sun, 17 Mar 2013 15:08:08 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id C728F683 for ; Sun, 17 Mar 2013 15:08:08 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HF87DO064131 for ; Sun, 17 Mar 2013 15:08:07 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HF87Em064127 for perforce@freebsd.org; Sun, 17 Mar 2013 15:08:07 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sun, 17 Mar 2013 15:08:07 GMT Message-Id: <201303171508.r2HF87Em064127@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222971 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Mar 2013 15:08:09 -0000 http://p4web.freebsd.org/@@222971?ac=10 Change 222971 by rwatson@rwatson_cinnamon on 2013/03/17 15:07:08 Insert TESLA initialisation in the boot order after event handlers, but before as much else as possible. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/sys/kernel.h#2 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/sys/kernel.h#2 (text+ko) ==== @@ -100,6 +100,7 @@ SI_SUB_MTX_POOL_DYNAMIC = 0x1AC0000, /* dynamic mutex pool */ SI_SUB_LOCK = 0x1B00000, /* various locks */ SI_SUB_EVENTHANDLER = 0x1C00000, /* eventhandler init */ + SI_SUB_TESLA = 0x1C80000, /* TESLA debugging */ SI_SUB_VNET_PRELINK = 0x1E00000, /* vnet init before modules */ SI_SUB_KLD = 0x2000000, /* KLD and module setup */ SI_SUB_CPU = 0x2100000, /* CPU resource(s)*/ From owner-p4-projects@FreeBSD.ORG Sun Mar 17 15:08:09 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6F433951; Sun, 17 Mar 2013 15:08:09 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id E5CFE878 for ; Sun, 17 Mar 2013 15:08:08 +0000 (UTC) (envelope-from jonathan@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id C7D34684 for ; Sun, 17 Mar 2013 15:08:08 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HF88SL064137 for ; Sun, 17 Mar 2013 15:08:08 GMT (envelope-from jonathan@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HF8888064134 for perforce@freebsd.org; Sun, 17 Mar 2013 15:08:08 GMT (envelope-from jonathan@freebsd.org) Date: Sun, 17 Mar 2013 15:08:08 GMT Message-Id: <201303171508.r2HF8888064134@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jonathan@freebsd.org using -f From: Jonathan Anderson Subject: PERFORCE change 222972 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Mar 2013 15:08:09 -0000 http://p4web.freebsd.org/@@222972?ac=10 Change 222972 by jonathan@jonathan-on-joe on 2013/03/17 15:07:32 Pull in updates from libtesla's GitHub. Affected files ... .. //depot/projects/ctsrd/tesla/src/lib/libtesla/debug.c#2 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/libtesla.h#2 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/state-global.c#2 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/state-perthread.c#2 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/state.c#2 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/store.c#2 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_internal.h#2 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/update.c#3 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/util.c#3 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/debug.c#2 (text+ko) ==== @@ -1,6 +1,6 @@ -/** @file tesla_debug.c Debugging helpers for TESLA state. */ +/** @file debug.c Debugging helpers for TESLA state. */ /*- - * Copyright (c) 2012 Jonathan Anderson + * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. * * This software was developed by SRI International and the University of @@ -34,6 +34,11 @@ #include "tesla_internal.h" #include +#define SAFE_SPRINTF(dest, end, ...) \ + dest += snprintf(dest, end - dest, __VA_ARGS__); \ + if (dest >= end) \ + return (TESLA_ERROR_ENOMEM); + char* transition_matrix(const struct tesla_transitions *trans) { @@ -56,6 +61,27 @@ return buffer; } +int +key_string(char *buffer, size_t len, const struct tesla_key *key) +{ + char *current = buffer; + const char *end = buffer + len; + + SAFE_SPRINTF(current, end, "0x%tx [ ", key->tk_mask); + + for (int32_t i = 0; i < TESLA_KEY_SIZE; i++) { + if (key->tk_mask & (1 << i)) { + SAFE_SPRINTF(current, end, "%tx ", key->tk_keys[i]); + } else { + SAFE_SPRINTF(current, end, "X "); + } + } + + SAFE_SPRINTF(current, end, "]"); + + return (TESLA_SUCCESS); +} + #ifndef NDEBUG #define print DEBUG_PRINT @@ -133,17 +159,13 @@ void print_key(const struct tesla_key *key) { - print("0x%tx [ ", key->tk_mask); + static const size_t LEN = 15 * TESLA_KEY_SIZE + 10; + char buffer[LEN]; - for (int32_t i = 0; i < TESLA_KEY_SIZE; i++) { - if (key->tk_mask & (1 << i)) { - print("%tx ", key->tk_keys[i]); - } else { - print("X "); - } - } + int err = key_string(buffer, LEN, key); + assert(err == TESLA_SUCCESS); - print("]"); + printf("%s", buffer); } #endif /* !NDEBUG */ ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/libtesla.h#2 (text+ko) ==== @@ -118,6 +118,8 @@ int32_t tesla_store_reset(struct tesla_store *store); +/** Clean up a @ref tesla_store. */ +void tesla_store_free(struct tesla_store*); /** * A description of a TESLA automaton, which may be instantiated a number of ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/state-global.c#2 (text+ko) ==== @@ -1,5 +1,6 @@ /*- * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. * * This software was developed by SRI International and the University of ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/state-perthread.c#2 (text+ko) ==== @@ -1,5 +1,6 @@ /*- * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. * * This software was developed by SRI International and the University of ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/state.c#2 (text+ko) ==== @@ -1,6 +1,7 @@ /*- * Copyright (c) 2011 Robert N. M. Watson * Copyright (c) 2011 Anil Madhavapeddy + * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. * * This software was developed by SRI International and the University of @@ -80,6 +81,14 @@ } +void +tesla_class_free(struct tesla_class *class) +{ + free(class->ts_table); + free(class); +} + + int tesla_match(struct tesla_class *tclass, const struct tesla_key *pattern, struct tesla_instance **array, uint32_t *size) @@ -202,6 +211,53 @@ } void +tesla_match_fail(struct tesla_class *class, const struct tesla_key *key, + const struct tesla_transitions *trans) +{ + assert(class !=NULL); + + if (class->ts_handler != NULL) { + class->ts_handler(NULL); + return; + } + + static const char *message = + "TESLA failure in automaton '%s':\n%s\n\n" + "no instance found to match key '%s' for transition(s) %s"; + + // Assume a pretty big key... + static const size_t LEN = 160; + char key_str[LEN]; + int err = key_string(key_str, LEN, key); + assert(err == TESLA_SUCCESS); + + char *trans_str = transition_matrix(trans); + + switch (class->ts_action) { + case TESLA_ACTION_FAILSTOP: + tesla_panic(message, class->ts_name, class->ts_description, + key_str, trans_str); + break; + +#ifdef NOTYET + case TESLA_ACTION_DTRACE: + dtrace_probe(...); + return; +#endif + + case TESLA_ACTION_PRINTF: +#if defined(_KERNEL) && defined(KDB) + kdb_backtrace(); +#endif + printf(message, class->ts_name, class->ts_description, + key_str, trans_str); + break; + } + + free(trans_str); +} + +void tesla_assert_fail(struct tesla_class *tsp, struct tesla_instance *tip, const struct tesla_transitions *trans) { @@ -216,11 +272,11 @@ switch (tsp->ts_action) { case TESLA_ACTION_FAILSTOP: tesla_panic( - "tesla_assert_failed: " - "unable to move '%s' from state %d" - " according to transition matrix %s", - tsp->ts_name, tip->ti_state, - transition_matrix(trans)); + "TESLA failure; in automaton '%s':\n%s\n\n" + "required to take a transition in %s " + "but currently in state %d", + tsp->ts_name, tsp->ts_description, + transition_matrix(trans), tip->ti_state); break; /* A bit gratuitous. */ #ifdef NOTYET case TESLA_ACTION_DTRACE: ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/store.c#2 (text+ko) ==== @@ -126,6 +126,16 @@ } +void +tesla_store_free(tesla_store *store) +{ + for (uint32_t i = 0; i < store->length; i++) + tesla_class_free(store->classes + i); + + free(store); +} + + int32_t tesla_class_get(tesla_store *store, uint32_t id, tesla_class **tclassp, const char *name, const char *description) ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_internal.h#2 (text+ko) ==== @@ -58,7 +58,12 @@ /** * Call this if things go catastrophically, unrecoverably wrong. */ -void tesla_die(char *message) __attribute__((noreturn)); +void tesla_die(const char *event) __attribute__((noreturn)); + +/** + * Clean up a @ref tesla_class. + */ +void tesla_class_free(struct tesla_class*); /** * Create a new @ref tesla_instance. @@ -99,7 +104,7 @@ #define __debug #include -#define DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__) +#define DEBUG_PRINT(...) printf(__VA_ARGS__) #define VERBOSE_PRINT(...) if (verbose_debug()) DEBUG_PRINT(__VA_ARGS__) /** Are we in (verbose) debug mode? */ @@ -116,6 +121,13 @@ #endif +#ifndef __unused +#if __has_attribute(unused) +#define __unused __attribute__((unused)) +#else +#define __unused +#endif +#endif // Kernel vs userspace implementation details. #ifdef _KERNEL @@ -217,6 +229,9 @@ int tesla_class_init(struct tesla_class*, uint32_t context, uint32_t instances); +//! We have failed to find an instance that matches a @ref tesla_key. +void tesla_match_fail(struct tesla_class*, const struct tesla_key*, + const struct tesla_transitions*); /* * When the assertion fails, what to do? @@ -260,6 +275,9 @@ */ void assert_instanceof(struct tesla_instance *i, struct tesla_class *tclass); +/** Print a key into a buffer. */ +int key_string(char *buffer, size_t len, const struct tesla_key *key); + /** Print a @ref tesla_key to stderr. */ void print_key(const struct tesla_key *key); ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/update.c#3 (text+ko) ==== @@ -84,69 +84,90 @@ assert(table->tt_length <= 32); + // Did we match any instances? + bool matched_something = false; + + // Make space for cloning existing instances. + tesla_instance clones[table->tt_free]; + size_t cloned = 0; + // Update existing instances, forking/specialising if necessary. for (uint32_t i = 0; i < table->tt_length; i++) { tesla_instance *inst = table->tt_instances + i; if (!tesla_instance_active(inst)) continue; - bool failure = false; + // Is this instance required to take a transition? + bool transition_required = false; + + // Has this instance actually taken a transition? + bool transition_taken = false; + for (uint32_t j = 0; j < trans->length; j++) { tesla_transition *t = trans->transitions + j; + const tesla_key *k = &inst->ti_key; // Check whether or not the instance matches the // provided key, masked by what the transition says to // expect from its 'previous' state. - tesla_key pattern = *key; - pattern.tk_mask &= t->mask; + tesla_key masked = *key; + masked.tk_mask &= t->mask; - if (!tesla_key_matches(&pattern, &inst->ti_key)) + if (!tesla_key_matches(&masked, k)) continue; - tesla_key *k = &inst->ti_key; - if (!t->fork && (k->tk_mask != pattern.tk_mask)) - continue; + if (inst->ti_state != t->from) { + // If the instance matches everything but the + // state, so there had better be a transition + // somewhere in 'trans' that can be taken! + if (k->tk_mask == masked.tk_mask) + transition_required = true; - // At this point, predjudice attaches: the instance - // matches a pattern in all ways that matter, so if - // it's not in the expected state, there had better - // be a successful transition somewhere in 'trans' - // that can be taken. - if (inst->ti_state != t->from) { - failure = true; continue; } + // The match has succeeded: we are either going to + // update or clone an existing state. + transition_taken = true; + matched_something = true; + // If the keys just match (and we haven't been explictly // instructed to fork), just update the state. - if (!t->fork - && SUBSET(key->tk_mask, k->tk_mask)) { + if (!t->fork && key->tk_mask == k->tk_mask) { VERBOSE_PRINT("update %td: %tx->%tx\n", inst - start, t->from, t->to); inst->ti_state = t->to; - failure = false; break; } // If the keys weren't an exact match, we need to fork // a new (more specific) automaton instance. - struct tesla_instance *copy; - CHECK(tesla_clone, class, inst, ©); - VERBOSE_PRINT("clone %td:%tx -> %td:%tx\n", + struct tesla_instance *clone = clones + cloned++; + *clone = *inst; + clone->ti_state = t->to; + + VERBOSE_PRINT("clone %td:%tx -> %tx\n", inst - start, inst->ti_state, - copy - start, t->to); + t->to); - CHECK(tesla_key_union, ©->ti_key, key); - copy->ti_state = t->to; - failure = false; + CHECK(tesla_key_union, &clone->ti_key, key); break; } - if (failure) + if (transition_required && !transition_taken) tesla_assert_fail(class, inst, trans); } + // Move any clones into the instance. + for (size_t i = 0; i < cloned; i++) { + struct tesla_instance *clone = clones + i; + struct tesla_instance *copied_in_place; + + CHECK(tesla_clone, class, clone, &copied_in_place); + } + + // If there is a (0 -> anything) transition, create a new instance. for (uint32_t i = 0; i < trans->length; i++) { const tesla_transition *t = trans->transitions + i; @@ -157,6 +178,7 @@ CHECK(tesla_instance_new, class, key, t->to, &inst); assert(tesla_instance_active(inst)); + matched_something = true; VERBOSE_PRINT("new %td: %tx\n", inst - start, inst->ti_state); } @@ -167,6 +189,9 @@ DEBUG_PRINT("\n====\n\n"); } + if (!matched_something) + tesla_match_fail(class, key, trans); + tesla_class_put(class); return (TESLA_SUCCESS); ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/util.c#3 (text+ko) ==== @@ -1,5 +1,6 @@ /*- * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. * * This software was developed by SRI International and the University of @@ -34,9 +35,9 @@ void -tesla_die(char *message) +tesla_die(const char *event) { - tesla_panic("tesla_die: '%s'\n", message); + tesla_panic("tesla_die: fatal error in event '%s'\n", event); } const char * From owner-p4-projects@FreeBSD.ORG Sun Mar 17 15:14:15 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5F551E8B; Sun, 17 Mar 2013 15:14:15 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 21273E89 for ; Sun, 17 Mar 2013 15:14:15 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id E950F6DA for ; Sun, 17 Mar 2013 15:14:14 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HFEE4R065763 for ; Sun, 17 Mar 2013 15:14:14 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HFEEqZ065760 for perforce@freebsd.org; Sun, 17 Mar 2013 15:14:14 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sun, 17 Mar 2013 15:14:14 GMT Message-Id: <201303171514.r2HFEEqZ065760@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222974 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Mar 2013 15:14:15 -0000 http://p4web.freebsd.org/@@222974?ac=10 Change 222974 by rwatson@rwatson_cinnamon on 2013/03/17 15:13:24 A number of changes to libtesla to get it compiling (but not yet running) in the kernel runtime environment: - Remove a large chunk of code that supported dynamic registration of new automata classes at runtime; this was left over from a previous iteration, and the new version of tesla doesn't support this yet. - Use tesla_store_init() to set up per-thread TESLA state, requiring that this be non-static. We require a not-yet-present tesla_store_destroy(), which will arrive in the next merge of libtesla to the kernel (thanks Jon!). - Expose global_store to _KERNEL; this should probably be static but isn't yet. - Use #define's for hard-coded class and instance count maxima, rather than numbers in code. This is pertinent because we will initialise per-thread storage in quite a different place in the kernel, so as to avoid malloc() at arbitrary instrumentation points. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#2 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/store.c#2 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#3 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#3 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#2 (text+ko) ==== @@ -48,259 +48,50 @@ #ifdef _KERNEL /* - * Global state used to manage per-thread storage slots for TESLA per-thread - * assertions. tspd_tesla_classp is non-NULL when a slot has been allocated. - */ -static struct tesla_class_perthread_desc { - struct tesla_class *tspd_tesla_classp; - size_t tspd_len; -} tesla_class_perthread_desc[TESLA_PERTHREAD_MAX]; -static struct sx tesla_class_perthread_sx; - -/* * Registration state for per-thread storage. */ -static eventhandler_tag tesla_class_perthread_ctor_tag; -static eventhandler_tag tesla_class_perthread_dtor_tag; +static eventhandler_tag tesla_perthread_ctor_tag; +static eventhandler_tag tesla_perthread_dtor_tag; static void -tesla_class_perthread_ctor(__unused void *arg, struct thread *td) +tesla_perthread_ctor(__unused void *arg, struct thread *td) { - struct tesla_class_perthread_desc *tspdp; - struct tesla_class *tsp; - struct tesla_table *ttp; - u_int index; + struct tesla_store *store; + uint32_t error; - sx_slock(&tesla_class_perthread_sx); - for (index = 0; index < TESLA_PERTHREAD_MAX; index++) { - tspdp = &tesla_class_perthread_desc[index]; - tsp = tspdp->tspd_tesla_classp; - if (tsp == NULL) { - td->td_tesla[index] = NULL; - continue; - } - ttp = malloc(tspdp->tspd_len, M_TESLA, M_WAITOK | M_ZERO); - ttp->tt_length = tsp->ts_limit; - ttp->tt_free = tsp->ts_limit; - td->td_tesla[index] = ttp; - } - sx_sunlock(&tesla_class_perthread_sx); + store = tesla_malloc(sizeof(*store)); + error = tesla_store_init(store, TESLA_SCOPE_PERTHREAD, + TESLA_MAX_CLASSES, TESLA_MAX_INSTANCES); + tesla_assert(error == TESLA_SUCCESS, ("tesla_store_init failed")); + curthread->td_tesla = store; } static void -tesla_class_perthread_dtor_locked(struct thread *td) +tesla_perthread_dtor(struct thread *td) { - u_int index; + struct tesla_store *store; - sx_assert(&tesla_class_perthread_sx, SX_LOCKED); - for (index = 0; index < TESLA_PERTHREAD_MAX; index++) { - if (td->td_tesla[index] == NULL) - continue; - free(M_TESLA, td->td_tesla[index]); - td->td_tesla[index] = NULL; - } + store = curthread->td_tesla; + curthread->td_tesla = NULL; + tesla_store_destroy(store); + tesla_free(store); } static void -tesla_class_perthread_dtor(__unused void *arg, struct thread *td) +tesla_perthread_sysinit(__unused void *arg) { - sx_slock(&tesla_class_perthread_sx); - tesla_class_perthread_dtor_locked(td); - sx_sunlock(&tesla_class_perthread_sx); + tesla_perthread_ctor_tag = EVENTHANDLER_REGISTER(thread_ctor, + tesla_perthread_ctor, NULL, EVENTHANDLER_PRI_ANY); + tesla_perthread_dtor_tag = EVENTHANDLER_REGISTER(thread_dtor, + tesla_perthread_dtor, NULL, EVENTHANDLER_PRI_ANY); } +SYSINIT(tesla_perthread, SI_SUB_TESLA, SI_ORDER_FIRST, + tesla_perthread_sysinit, NULL); -static void -tesla_class_perthread_sysinit(__unused void *arg) -{ +#endif /* !_KERNEL */ - sx_init(&tesla_class_perthread_sx, "tesla_class_perthread_sx"); - tesla_class_perthread_ctor_tag = EVENTHANDLER_REGISTER(thread_ctor, - tesla_class_perthread_ctor, NULL, EVENTHANDLER_PRI_ANY); - tesla_class_perthread_dtor_tag = EVENTHANDLER_REGISTER(thread_dtor, - tesla_class_perthread_dtor, NULL, EVENTHANDLER_PRI_ANY); -} -SYSINIT(tesla_class_perthread, SI_SUB_TESLA, SI_ORDER_FIRST, - tesla_class_perthread_sysinit, NULL); - -static void -tesla_class_perthread_sysuninit(__unused void *arg) -{ - struct proc *p; - struct thread *td; - - /* - * XXXRW: Possibility of a race for in-flight handlers and - * instrumentation? - */ - EVENTHANDLER_DEREGISTER(tesla_class_perthread_ctor, - tesla_class_perthread_ctor_tag); - EVENTHANDLER_DEREGISTER(tesla_class_perthread_dtor, - tesla_class_perthread_dtor_tag); - - sx_xlock(&allproc_lock); - sx_xlock(&tesla_class_perthread_sx); - FOREACH_PROC_IN_SYSTEM(p) { - PROC_LOCK(p); - FOREACH_THREAD_IN_PROC(p, td) { - tesla_class_perthread_dtor_locked(td); - } - PROC_UNLOCK(p); - } - sx_xunlock(&tesla_class_perthread_sx); - sx_xunlock(&allproc_lock); - sx_destroy(&tesla_class_perthread_sx); -} -SYSUNINIT(tesla_class_perthread, SI_SUB_TESLA, SI_ORDER_FIRST, - tesla_class_perthread_sysuninit, NULL); - int -tesla_class_perthread_new(struct tesla_class *tsp) -{ - struct tesla_class_perthread_desc *tspdp; - struct tesla_table *ttp; - struct proc *p; - struct thread *td; - int looped; - u_int index; - - /* - * First, allocate a TESLA per-thread storage slot, if available. - */ - tspdp = NULL; - sx_xlock(&tesla_class_perthread_sx); - for (index = 0; index < TESLA_PERTHREAD_MAX; index++) { - if (tesla_class_perthread_desc[index].tspd_tesla_classp - == NULL) { - tspdp = &tesla_class_perthread_desc[index]; - break; - } - } - if (tspdp == NULL) { - sx_xunlock(&tesla_class_perthread_sx); - return (TESLA_ERROR_ENOMEM); - } - tsp->ts_perthread_index = index; - tspdp->tspd_tesla_classp = tsp; - tspdp->tspd_len = sizeof(*ttp) + sizeof(struct tesla_instance) * - tsp->ts_limit; - - /* - * Walk all existing threads and add required allocations. If we - * can't allocate under the process lock, we have to loop out, use - * M_WAITOK, and then repeat. This looks starvation-prone, but - * actually isn't: holding tesla_class_perthread_sx blocks further - * thread allocations from taking place, so the main concern is - * in-progress allocations, which will be bounded in number. - */ - ttp = NULL; - looped = 0; - sx_slock(&allproc_lock); - FOREACH_PROC_IN_SYSTEM(p) { -loop: - if (looped) { - KASSERT(ttp == NULL, - ("tesla_class_perthread_new: ttp not NULL")); - ttp = malloc(tspdp->tspd_len, M_TESLA, - M_WAITOK | M_ZERO); - looped = 0; - } - PROC_LOCK(p); - FOREACH_THREAD_IN_PROC(p, td) { - /* - * If we looped, then some threads may already have - * memory; skip them. - */ - if (td->td_tesla[index] != NULL) - continue; - if (ttp == NULL) - ttp = malloc(tspdp->tspd_len, M_TESLA, - M_NOWAIT | M_ZERO); - if (ttp == NULL) { - PROC_UNLOCK(p); - looped = 1; - goto loop; - } - ttp->tt_length = tsp->ts_limit; - ttp->tt_free = tsp->ts_limit; - td->td_tesla[index] = ttp; - ttp = NULL; - } - PROC_UNLOCK(p); - } - sx_sunlock(&allproc_lock); - /* Due to races, we may have allocated an extra, so free it now. */ - if (ttp != NULL) - free(ttp, M_TESLA); - sx_xunlock(&tesla_class_perthread_sx); - return (TESLA_SUCCESS); -} - -void -tesla_class_perthread_destroy(struct tesla_class *tsp) -{ - struct tesla_class_perthread_desc *tspdp; - struct proc *p; - struct thread *td; - u_int index; - - sx_xlock(&tesla_class_perthread_sx); - index = tsp->ts_perthread_index; - tspdp = &tesla_class_perthread_desc[index]; - - /* - * First, walk all threads and release resources. This is easier on - * free than alloc due to the non-blocking nature of free. - * - * XXXRW: Do we need a test for td->td_tesla[index] == NULL and a - * continue? I think probably not. - */ - sx_slock(&allproc_lock); - FOREACH_PROC_IN_SYSTEM(p) { - PROC_LOCK(p); - FOREACH_THREAD_IN_PROC(p, td) { - free(M_TESLA, td->td_tesla[index]); - td->td_tesla[index] = NULL; - } - PROC_UNLOCK(p); - } - sx_unlock(&allproc_lock); - - /* - * Finally, release the reservation. - */ - tspdp->tspd_tesla_classp = NULL; - tspdp->tspd_len = 0; - sx_xunlock(&tesla_class_perthread_sx); -} - -void -tesla_class_perthread_flush(struct tesla_class *tsp) -{ - struct tesla_table *ttp; - - ttp = curthread->td_tesla[tsp->ts_perthread_index]; - bzero(&ttp->tt_instances, - sizeof(struct tesla_instance) * ttp->tt_length); - ttp->tt_free = ttp->tt_length; -} - -int -tesla_class_perthread_gettable(struct tesla_class *tsp, - struct tesla_table **ttpp) -{ - struct tesla_table *ttp; - - ttp = curthread->td_tesla[tsp->ts_perthread_index]; - KASSERT(ttp != NULL, - ("tesla_class_perthread_gettable: NULL tesla thread state")); - *ttpp = ttp; - return (TESLA_SUCCESS); -} - -#else /* !_KERNEL */ - -int tesla_class_perthread_postinit(__unused struct tesla_class *c) { return 0; @@ -320,5 +111,3 @@ tesla_class_perthread_destroy(__unused struct tesla_class *c) { } - -#endif /* _KERNEL */ ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/store.c#2 (text+ko) ==== @@ -38,17 +38,14 @@ #ifndef _KERNEL #include -struct tesla_store global_store = { .length = 0 }; - /** The pthreads key used to identify TESLA data. */ pthread_key_t pthread_key(void); #endif +struct tesla_store global_store = { .length = 0 }; + static void tesla_class_acquire(tesla_class*); -static int tesla_store_init(tesla_store*, - uint32_t context, uint32_t classes, uint32_t instances); - int32_t tesla_store_get(uint32_t context, uint32_t classes, uint32_t instances, tesla_store* *storep) @@ -101,7 +98,7 @@ } -static int32_t +int32_t tesla_store_init(tesla_store *store, uint32_t context, uint32_t classes, uint32_t instances) { ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#3 (text+ko) ==== @@ -221,12 +221,26 @@ }; /** + * Initialise @ref tesla_store internals. + * Locking is the responsibility of the caller. + */ +int tesla_store_init(tesla_store*, uint32_t context, uint32_t classes, + uint32_t instances); +void tesla_store_destroy(tesla_store*); + +/** * Initialize @ref tesla_class internals. * Locking is the responsibility of the caller. */ int tesla_class_init(struct tesla_class*, uint32_t context, uint32_t instances); +/* + * XXXRW: temporarily, maximum number of classes and instances are hard-coded + * constants. In the future, this should somehow be more dynamic. + */ +#define TESLA_MAX_CLASSES 12 +#define TESLA_MAX_INSTANCES 8 /* * When the assertion fails, what to do? ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#3 (text+ko) ==== @@ -69,7 +69,8 @@ } struct tesla_store *store; - CHECK(tesla_store_get, tesla_context, 12, 8, &store); + CHECK(tesla_store_get, tesla_context, TESLA_MAX_CLASSES, + TESLA_MAX_INSTANCES, &store); VERBOSE_PRINT("store: 0x%tx", (intptr_t) store); VERBOSE_PRINT("\n----\n"); From owner-p4-projects@FreeBSD.ORG Sun Mar 17 21:17:52 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D633A5F6; Sun, 17 Mar 2013 21:17:52 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 73BA05F4 for ; Sun, 17 Mar 2013 21:17:52 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 62BA22C3 for ; Sun, 17 Mar 2013 21:17:52 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HLHqnD099921 for ; Sun, 17 Mar 2013 21:17:52 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HLHpvu099918 for perforce@freebsd.org; Sun, 17 Mar 2013 21:17:51 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sun, 17 Mar 2013 21:17:51 GMT Message-Id: <201303172117.r2HLHpvu099918@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222980 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Mar 2013 21:17:53 -0000 http://p4web.freebsd.org/@@222980?ac=10 Change 222980 by rwatson@rwatson_cinnamon on 2013/03/17 21:17:13 Merge more recent libtesla into the kernel version; in a few cases, make changes to either merge with incorrect expectations (e.g., tesla_store_destroy -> tesla_store_free), and to fix some problems in the imported version (e.g., free -> tesla_free). Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/debug.c#3 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/libtesla.h#3 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state-global.c#2 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#3 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#3 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/store.c#3 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#4 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#4 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/util.c#2 integrate Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/debug.c#3 (text+ko) ==== @@ -1,6 +1,6 @@ -/** @file tesla_debug.c Debugging helpers for TESLA state. */ +/** @file debug.c Debugging helpers for TESLA state. */ /*- - * Copyright (c) 2012 Jonathan Anderson + * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. * * This software was developed by SRI International and the University of @@ -37,6 +37,11 @@ #include #endif +#define SAFE_SPRINTF(dest, end, ...) \ + dest += snprintf(dest, end - dest, __VA_ARGS__); \ + if (dest >= end) \ + return (TESLA_ERROR_ENOMEM); + char* transition_matrix(const struct tesla_transitions *trans) { @@ -59,6 +64,27 @@ return buffer; } +int +key_string(char *buffer, size_t len, const struct tesla_key *key) +{ + char *current = buffer; + const char *end = buffer + len; + + SAFE_SPRINTF(current, end, "0x%tx [ ", key->tk_mask); + + for (int32_t i = 0; i < TESLA_KEY_SIZE; i++) { + if (key->tk_mask & (1 << i)) { + SAFE_SPRINTF(current, end, "%tx ", key->tk_keys[i]); + } else { + SAFE_SPRINTF(current, end, "X "); + } + } + + SAFE_SPRINTF(current, end, "]"); + + return (TESLA_SUCCESS); +} + #ifndef NDEBUG #define print DEBUG_PRINT @@ -136,17 +162,13 @@ void print_key(const struct tesla_key *key) { - print("0x%tx [ ", key->tk_mask); + static const size_t LEN = 15 * TESLA_KEY_SIZE + 10; + char buffer[LEN]; - for (int32_t i = 0; i < TESLA_KEY_SIZE; i++) { - if (key->tk_mask & (1 << i)) { - print("%tx ", key->tk_keys[i]); - } else { - print("X "); - } - } + int err = key_string(buffer, LEN, key); + assert(err == TESLA_SUCCESS); - print("]"); + printf("%s", buffer); } #endif /* !NDEBUG */ ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/libtesla.h#3 (text+ko) ==== @@ -122,6 +122,8 @@ int32_t tesla_store_reset(struct tesla_store *store); +/** Clean up a @ref tesla_store. */ +void tesla_store_free(struct tesla_store*); /** * A description of a TESLA automaton, which may be instantiated a number of ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state-global.c#2 (text+ko) ==== @@ -1,5 +1,6 @@ /*- * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. * * This software was developed by SRI International and the University of ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#3 (text+ko) ==== @@ -1,5 +1,6 @@ /*- * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. * * This software was developed by SRI International and the University of @@ -73,7 +74,7 @@ store = curthread->td_tesla; curthread->td_tesla = NULL; - tesla_store_destroy(store); + tesla_store_free(store); tesla_free(store); } ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#3 (text+ko) ==== @@ -1,6 +1,7 @@ /*- * Copyright (c) 2011 Robert N. M. Watson * Copyright (c) 2011 Anil Madhavapeddy + * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. * * This software was developed by SRI International and the University of @@ -80,6 +81,14 @@ } +void +tesla_class_free(struct tesla_class *class) +{ + tesla_free(class->ts_table); + tesla_free(class); +} + + int tesla_match(struct tesla_class *tclass, const struct tesla_key *pattern, struct tesla_instance **array, uint32_t *size) @@ -202,6 +211,53 @@ } void +tesla_match_fail(struct tesla_class *class, const struct tesla_key *key, + const struct tesla_transitions *trans) +{ + assert(class !=NULL); + + if (class->ts_handler != NULL) { + class->ts_handler(NULL); + return; + } + + static const char *message = + "TESLA failure in automaton '%s':\n%s\n\n" + "no instance found to match key '%s' for transition(s) %s"; + + // Assume a pretty big key... + static const size_t LEN = 160; + char key_str[LEN]; + int err = key_string(key_str, LEN, key); + assert(err == TESLA_SUCCESS); + + char *trans_str = transition_matrix(trans); + + switch (class->ts_action) { + case TESLA_ACTION_FAILSTOP: + tesla_panic(message, class->ts_name, class->ts_description, + key_str, trans_str); + break; + +#ifdef NOTYET + case TESLA_ACTION_DTRACE: + dtrace_probe(...); + return; +#endif + + case TESLA_ACTION_PRINTF: +#if defined(_KERNEL) && defined(KDB) + kdb_backtrace(); +#endif + printf(message, class->ts_name, class->ts_description, + key_str, trans_str); + break; + } + + tesla_free(trans_str); +} + +void tesla_assert_fail(struct tesla_class *tsp, struct tesla_instance *tip, const struct tesla_transitions *trans) { @@ -216,11 +272,11 @@ switch (tsp->ts_action) { case TESLA_ACTION_FAILSTOP: tesla_panic( - "tesla_assert_failed: " - "unable to move '%s' from state %d" - " according to transition matrix %s", - tsp->ts_name, tip->ti_state, - transition_matrix(trans)); + "TESLA failure; in automaton '%s':\n%s\n\n" + "required to take a transition in %s " + "but currently in state %d", + tsp->ts_name, tsp->ts_description, + transition_matrix(trans), tip->ti_state); break; /* A bit gratuitous. */ #ifdef NOTYET case TESLA_ACTION_DTRACE: ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/store.c#3 (text+ko) ==== @@ -123,6 +123,16 @@ } +void +tesla_store_free(tesla_store *store) +{ + for (uint32_t i = 0; i < store->length; i++) + tesla_class_free(store->classes + i); + + tesla_free(store); +} + + int32_t tesla_class_get(tesla_store *store, uint32_t id, tesla_class **tclassp, const char *name, const char *description) ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#4 (text+ko) ==== @@ -63,7 +63,12 @@ /** * Call this if things go catastrophically, unrecoverably wrong. */ -void tesla_die(char *message) __attribute__((noreturn)); +void tesla_die(const char *event) __attribute__((noreturn)); + +/** + * Clean up a @ref tesla_class. + */ +void tesla_class_free(struct tesla_class*); /** * Create a new @ref tesla_instance. @@ -108,7 +113,7 @@ #define DEBUG_PRINT(...) printf(__VA_ARGS__) #else #include -#define DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__) +#define DEBUG_PRINT(...) printf(__VA_ARGS__) #endif #define VERBOSE_PRINT(...) if (verbose_debug()) DEBUG_PRINT(__VA_ARGS__) @@ -126,6 +131,13 @@ #endif +#ifndef __unused +#if __has_attribute(unused) +#define __unused __attribute__((unused)) +#else +#define __unused +#endif +#endif // Kernel vs userspace implementation details. #ifdef _KERNEL @@ -226,7 +238,6 @@ */ int tesla_store_init(tesla_store*, uint32_t context, uint32_t classes, uint32_t instances); -void tesla_store_destroy(tesla_store*); /** * Initialize @ref tesla_class internals. @@ -235,6 +246,10 @@ int tesla_class_init(struct tesla_class*, uint32_t context, uint32_t instances); +//! We have failed to find an instance that matches a @ref tesla_key. +void tesla_match_fail(struct tesla_class*, const struct tesla_key*, + const struct tesla_transitions*); + /* * XXXRW: temporarily, maximum number of classes and instances are hard-coded * constants. In the future, this should somehow be more dynamic. @@ -284,6 +299,9 @@ */ void assert_instanceof(struct tesla_instance *i, struct tesla_class *tclass); +/** Print a key into a buffer. */ +int key_string(char *buffer, size_t len, const struct tesla_key *key); + /** Print a @ref tesla_key to stderr. */ void print_key(const struct tesla_key *key); ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#4 (text+ko) ==== @@ -87,69 +87,90 @@ assert(table->tt_length <= 32); + // Did we match any instances? + bool matched_something = false; + + // Make space for cloning existing instances. + tesla_instance clones[table->tt_free]; + size_t cloned = 0; + // Update existing instances, forking/specialising if necessary. for (uint32_t i = 0; i < table->tt_length; i++) { tesla_instance *inst = table->tt_instances + i; if (!tesla_instance_active(inst)) continue; - bool failure = false; + // Is this instance required to take a transition? + bool transition_required = false; + + // Has this instance actually taken a transition? + bool transition_taken = false; + for (uint32_t j = 0; j < trans->length; j++) { tesla_transition *t = trans->transitions + j; + const tesla_key *k = &inst->ti_key; // Check whether or not the instance matches the // provided key, masked by what the transition says to // expect from its 'previous' state. - tesla_key pattern = *key; - pattern.tk_mask &= t->mask; + tesla_key masked = *key; + masked.tk_mask &= t->mask; - if (!tesla_key_matches(&pattern, &inst->ti_key)) + if (!tesla_key_matches(&masked, k)) continue; - tesla_key *k = &inst->ti_key; - if (!t->fork && (k->tk_mask != pattern.tk_mask)) - continue; + if (inst->ti_state != t->from) { + // If the instance matches everything but the + // state, so there had better be a transition + // somewhere in 'trans' that can be taken! + if (k->tk_mask == masked.tk_mask) + transition_required = true; - // At this point, predjudice attaches: the instance - // matches a pattern in all ways that matter, so if - // it's not in the expected state, there had better - // be a successful transition somewhere in 'trans' - // that can be taken. - if (inst->ti_state != t->from) { - failure = true; continue; } + // The match has succeeded: we are either going to + // update or clone an existing state. + transition_taken = true; + matched_something = true; + // If the keys just match (and we haven't been explictly // instructed to fork), just update the state. - if (!t->fork - && SUBSET(key->tk_mask, k->tk_mask)) { + if (!t->fork && key->tk_mask == k->tk_mask) { VERBOSE_PRINT("update %td: %tx->%tx\n", inst - start, t->from, t->to); inst->ti_state = t->to; - failure = false; break; } // If the keys weren't an exact match, we need to fork // a new (more specific) automaton instance. - struct tesla_instance *copy; - CHECK(tesla_clone, class, inst, ©); - VERBOSE_PRINT("clone %td:%tx -> %td:%tx\n", + struct tesla_instance *clone = clones + cloned++; + *clone = *inst; + clone->ti_state = t->to; + + VERBOSE_PRINT("clone %td:%tx -> %tx\n", inst - start, inst->ti_state, - copy - start, t->to); + t->to); - CHECK(tesla_key_union, ©->ti_key, key); - copy->ti_state = t->to; - failure = false; + CHECK(tesla_key_union, &clone->ti_key, key); break; } - if (failure) + if (transition_required && !transition_taken) tesla_assert_fail(class, inst, trans); } + // Move any clones into the instance. + for (size_t i = 0; i < cloned; i++) { + struct tesla_instance *clone = clones + i; + struct tesla_instance *copied_in_place; + + CHECK(tesla_clone, class, clone, &copied_in_place); + } + + // If there is a (0 -> anything) transition, create a new instance. for (uint32_t i = 0; i < trans->length; i++) { const tesla_transition *t = trans->transitions + i; @@ -160,6 +181,7 @@ CHECK(tesla_instance_new, class, key, t->to, &inst); assert(tesla_instance_active(inst)); + matched_something = true; VERBOSE_PRINT("new %td: %tx\n", inst - start, inst->ti_state); } @@ -170,6 +192,9 @@ DEBUG_PRINT("\n====\n\n"); } + if (!matched_something) + tesla_match_fail(class, key, trans); + tesla_class_put(class); return (TESLA_SUCCESS); ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/util.c#2 (text+ko) ==== @@ -1,5 +1,6 @@ /*- * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. * * This software was developed by SRI International and the University of @@ -34,9 +35,9 @@ void -tesla_die(char *message) +tesla_die(const char *event) { - tesla_panic("tesla_die: '%s'\n", message); + tesla_panic("tesla_die: fatal error in event '%s'\n", event); } const char * From owner-p4-projects@FreeBSD.ORG Sun Mar 17 23:02:48 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1EF14BBD; Sun, 17 Mar 2013 23:02:48 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id D4D0FBBB for ; Sun, 17 Mar 2013 23:02:47 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id B8AA47E4 for ; Sun, 17 Mar 2013 23:02:47 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HN2lDe010057 for ; Sun, 17 Mar 2013 23:02:47 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HN2lCb010054 for perforce@freebsd.org; Sun, 17 Mar 2013 23:02:47 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sun, 17 Mar 2013 23:02:47 GMT Message-Id: <201303172302.r2HN2lCb010054@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222985 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Mar 2013 23:02:48 -0000 http://p4web.freebsd.org/@@222985?ac=10 Change 222985 by rwatson@rwatson_cinnamon on 2013/03/17 23:02:24 In per-thread ctor/dtor, use td rather than curthread as the place to stick/unstick tesla-state. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#4 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#4 (text+ko) ==== @@ -64,7 +64,7 @@ error = tesla_store_init(store, TESLA_SCOPE_PERTHREAD, TESLA_MAX_CLASSES, TESLA_MAX_INSTANCES); tesla_assert(error == TESLA_SUCCESS, ("tesla_store_init failed")); - curthread->td_tesla = store; + td->td_tesla = store; } static void @@ -72,8 +72,8 @@ { struct tesla_store *store; - store = curthread->td_tesla; - curthread->td_tesla = NULL; + store = td->td_tesla; + td->td_tesla = NULL; tesla_store_free(store); tesla_free(store); } From owner-p4-projects@FreeBSD.ORG Sun Mar 17 23:08:54 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D7563D21; Sun, 17 Mar 2013 23:08:54 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 995CBD1E for ; Sun, 17 Mar 2013 23:08:54 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 892F9816 for ; Sun, 17 Mar 2013 23:08:54 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HN8s1E010266 for ; Sun, 17 Mar 2013 23:08:54 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HN8sot010263 for perforce@freebsd.org; Sun, 17 Mar 2013 23:08:54 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sun, 17 Mar 2013 23:08:54 GMT Message-Id: <201303172308.r2HN8sot010263@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222986 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Mar 2013 23:08:55 -0000 http://p4web.freebsd.org/@@222986?ac=10 Change 222986 by rwatson@rwatson_cinnamon on 2013/03/17 23:08:18 Initialise global tesla state when running in the kernel. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/store.c#4 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/store.c#4 (text+ko) ==== @@ -46,6 +46,20 @@ static void tesla_class_acquire(tesla_class*); +#ifdef _KERNEL +static void +tesla_global_store_sysinit(__unused void *arg) +{ + uint32_t error; + + error = tesla_store_init(&global_store, TESLA_SCOPE_GLOBAL, + TESLA_MAX_CLASSES, TESLA_MAX_INSTANCES); + tesla_assert(error == TESLA_SUCCESS, ("tesla_store_init failed")); +} +SYSINIT(tesla_global_store, SI_SUB_TESLA, SI_ORDER_FIRST, + tesla_global_store_sysinit, NULL); +#endif + int32_t tesla_store_get(uint32_t context, uint32_t classes, uint32_t instances, tesla_store* *storep) From owner-p4-projects@FreeBSD.ORG Sun Mar 17 23:08:55 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1E6D0DFC; Sun, 17 Mar 2013 23:08:55 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id BE86ED1F for ; Sun, 17 Mar 2013 23:08:54 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id AE7A2817 for ; Sun, 17 Mar 2013 23:08:54 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HN8sV3010272 for ; Sun, 17 Mar 2013 23:08:54 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HN8sCt010269 for perforce@freebsd.org; Sun, 17 Mar 2013 23:08:54 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sun, 17 Mar 2013 23:08:54 GMT Message-Id: <201303172308.r2HN8sCt010269@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222987 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Mar 2013 23:08:55 -0000 http://p4web.freebsd.org/@@222987?ac=10 Change 222987 by rwatson@rwatson_cinnamon on 2013/03/17 23:08:41 Hook up libtesla to the kernel build; define options TESLA. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/conf/files#3 edit .. //depot/projects/ctsrd/tesla/src/sys/conf/options#2 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/conf/files#3 (text+ko) ==== @@ -2868,6 +2868,14 @@ libkern/strtoul.c standard libkern/strtouq.c standard libkern/strvalid.c standard +libtesla/debug.c optional tesla +libtesla/key.c optional tesla +libtesla/state.c optional tesla +libtesla/state-global.c optional tesla +libtesla/state-perthread.c optional tesla +libtesla/store.c optional tesla +libtesla/update.c optional tesla +libtesla/util.c optional tesla net/bpf.c standard net/bpf_buffer.c optional bpf net/bpf_jitter.c optional bpf_jitter ==== //depot/projects/ctsrd/tesla/src/sys/conf/options#2 (text+ko) ==== @@ -673,6 +673,7 @@ KTR_BOOT_ENTRIES opt_global.h KTR_ENTRIES opt_global.h KTR_VERBOSE opt_ktr.h +TESLA opt_global.h WITNESS opt_global.h WITNESS_KDB opt_witness.h WITNESS_SKIPSPIN opt_witness.h From owner-p4-projects@FreeBSD.ORG Sun Mar 17 23:12:59 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9C6416A; Sun, 17 Mar 2013 23:12:59 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 5F8791000 for ; Sun, 17 Mar 2013 23:12:59 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 42F8A83C for ; Sun, 17 Mar 2013 23:12:59 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HNCxY3010906 for ; Sun, 17 Mar 2013 23:12:59 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HNCx9W010903 for perforce@freebsd.org; Sun, 17 Mar 2013 23:12:59 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sun, 17 Mar 2013 23:12:59 GMT Message-Id: <201303172312.r2HNCx9W010903@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222988 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Mar 2013 23:12:59 -0000 http://p4web.freebsd.org/@@222988?ac=10 Change 222988 by rwatson@rwatson_cinnamon on 2013/03/17 23:12:48 Update copyright dates where changes have been made in libtesla. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#5 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#4 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/store.c#5 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#5 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#5 (text+ko) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2011, 2013 Robert N. M. Watson * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. * ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#4 (text+ko) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2011, 2013 Robert N. M. Watson * Copyright (c) 2011 Anil Madhavapeddy * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/store.c#5 (text+ko) ==== @@ -1,7 +1,7 @@ /** @file tesla_store.c Implementation of @ref tesla_store. */ /*- * Copyright (c) 2012 Jonathan Anderson - * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2011, 2013 Robert N. M. Watson * Copyright (c) 2011 Anil Madhavapeddy * All rights reserved. * ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#5 (text+ko) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2011, 2013 Robert N. M. Watson * All rights reserved. * * This software was developed by SRI International and the University of From owner-p4-projects@FreeBSD.ORG Sun Mar 17 23:38:27 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 207CB788; Sun, 17 Mar 2013 23:38:27 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id D6439786 for ; Sun, 17 Mar 2013 23:38:26 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id AE47D903 for ; Sun, 17 Mar 2013 23:38:26 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HNcQRi013894 for ; Sun, 17 Mar 2013 23:38:26 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HNcQlR013891 for perforce@freebsd.org; Sun, 17 Mar 2013 23:38:26 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sun, 17 Mar 2013 23:38:26 GMT Message-Id: <201303172338.r2HNcQlR013891@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222989 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Mar 2013 23:38:27 -0000 http://p4web.freebsd.org/@@222989?ac=10 Change 222989 by rwatson@rwatson_cinnamon on 2013/03/17 23:37:55 Lift tesla strawman header file for use in the kernel. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla-macros.h#1 add Differences ... From owner-p4-projects@FreeBSD.ORG Sun Mar 17 23:41:30 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 706D99A4; Sun, 17 Mar 2013 23:41:30 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 309149A2 for ; Sun, 17 Mar 2013 23:41:30 +0000 (UTC) (envelope-from jonathan@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 13E9291B for ; Sun, 17 Mar 2013 23:41:30 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HNfUqK014454 for ; Sun, 17 Mar 2013 23:41:30 GMT (envelope-from jonathan@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HNfU4V014451 for perforce@freebsd.org; Sun, 17 Mar 2013 23:41:30 GMT (envelope-from jonathan@freebsd.org) Date: Sun, 17 Mar 2013 23:41:30 GMT Message-Id: <201303172341.r2HNfU4V014451@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jonathan@freebsd.org using -f From: Jonathan Anderson Subject: PERFORCE change 222990 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Mar 2013 23:41:30 -0000 http://p4web.freebsd.org/@@222990?ac=10 Change 222990 by jonathan@jonathan-on-joe on 2013/03/17 23:41:17 Pull latest libtesla code from GitHub (commit d829c559). Submitted by: Robert Watson Reviewed by: Jonathan Anderson Affected files ... .. //depot/projects/ctsrd/tesla/src/lib/libtesla/debug.c#3 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/key.c#2 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/libtesla.h#3 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/state-perthread.c#3 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/state.c#3 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/store.c#3 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_internal.h#3 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/update.c#4 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/debug.c#3 (text+ko) ==== @@ -32,7 +32,10 @@ */ #include "tesla_internal.h" + +#ifndef _KERNEL #include +#endif #define SAFE_SPRINTF(dest, end, ...) \ dest += snprintf(dest, end - dest, __VA_ARGS__); \ @@ -42,9 +45,9 @@ char* transition_matrix(const struct tesla_transitions *trans) { - static const char EACH[] = "(%d:0x%tx -> %d%s) "; + static const char EACH[] = "(%d:0x%tx -> %d%s%s%s) "; - size_t needed = trans->length * (sizeof(EACH) + 4) + 4; + size_t needed = trans->length * (sizeof(EACH) + 12) + 4; char *buffer = tesla_malloc(needed); char *c = buffer; @@ -53,7 +56,10 @@ for (size_t i = 0; i < trans->length; i++) { const tesla_transition *t = trans->transitions + i; c += sprintf(c, EACH, t->from, t->mask, t->to, - t->fork ? " " : ""); + (t->flags & TESLA_TRANS_FORK ? " " : ""), + (t->flags & TESLA_TRANS_INIT ? " " : ""), + (t->flags & TESLA_TRANS_CLEANUP ? " " : "") + ); } c += sprintf(c, "]"); ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/key.c#2 (text+ko) ==== @@ -32,8 +32,10 @@ #include "tesla_internal.h" +#ifndef _KERNEL #include #include +#endif #define IS_SET(mask, index) (mask & (1 << index)) ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/libtesla.h#3 (text+ko) ==== @@ -34,7 +34,11 @@ #ifndef _TESLA_STATE #define _TESLA_STATE +#ifdef _KERNEL +#include +#else #include /* int32_t, uint32_t */ +#endif /* * libtesla functions mostly return error values, and therefore return @@ -61,15 +65,15 @@ /** The state we are moving to. */ uint32_t to; - /** - * Explicit declaration that libtesla should fork on this transition. - * - * This is useful for e.g. TELSA "or" expressions, when we need to - * allow either or both paths to be followed. - */ - int fork; + /** Things we may need to do on this transition. */ + int flags; }; +#define TESLA_TRANS_FORK 0x01 /* Always fork on this transition. */ +#define TESLA_TRANS_INIT 0x02 /* May need to initialise the class. */ +#define TESLA_TRANS_CLEANUP 0x04 /* Clean up the class now. */ + + /** * A set of permissible state transitions for an automata instance. * ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/state-perthread.c#3 (text+ko) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2011, 2013 Robert N. M. Watson * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. * @@ -49,259 +49,50 @@ #ifdef _KERNEL /* - * Global state used to manage per-thread storage slots for TESLA per-thread - * assertions. tspd_tesla_classp is non-NULL when a slot has been allocated. - */ -static struct tesla_class_perthread_desc { - struct tesla_class *tspd_tesla_classp; - size_t tspd_len; -} tesla_class_perthread_desc[TESLA_PERTHREAD_MAX]; -static struct sx tesla_class_perthread_sx; - -/* * Registration state for per-thread storage. */ -static eventhandler_tag tesla_class_perthread_ctor_tag; -static eventhandler_tag tesla_class_perthread_dtor_tag; +static eventhandler_tag tesla_perthread_ctor_tag; +static eventhandler_tag tesla_perthread_dtor_tag; static void -tesla_class_perthread_ctor(__unused void *arg, struct thread *td) +tesla_perthread_ctor(__unused void *arg, struct thread *td) { - struct tesla_class_perthread_desc *tspdp; - struct tesla_class *tsp; - struct tesla_table *ttp; - u_int index; + struct tesla_store *store; + uint32_t error; - sx_slock(&tesla_class_perthread_sx); - for (index = 0; index < TESLA_PERTHREAD_MAX; index++) { - tspdp = &tesla_class_perthread_desc[index]; - tsp = tspdp->tspd_tesla_classp; - if (tsp == NULL) { - td->td_tesla[index] = NULL; - continue; - } - ttp = malloc(tspdp->tspd_len, M_TESLA, M_WAITOK | M_ZERO); - ttp->tt_length = tsp->ts_limit; - ttp->tt_free = tsp->ts_limit; - td->td_tesla[index] = ttp; - } - sx_sunlock(&tesla_class_perthread_sx); + store = tesla_malloc(sizeof(*store)); + error = tesla_store_init(store, TESLA_SCOPE_PERTHREAD, + TESLA_MAX_CLASSES, TESLA_MAX_INSTANCES); + tesla_assert(error == TESLA_SUCCESS, ("tesla_store_init failed")); + td->td_tesla = store; } static void -tesla_class_perthread_dtor_locked(struct thread *td) +tesla_perthread_dtor(struct thread *td) { - u_int index; + struct tesla_store *store; - sx_assert(&tesla_class_perthread_sx, SX_LOCKED); - for (index = 0; index < TESLA_PERTHREAD_MAX; index++) { - if (td->td_tesla[index] == NULL) - continue; - free(M_TESLA, td->td_tesla[index]); - td->td_tesla[index] = NULL; - } + store = td->td_tesla; + td->td_tesla = NULL; + tesla_store_free(store); + tesla_free(store); } static void -tesla_class_perthread_dtor(__unused void *arg, struct thread *td) +tesla_perthread_sysinit(__unused void *arg) { - sx_slock(&tesla_class_perthread_sx); - tesla_class_perthread_dtor_locked(td); - sx_sunlock(&tesla_class_perthread_sx); + tesla_perthread_ctor_tag = EVENTHANDLER_REGISTER(thread_ctor, + tesla_perthread_ctor, NULL, EVENTHANDLER_PRI_ANY); + tesla_perthread_dtor_tag = EVENTHANDLER_REGISTER(thread_dtor, + tesla_perthread_dtor, NULL, EVENTHANDLER_PRI_ANY); } +SYSINIT(tesla_perthread, SI_SUB_TESLA, SI_ORDER_FIRST, + tesla_perthread_sysinit, NULL); -static void -tesla_class_perthread_sysinit(__unused void *arg) -{ +#endif /* !_KERNEL */ - sx_init(&tesla_class_perthread_sx, "tesla_class_perthread_sx"); - tesla_class_perthread_ctor_tag = EVENTHANDLER_REGISTER(thread_ctor, - tesla_class_perthread_ctor, NULL, EVENTHANDLER_PRI_ANY); - tesla_class_perthread_dtor_tag = EVENTHANDLER_REGISTER(thread_dtor, - tesla_class_perthread_dtor, NULL, EVENTHANDLER_PRI_ANY); -} -SYSINIT(tesla_class_perthread, SI_SUB_TESLA, SI_ORDER_FIRST, - tesla_class_perthread_sysinit, NULL); - -static void -tesla_class_perthread_sysuninit(__unused void *arg) -{ - struct proc *p; - struct thread *td; - - /* - * XXXRW: Possibility of a race for in-flight handlers and - * instrumentation? - */ - EVENTHANDLER_DEREGISTER(tesla_class_perthread_ctor, - tesla_class_perthread_ctor_tag); - EVENTHANDLER_DEREGISTER(tesla_class_perthread_dtor, - tesla_class_perthread_dtor_tag); - - sx_xlock(&allproc_lock); - sx_xlock(&tesla_class_perthread_sx); - FOREACH_PROC_IN_SYSTEM(p) { - PROC_LOCK(p); - FOREACH_THREAD_IN_PROC(p, td) { - tesla_class_perthread_dtor_locked(td); - } - PROC_UNLOCK(p); - } - sx_xunlock(&tesla_class_perthread_sx); - sx_xunlock(&allproc_lock); - sx_destroy(&tesla_class_perthread_sx); -} -SYSUNINIT(tesla_class_perthread, SI_SUB_TESLA, SI_ORDER_FIRST, - tesla_class_perthread_sysuninit, NULL); - int -tesla_class_perthread_new(struct tesla_class *tsp) -{ - struct tesla_class_perthread_desc *tspdp; - struct tesla_table *ttp; - struct proc *p; - struct thread *td; - int looped; - u_int index; - - /* - * First, allocate a TESLA per-thread storage slot, if available. - */ - tspdp = NULL; - sx_xlock(&tesla_class_perthread_sx); - for (index = 0; index < TESLA_PERTHREAD_MAX; index++) { - if (tesla_class_perthread_desc[index].tspd_tesla_classp - == NULL) { - tspdp = &tesla_class_perthread_desc[index]; - break; - } - } - if (tspdp == NULL) { - sx_xunlock(&tesla_class_perthread_sx); - return (TESLA_ERROR_ENOMEM); - } - tsp->ts_perthread_index = index; - tspdp->tspd_tesla_classp = tsp; - tspdp->tspd_len = sizeof(*ttp) + sizeof(struct tesla_instance) * - tsp->ts_limit; - - /* - * Walk all existing threads and add required allocations. If we - * can't allocate under the process lock, we have to loop out, use - * M_WAITOK, and then repeat. This looks starvation-prone, but - * actually isn't: holding tesla_class_perthread_sx blocks further - * thread allocations from taking place, so the main concern is - * in-progress allocations, which will be bounded in number. - */ - ttp = NULL; - looped = 0; - sx_slock(&allproc_lock); - FOREACH_PROC_IN_SYSTEM(p) { -loop: - if (looped) { - KASSERT(ttp == NULL, - ("tesla_class_perthread_new: ttp not NULL")); - ttp = malloc(tspdp->tspd_len, M_TESLA, - M_WAITOK | M_ZERO); - looped = 0; - } - PROC_LOCK(p); - FOREACH_THREAD_IN_PROC(p, td) { - /* - * If we looped, then some threads may already have - * memory; skip them. - */ - if (td->td_tesla[index] != NULL) - continue; - if (ttp == NULL) - ttp = malloc(tspdp->tspd_len, M_TESLA, - M_NOWAIT | M_ZERO); - if (ttp == NULL) { - PROC_UNLOCK(p); - looped = 1; - goto loop; - } - ttp->tt_length = tsp->ts_limit; - ttp->tt_free = tsp->ts_limit; - td->td_tesla[index] = ttp; - ttp = NULL; - } - PROC_UNLOCK(p); - } - sx_sunlock(&allproc_lock); - /* Due to races, we may have allocated an extra, so free it now. */ - if (ttp != NULL) - free(ttp, M_TESLA); - sx_xunlock(&tesla_class_perthread_sx); - return (TESLA_SUCCESS); -} - -void -tesla_class_perthread_destroy(struct tesla_class *tsp) -{ - struct tesla_class_perthread_desc *tspdp; - struct proc *p; - struct thread *td; - u_int index; - - sx_xlock(&tesla_class_perthread_sx); - index = tsp->ts_perthread_index; - tspdp = &tesla_class_perthread_desc[index]; - - /* - * First, walk all threads and release resources. This is easier on - * free than alloc due to the non-blocking nature of free. - * - * XXXRW: Do we need a test for td->td_tesla[index] == NULL and a - * continue? I think probably not. - */ - sx_slock(&allproc_lock); - FOREACH_PROC_IN_SYSTEM(p) { - PROC_LOCK(p); - FOREACH_THREAD_IN_PROC(p, td) { - free(M_TESLA, td->td_tesla[index]); - td->td_tesla[index] = NULL; - } - PROC_UNLOCK(p); - } - sx_unlock(&allproc_lock); - - /* - * Finally, release the reservation. - */ - tspdp->tspd_tesla_classp = NULL; - tspdp->tspd_len = 0; - sx_xunlock(&tesla_class_perthread_sx); -} - -void -tesla_class_perthread_flush(struct tesla_class *tsp) -{ - struct tesla_table *ttp; - - ttp = curthread->td_tesla[tsp->ts_perthread_index]; - bzero(&ttp->tt_instances, - sizeof(struct tesla_instance) * ttp->tt_length); - ttp->tt_free = ttp->tt_length; -} - -int -tesla_class_perthread_gettable(struct tesla_class *tsp, - struct tesla_table **ttpp) -{ - struct tesla_table *ttp; - - ttp = curthread->td_tesla[tsp->ts_perthread_index]; - KASSERT(ttp != NULL, - ("tesla_class_perthread_gettable: NULL tesla thread state")); - *ttpp = ttp; - return (TESLA_SUCCESS); -} - -#else /* !_KERNEL */ - -int tesla_class_perthread_postinit(__unused struct tesla_class *c) { return 0; @@ -321,5 +112,3 @@ tesla_class_perthread_destroy(__unused struct tesla_class *c) { } - -#endif /* _KERNEL */ ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/state.c#3 (text+ko) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2011, 2013 Robert N. M. Watson * Copyright (c) 2011 Anil Madhavapeddy * Copyright (c) 2012-2013 Jonathan Anderson * All rights reserved. @@ -34,11 +34,11 @@ #include "tesla_internal.h" +#ifdef _KERNEL +MALLOC_DEFINE(M_TESLA, "tesla", "TESLA internal state"); +#else #include #include - -#ifdef _KERNEL -MALLOC_DEFINE(M_TESLA, "tesla", "TESLA internal state"); #endif @@ -84,8 +84,8 @@ void tesla_class_free(struct tesla_class *class) { - free(class->ts_table); - free(class); + tesla_free(class->ts_table); + tesla_free(class); } @@ -144,7 +144,7 @@ struct tesla_table *ttp = tclass->ts_table; assert(ttp != NULL); - tesla_assert(ttp->tt_length != 0, "Uninitialized tesla_table"); + tesla_assert(ttp->tt_length != 0, ("Uninitialized tesla_table")); if (ttp->tt_free == 0) return (TESLA_ERROR_ENOMEM); @@ -163,7 +163,7 @@ break; } - tesla_assert(*out != NULL, "no free instances but tt_free was > 0"); + tesla_assert(*out != NULL, ("no free instances but tt_free was > 0")); return (TESLA_SUCCESS); } @@ -194,6 +194,8 @@ tesla_class_reset(struct tesla_class *c) { + DEBUG_PRINT("tesla_class_reset(%" PRId64 ")\n", (uint64_t) c); + struct tesla_table *t = c->ts_table; bzero(&t->tt_instances, sizeof(struct tesla_instance) * t->tt_length); t->tt_free = t->tt_length; @@ -254,7 +256,7 @@ break; } - free(trans_str); + tesla_free(trans_str); } void ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/store.c#3 (text+ko) ==== @@ -1,7 +1,7 @@ /** @file tesla_store.c Implementation of @ref tesla_store. */ /*- * Copyright (c) 2012 Jonathan Anderson - * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2011, 2013 Robert N. M. Watson * Copyright (c) 2011 Anil Madhavapeddy * All rights reserved. * @@ -38,16 +38,27 @@ #ifndef _KERNEL #include -struct tesla_store global_store = { .length = 0 }; - /** The pthreads key used to identify TESLA data. */ pthread_key_t pthread_key(void); #endif +struct tesla_store global_store = { .length = 0 }; + static void tesla_class_acquire(tesla_class*); -static int tesla_store_init(tesla_store*, - uint32_t context, uint32_t classes, uint32_t instances); +#ifdef _KERNEL +static void +tesla_global_store_sysinit(__unused void *arg) +{ + uint32_t error; + + error = tesla_store_init(&global_store, TESLA_SCOPE_GLOBAL, + TESLA_MAX_CLASSES, TESLA_MAX_INSTANCES); + tesla_assert(error == TESLA_SUCCESS, ("tesla_store_init failed")); +} +SYSINIT(tesla_global_store, SI_SUB_TESLA, SI_ORDER_FIRST, + tesla_global_store_sysinit, NULL); +#endif int32_t tesla_store_get(uint32_t context, uint32_t classes, uint32_t instances, @@ -101,7 +112,7 @@ } -static int32_t +int32_t tesla_store_init(tesla_store *store, uint32_t context, uint32_t classes, uint32_t instances) { @@ -132,7 +143,7 @@ for (uint32_t i = 0; i < store->length; i++) tesla_class_free(store->classes + i); - free(store); + tesla_free(store); } ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_internal.h#3 (text+ko) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2011, 2013 Robert N. M. Watson * All rights reserved. * * This software was developed by SRI International and the University of @@ -36,21 +36,26 @@ #ifdef _KERNEL #include "opt_kdb.h" #include +#include #include #include #include #include #include +#include +#include #include + +#include #else #include #include #include #include #include -#endif #include +#endif //! Is @ref x a subset of @ref y? #define SUBSET(x,y) ((x & y) == x) @@ -103,8 +108,13 @@ #define __debug +#ifdef _KERNEL +#include +#define DEBUG_PRINT(...) printf(__VA_ARGS__) +#else #include #define DEBUG_PRINT(...) printf(__VA_ARGS__) +#endif #define VERBOSE_PRINT(...) if (verbose_debug()) DEBUG_PRINT(__VA_ARGS__) /** Are we in (verbose) debug mode? */ @@ -139,7 +149,7 @@ #define tesla_assert(...) KASSERT(__VA_ARGS__) /** Emulate simple POSIX assertions. */ -#define assert(cond) KASSERT(cond, "Assertion failed: '" # cond "'") +#define assert(cond) KASSERT((cond), ("Assertion failed: '%s'", #cond)) #define tesla_malloc(len) malloc(len, M_TESLA, M_WAITOK | M_ZERO) #define tesla_free(x) free(x, M_TESLA) @@ -223,6 +233,13 @@ }; /** + * Initialise @ref tesla_store internals. + * Locking is the responsibility of the caller. + */ +int tesla_store_init(tesla_store*, uint32_t context, uint32_t classes, + uint32_t instances); + +/** * Initialize @ref tesla_class internals. * Locking is the responsibility of the caller. */ @@ -234,6 +251,13 @@ const struct tesla_transitions*); /* + * XXXRW: temporarily, maximum number of classes and instances are hard-coded + * constants. In the future, this should somehow be more dynamic. + */ +#define TESLA_MAX_CLASSES 12 +#define TESLA_MAX_INSTANCES 8 + +/* * When the assertion fails, what to do? */ #define TESLA_ACTION_FAILSTOP 1 /* Stop on failure. */ ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/update.c#4 (text+ko) ==== @@ -32,8 +32,10 @@ #include "tesla_internal.h" +#ifndef _KERNEL #include #include +#endif #define CHECK(fn, ...) do { \ int err = fn(__VA_ARGS__); \ @@ -67,7 +69,8 @@ } struct tesla_store *store; - CHECK(tesla_store_get, tesla_context, 12, 8, &store); + CHECK(tesla_store_get, tesla_context, TESLA_MAX_CLASSES, + TESLA_MAX_INSTANCES, &store); VERBOSE_PRINT("store: 0x%tx", (intptr_t) store); VERBOSE_PRINT("\n----\n"); @@ -116,6 +119,9 @@ if (!tesla_key_matches(&masked, k)) continue; + if (k->tk_mask != t->mask) + continue; + if (inst->ti_state != t->from) { // If the instance matches everything but the // state, so there had better be a transition @@ -133,7 +139,8 @@ // If the keys just match (and we haven't been explictly // instructed to fork), just update the state. - if (!t->fork && key->tk_mask == k->tk_mask) { + if (!(t->flags & TESLA_TRANS_FORK) + && key->tk_mask == k->tk_mask) { VERBOSE_PRINT("update %td: %tx->%tx\n", inst - start, t->from, t->to); @@ -168,19 +175,22 @@ } - // If there is a (0 -> anything) transition, create a new instance. + // Is the transition "special" (e.g. init/cleanup)? for (uint32_t i = 0; i < trans->length; i++) { const tesla_transition *t = trans->transitions + i; - if (t->from != 0) - continue; + if (t->from == 0) { + struct tesla_instance *inst; + CHECK(tesla_instance_new, class, key, t->to, &inst); + assert(tesla_instance_active(inst)); - struct tesla_instance *inst; - CHECK(tesla_instance_new, class, key, t->to, &inst); - assert(tesla_instance_active(inst)); + matched_something = true; + VERBOSE_PRINT("new %td: %tx\n", + inst - start, inst->ti_state); + } - matched_something = true; - VERBOSE_PRINT("new %td: %tx\n", - inst - start, inst->ti_state); + if (t->flags & TESLA_TRANS_CLEANUP) { + tesla_class_reset(class); + } } if (verbose_debug()) { From owner-p4-projects@FreeBSD.ORG Sun Mar 17 23:45:35 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 22FDEAC2; Sun, 17 Mar 2013 23:45:35 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id D6EFEAC0 for ; Sun, 17 Mar 2013 23:45:34 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id B9F2D93C for ; Sun, 17 Mar 2013 23:45:34 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HNjY8h014642 for ; Sun, 17 Mar 2013 23:45:34 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HNjYRo014639 for perforce@freebsd.org; Sun, 17 Mar 2013 23:45:34 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sun, 17 Mar 2013 23:45:34 GMT Message-Id: <201303172345.r2HNjYRo014639@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222991 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Mar 2013 23:45:35 -0000 http://p4web.freebsd.org/@@222991?ac=10 Change 222991 by rwatson@rwatson_cinnamon on 2013/03/17 23:44:57 Merge updated libtesla from contrib to sys; loop back my build changes and TESLA functional updates. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/debug.c#4 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/key.c#3 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/libtesla.h#4 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#6 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#5 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/store.c#6 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#6 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#5 integrate Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/debug.c#4 (text+ko) ==== @@ -45,9 +45,9 @@ char* transition_matrix(const struct tesla_transitions *trans) { - static const char EACH[] = "(%d:0x%tx -> %d%s) "; + static const char EACH[] = "(%d:0x%tx -> %d%s%s%s) "; - size_t needed = trans->length * (sizeof(EACH) + 4) + 4; + size_t needed = trans->length * (sizeof(EACH) + 12) + 4; char *buffer = tesla_malloc(needed); char *c = buffer; @@ -56,7 +56,10 @@ for (size_t i = 0; i < trans->length; i++) { const tesla_transition *t = trans->transitions + i; c += sprintf(c, EACH, t->from, t->mask, t->to, - t->fork ? " " : ""); + (t->flags & TESLA_TRANS_FORK ? " " : ""), + (t->flags & TESLA_TRANS_INIT ? " " : ""), + (t->flags & TESLA_TRANS_CLEANUP ? " " : "") + ); } c += sprintf(c, "]"); ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/key.c#3 (text+ko) ==== ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/libtesla.h#4 (text+ko) ==== @@ -65,15 +65,15 @@ /** The state we are moving to. */ uint32_t to; - /** - * Explicit declaration that libtesla should fork on this transition. - * - * This is useful for e.g. TELSA "or" expressions, when we need to - * allow either or both paths to be followed. - */ - int fork; + /** Things we may need to do on this transition. */ + int flags; }; +#define TESLA_TRANS_FORK 0x01 /* Always fork on this transition. */ +#define TESLA_TRANS_INIT 0x02 /* May need to initialise the class. */ +#define TESLA_TRANS_CLEANUP 0x04 /* Clean up the class now. */ + + /** * A set of permissible state transitions for an automata instance. * ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#6 (text+ko) ==== ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#5 (text+ko) ==== @@ -194,6 +194,8 @@ tesla_class_reset(struct tesla_class *c) { + DEBUG_PRINT("tesla_class_reset(%" PRId64 ")\n", (uint64_t) c); + struct tesla_table *t = c->ts_table; bzero(&t->tt_instances, sizeof(struct tesla_instance) * t->tt_length); t->tt_free = t->tt_length; ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/store.c#6 (text+ko) ==== ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#6 (text+ko) ==== ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#5 (text+ko) ==== @@ -119,6 +119,9 @@ if (!tesla_key_matches(&masked, k)) continue; + if (k->tk_mask != t->mask) + continue; + if (inst->ti_state != t->from) { // If the instance matches everything but the // state, so there had better be a transition @@ -136,7 +139,8 @@ // If the keys just match (and we haven't been explictly // instructed to fork), just update the state. - if (!t->fork && key->tk_mask == k->tk_mask) { + if (!(t->flags & TESLA_TRANS_FORK) + && key->tk_mask == k->tk_mask) { VERBOSE_PRINT("update %td: %tx->%tx\n", inst - start, t->from, t->to); @@ -171,19 +175,22 @@ } - // If there is a (0 -> anything) transition, create a new instance. + // Is the transition "special" (e.g. init/cleanup)? for (uint32_t i = 0; i < trans->length; i++) { const tesla_transition *t = trans->transitions + i; - if (t->from != 0) - continue; + if (t->from == 0) { + struct tesla_instance *inst; + CHECK(tesla_instance_new, class, key, t->to, &inst); + assert(tesla_instance_active(inst)); - struct tesla_instance *inst; - CHECK(tesla_instance_new, class, key, t->to, &inst); - assert(tesla_instance_active(inst)); + matched_something = true; + VERBOSE_PRINT("new %td: %tx\n", + inst - start, inst->ti_state); + } - matched_something = true; - VERBOSE_PRINT("new %td: %tx\n", - inst - start, inst->ti_state); + if (t->flags & TESLA_TRANS_CLEANUP) { + tesla_class_reset(class); + } } if (verbose_debug()) { From owner-p4-projects@FreeBSD.ORG Mon Mar 18 00:26:20 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D23BD661; Mon, 18 Mar 2013 00:26:19 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 6E52965A for ; Mon, 18 Mar 2013 00:26:19 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 5DE8EAB6 for ; Mon, 18 Mar 2013 00:26:19 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2I0QIPx018892 for ; Mon, 18 Mar 2013 00:26:18 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2I0QIcu018889 for perforce@freebsd.org; Mon, 18 Mar 2013 00:26:18 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 00:26:18 GMT Message-Id: <201303180026.r2I0QIcu018889@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222992 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 00:26:20 -0000 http://p4web.freebsd.org/@@222992?ac=10 Change 222992 by rwatson@rwatson_cinnamon on 2013/03/18 00:25:40 New use of inttypes.h-derived printf formats required kernel inclusion of similar. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#7 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#7 (text+ko) ==== @@ -46,6 +46,8 @@ #include #include +#include + #include #else #include From owner-p4-projects@FreeBSD.ORG Mon Mar 18 00:37:32 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 968448A9; Mon, 18 Mar 2013 00:37:32 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 56F188A7 for ; Mon, 18 Mar 2013 00:37:32 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 2ED27B31 for ; Mon, 18 Mar 2013 00:37:32 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2I0bWjG019744 for ; Mon, 18 Mar 2013 00:37:32 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2I0bWe6019741 for perforce@freebsd.org; Mon, 18 Mar 2013 00:37:32 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 00:37:32 GMT Message-Id: <201303180037.r2I0bWe6019741@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222994 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 00:37:32 -0000 http://p4web.freebsd.org/@@222994?ac=10 Change 222994 by rwatson@rwatson_cinnamon on 2013/03/18 00:36:51 Update tesla-macros.h for recent github changes. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla-macros.h#2 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla-macros.h#2 (text+ko) ==== @@ -39,18 +39,26 @@ * Macros to make TESLA assertions a little easier to read. */ +/** An assertion made within the execution of a particular function. */ +#define TESLA_WITHIN(function, expression) \ + TESLA_PERTHREAD( \ + callee(called(function)), \ + callee(returned(function)), \ + expression \ + ) + /** An inline assertion. */ -#define TESLA_ASSERT(locality, predicate) \ +#define TESLA_ASSERT(locality, start, end, predicate) \ __tesla_inline_assertion( \ __FILE__, __LINE__, __COUNTER__, \ - locality, predicate \ + locality, start, end, predicate \ ) /** An assertion in the global TESLA context. */ -#define TESLA_GLOBAL(pred) TESLA_ASSERT(__tesla_global, pred) +#define TESLA_GLOBAL(...) TESLA_ASSERT(__tesla_global, __VA_ARGS__) /** An assertion in a thread's TESLA context. */ -#define TESLA_PERTHREAD(pred) TESLA_ASSERT(__tesla_perthread, pred) +#define TESLA_PERTHREAD(...) TESLA_ASSERT(__tesla_perthread, __VA_ARGS__) /** A strictly-ordered sequence of events. */ #define TSEQUENCE(...) __tesla_sequence(__tesla_ignore, __VA_ARGS__) @@ -61,7 +69,7 @@ #define callee(...) __tesla_callee(__tesla_ignore, __VA_ARGS__) #define caller(...) __tesla_caller(__tesla_ignore, __VA_ARGS__) -#define TESLA_NOW &__tesla_now +#define TESLA_NOW __tesla_now #define TESLA_STRUCT_AUTOMATON(fn_name) __tesla_struct_automaton(fn_name) @@ -78,20 +86,10 @@ #define ANY(int_type) __tesla_any(int_type) /** A more programmer-friendly way to write assertions about the past. */ -#define since(bound, x) \ - __tesla_sequence( \ - bound, \ - x, \ - __tesla_now \ - ) +#define previously(x) TSEQUENCE(x, TESLA_NOW) /** A more programmer-friendly way to write assertions about the future. */ -#define before(bound, x) \ - __tesla_sequence( \ - __tesla_now, \ - x, \ - bound \ - ) +#define eventually(x) TSEQUENCE(TESLA_NOW, x) #endif /* !TESLA_MACROS_H */ From owner-p4-projects@FreeBSD.ORG Mon Mar 18 01:22:22 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5831D5EB; Mon, 18 Mar 2013 01:22:22 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 18C0F5E8 for ; Mon, 18 Mar 2013 01:22:22 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 038C7D1B for ; Mon, 18 Mar 2013 01:22:22 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2I1MLqv024538 for ; Mon, 18 Mar 2013 01:22:21 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2I1ML8D024535 for perforce@freebsd.org; Mon, 18 Mar 2013 01:22:21 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 01:22:21 GMT Message-Id: <201303180122.r2I1ML8D024535@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222997 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 01:22:22 -0000 http://p4web.freebsd.org/@@222997?ac=10 Change 222997 by rwatson@rwatson_cinnamon on 2013/03/18 01:21:32 Allow tesla-macros.h to be used in kernelspace. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla-macros.h#3 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla-macros.h#3 (text+ko) ==== @@ -32,8 +32,12 @@ #ifndef TESLA_MACROS_H #define TESLA_MACROS_H +#ifdef _KERNEL +#include +#else #include #include +#endif /* * Macros to make TESLA assertions a little easier to read. From owner-p4-projects@FreeBSD.ORG Mon Mar 18 01:22:23 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E0BC3676; Mon, 18 Mar 2013 01:22:22 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 42B155E9 for ; Mon, 18 Mar 2013 01:22:22 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 2DBD4D1E for ; Mon, 18 Mar 2013 01:22:22 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2I1MMjj024544 for ; Mon, 18 Mar 2013 01:22:22 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2I1MMl7024541 for perforce@freebsd.org; Mon, 18 Mar 2013 01:22:22 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 01:22:22 GMT Message-Id: <201303180122.r2I1MMl7024541@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222998 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 01:22:23 -0000 http://p4web.freebsd.org/@@222998?ac=10 Change 222998 by rwatson@rwatson_cinnamon on 2013/03/18 01:21:52 Take into account (unused) argument to thread dtor eventhandlers. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#7 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#7 (text+ko) ==== @@ -68,7 +68,7 @@ } static void -tesla_perthread_dtor(struct thread *td) +tesla_perthread_dtor(__unused void *arg, struct thread *td) { struct tesla_store *store; From owner-p4-projects@FreeBSD.ORG Mon Mar 18 10:41:47 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id CA1E8A5A; Mon, 18 Mar 2013 10:41:47 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 88917A54 for ; Mon, 18 Mar 2013 10:41:47 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 725961AF for ; Mon, 18 Mar 2013 10:41:47 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2IAaPp7079037 for ; Mon, 18 Mar 2013 10:36:25 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2IAaPC5079034 for perforce@freebsd.org; Mon, 18 Mar 2013 10:36:25 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 10:36:25 GMT Message-Id: <201303181036.r2IAaPC5079034@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 223006 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 10:41:48 -0000 http://p4web.freebsd.org/@@223006?ac=10 Change 223006 by rwatson@rwatson_cinnamon on 2013/03/18 10:36:13 Trial "previously their was a MAC check" TESLA annotation for ffs_write(). Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/ufs/ffs/ffs_vnops.c#2 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/ufs/ffs/ffs_vnops.c#2 (text+ko) ==== @@ -79,6 +79,9 @@ #include #include +#include +#include + #include #include #include @@ -643,6 +646,9 @@ int seqcount; int blkoffset, error, flags, ioflag, size, xfersize; + TESLA_WITHIN(trap, previously(mac_check_vnode_write(ANY(ptr), ANY(ptr), + ap->a_vp))); + vp = ap->a_vp; uio = ap->a_uio; ioflag = ap->a_ioflag; From owner-p4-projects@FreeBSD.ORG Mon Mar 18 11:40:36 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id BCFD97C1; Mon, 18 Mar 2013 11:40:36 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 80D647BF for ; Mon, 18 Mar 2013 11:40:36 +0000 (UTC) (envelope-from jonathan@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 59140279 for ; Mon, 18 Mar 2013 11:40:36 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2IBeavM085212 for ; Mon, 18 Mar 2013 11:40:36 GMT (envelope-from jonathan@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2IBeaWj085209 for perforce@freebsd.org; Mon, 18 Mar 2013 11:40:36 GMT (envelope-from jonathan@freebsd.org) Date: Mon, 18 Mar 2013 11:40:36 GMT Message-Id: <201303181140.r2IBeaWj085209@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jonathan@freebsd.org using -f From: Jonathan Anderson Subject: PERFORCE change 223008 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 11:40:37 -0000 http://p4web.freebsd.org/@@223008?ac=10 Change 223008 by jonathan@jonathan-on-joe on 2013/03/18 11:40:25 Pull tesla.h from GitHub commit 2a0f9154. Somehow I missed this earlier. Affected files ... .. //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla.h#3 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla.h#3 (text+ko) ==== @@ -38,7 +38,15 @@ /** A number of times to match an event: positive or "any number". */ typedef int __tesla_count; -/** Magic "function" representing a TESLA assertion. */ +/** + * Magic "function" representing a TESLA assertion. + * + * Its arguments are: + * * name of the file the assertion is located in (__FILE__) + * * the line the assertion is defined at (__LINE__) + * * a counter to ensure uniqueness (__COUNTER__) + * * the TESLA context (per-thread or global) + */ void __tesla_inline_assertion(const char *filename, int line, int count, __tesla_locality*, ...); @@ -66,6 +74,14 @@ /** Exiting a function (with optionally-specified arguments). */ struct __tesla_event* __tesla_return(void*, ...); + +/** Function events inside this predicate refer to the callee context. */ +struct __tesla_event* __tesla_callee(__tesla_event*, ...); + +/** Function events inside this predicate refer to the caller context. */ +struct __tesla_event* __tesla_caller(__tesla_event*, ...); + + /** Nothing to see here, move along... */ struct __tesla_event* __tesla_ignore; @@ -74,9 +90,6 @@ struct __tesla_event* __tesla_optional(__tesla_event*, ...); -/** A repetition of events — this allows globby "?", "*", "+", etc. */ -struct __tesla_event* __tesla_repeat(__tesla_count, __tesla_count, ...); - /** A value that could match a lot of function parameters. Maybe anything? */ void* __tesla_any_ptr(); int __tesla_any_int(); @@ -127,6 +140,15 @@ #define __tesla_struct_automaton(fn_name) #define __tesla_automaton(name, ...) +#define __tesla_call(...) 0 +#define __tesla_return(...) 0 + +#define __tesla_callee(...) 0 +#define __tesla_caller(...) 0 + +#define __tesla_optional(...) 0 +#define __tesla_any(...) 0 + #endif /* __TESLA_ANALYSER__ */ #endif /* TESLA_H */ From owner-p4-projects@FreeBSD.ORG Mon Mar 18 11:43:40 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 75608A17; Mon, 18 Mar 2013 11:43:40 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 32264A15 for ; Mon, 18 Mar 2013 11:43:40 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 0425C2C3 for ; Mon, 18 Mar 2013 11:43:40 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2IBhdeK085475 for ; Mon, 18 Mar 2013 11:43:39 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2IBhd9e085472 for perforce@freebsd.org; Mon, 18 Mar 2013 11:43:39 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 11:43:39 GMT Message-Id: <201303181143.r2IBhd9e085472@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 223009 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 11:43:40 -0000 http://p4web.freebsd.org/@@223009?ac=10 Change 223009 by rwatson@rwatson_cinnamon on 2013/03/18 11:43:25 Merge previously omitted 2a0f9154 from libtesla to the kernel. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla.h#2 integrate Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla.h#2 (text+ko) ==== @@ -38,7 +38,15 @@ /** A number of times to match an event: positive or "any number". */ typedef int __tesla_count; -/** Magic "function" representing a TESLA assertion. */ +/** + * Magic "function" representing a TESLA assertion. + * + * Its arguments are: + * * name of the file the assertion is located in (__FILE__) + * * the line the assertion is defined at (__LINE__) + * * a counter to ensure uniqueness (__COUNTER__) + * * the TESLA context (per-thread or global) + */ void __tesla_inline_assertion(const char *filename, int line, int count, __tesla_locality*, ...); @@ -66,6 +74,14 @@ /** Exiting a function (with optionally-specified arguments). */ struct __tesla_event* __tesla_return(void*, ...); + +/** Function events inside this predicate refer to the callee context. */ +struct __tesla_event* __tesla_callee(__tesla_event*, ...); + +/** Function events inside this predicate refer to the caller context. */ +struct __tesla_event* __tesla_caller(__tesla_event*, ...); + + /** Nothing to see here, move along... */ struct __tesla_event* __tesla_ignore; @@ -74,9 +90,6 @@ struct __tesla_event* __tesla_optional(__tesla_event*, ...); -/** A repetition of events — this allows globby "?", "*", "+", etc. */ -struct __tesla_event* __tesla_repeat(__tesla_count, __tesla_count, ...); - /** A value that could match a lot of function parameters. Maybe anything? */ void* __tesla_any_ptr(); int __tesla_any_int(); @@ -127,6 +140,15 @@ #define __tesla_struct_automaton(fn_name) #define __tesla_automaton(name, ...) +#define __tesla_call(...) 0 +#define __tesla_return(...) 0 + +#define __tesla_callee(...) 0 +#define __tesla_caller(...) 0 + +#define __tesla_optional(...) 0 +#define __tesla_any(...) 0 + #endif /* __TESLA_ANALYSER__ */ #endif /* TESLA_H */ From owner-p4-projects@FreeBSD.ORG Mon Mar 18 16:00:21 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A49EC16E; Mon, 18 Mar 2013 16:00:21 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 66DA916B for ; Mon, 18 Mar 2013 16:00:21 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 512C3679 for ; Mon, 18 Mar 2013 16:00:21 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2IG0Kiw009886 for ; Mon, 18 Mar 2013 16:00:20 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2IG0K6V009883 for perforce@freebsd.org; Mon, 18 Mar 2013 16:00:20 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 16:00:20 GMT Message-Id: <201303181600.r2IG0K6V009883@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 223012 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 16:00:21 -0000 http://p4web.freebsd.org/@@223012?ac=10 Change 223012 by rwatson@rwatson_cinnamon on 2013/03/18 15:59:26 Provide a TESLA inline assertion stub for slightly unexpected case of generating a kernel on which analysis has taken place, but that is not instrumented. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla.h#3 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla.h#3 (text+ko) ==== @@ -149,6 +149,12 @@ #define __tesla_optional(...) 0 #define __tesla_any(...) 0 +inline void +__tesla_inline_assertion(const char *filename, int line, int count, + __tesla_locality *loc, ...) +{ +} + #endif /* __TESLA_ANALYSER__ */ #endif /* TESLA_H */ From owner-p4-projects@FreeBSD.ORG Mon Mar 18 16:00:22 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E39B3240; Mon, 18 Mar 2013 16:00:21 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 6AB6116C for ; Mon, 18 Mar 2013 16:00:21 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 56A2A67A for ; Mon, 18 Mar 2013 16:00:21 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2IG0Lv0009892 for ; Mon, 18 Mar 2013 16:00:21 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2IG0Kio009889 for perforce@freebsd.org; Mon, 18 Mar 2013 16:00:20 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 16:00:20 GMT Message-Id: <201303181600.r2IG0Kio009889@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 223013 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 16:00:22 -0000 http://p4web.freebsd.org/@@223013?ac=10 Change 223013 by rwatson@rwatson_cinnamon on 2013/03/18 16:00:18 Add a second TESLA assertion relating to MAC enforcement on vnode operations. Modify the existing assertion to use 'vp' instead of 'ap->a_vp' as currently only variables, not more complex expressions, are permitted. Would be useful to fix this. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/ufs/ffs/ffs_vnops.c#3 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/ufs/ffs/ffs_vnops.c#3 (text+ko) ==== @@ -408,7 +408,15 @@ #endif } +#ifdef TESLA /* + * XXXRW: It would be nice if we didn't have to do this. + */ +#include +void trap(struct trapframe *frame); +#endif + +/* * Vnode op for reading. */ static int @@ -434,6 +442,9 @@ int ioflag; vp = ap->a_vp; + TESLA_WITHIN(trap, previously(mac_vnode_check_read(ANY(ptr), ANY(ptr), + vp) == 0)); + uio = ap->a_uio; ioflag = ap->a_ioflag; if (ap->a_ioflag & IO_EXT) @@ -646,10 +657,10 @@ int seqcount; int blkoffset, error, flags, ioflag, size, xfersize; - TESLA_WITHIN(trap, previously(mac_check_vnode_write(ANY(ptr), ANY(ptr), - ap->a_vp))); + vp = ap->a_vp; + TESLA_WITHIN(trap, previously(mac_vnode_check_write(ANY(ptr), + ANY(ptr), vp) == 0)); - vp = ap->a_vp; uio = ap->a_uio; ioflag = ap->a_ioflag; if (ap->a_ioflag & IO_EXT) From owner-p4-projects@FreeBSD.ORG Mon Mar 18 17:43:13 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6ED68748; Mon, 18 Mar 2013 17:43:13 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 30547746 for ; Mon, 18 Mar 2013 17:43:13 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 08D82CFC for ; Mon, 18 Mar 2013 17:43:13 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2IHhCkD020277 for ; Mon, 18 Mar 2013 17:43:12 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2IHhCPK020274 for perforce@freebsd.org; Mon, 18 Mar 2013 17:43:12 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 17:43:12 GMT Message-Id: <201303181743.r2IHhCPK020274@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 223015 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 17:43:13 -0000 http://p4web.freebsd.org/@@223015?ac=10 Change 223015 by rwatson@rwatson_cinnamon on 2013/03/18 17:43:06 Reference TESLA-enabled kernel config file for amd64. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/amd64/conf/TESLA#1 add Differences ... From owner-p4-projects@FreeBSD.ORG Mon Mar 18 17:46:17 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D0497AAE; Mon, 18 Mar 2013 17:46:16 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 90D85AAB for ; Mon, 18 Mar 2013 17:46:16 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 8189ED4B for ; Mon, 18 Mar 2013 17:46:16 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2IHkGDt020428 for ; Mon, 18 Mar 2013 17:46:16 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2IHkGAB020425 for perforce@freebsd.org; Mon, 18 Mar 2013 17:46:16 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 17:46:16 GMT Message-Id: <201303181746.r2IHkGAB020425@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 223016 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 17:46:17 -0000 http://p4web.freebsd.org/@@223016?ac=10 Change 223016 by rwatson@rwatson_cinnamon on 2013/03/18 17:46:05 Provide functions implementing DTrace probes for TESLA events in kernel; not yet hooked up. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/conf/files#4 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_dtrace.c#1 add .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#8 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/conf/files#4 (text+ko) ==== @@ -2874,6 +2874,7 @@ libtesla/state-global.c optional tesla libtesla/state-perthread.c optional tesla libtesla/store.c optional tesla +libtesla/tesla_dtrace.c optional tesla kdtrace_hooks libtesla/update.c optional tesla libtesla/util.c optional tesla net/bpf.c standard ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#8 (text+ko) ==== @@ -287,6 +287,16 @@ void tesla_class_perthread_destroy(struct tesla_class*); /* + * DTrace notifications of various events. + */ +void tesla_state_transition_dtrace(struct tesla_class *, + struct tesla_instance *); +void tesla_assert_fail_dtrace(struct tesla_class *, + struct tesla_instance *); +void tesla_assert_pass_dtrace(struct tesla_class *, + struct tesla_instance *); + +/* * Debug helpers. */ From owner-p4-projects@FreeBSD.ORG Mon Mar 18 20:51:41 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8C50E408; Mon, 18 Mar 2013 20:51:41 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 1C875406 for ; Mon, 18 Mar 2013 20:51:41 +0000 (UTC) (envelope-from jonathan@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id F044EA13 for ; Mon, 18 Mar 2013 20:51:40 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2IKpe6F038593 for ; Mon, 18 Mar 2013 20:51:40 GMT (envelope-from jonathan@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2IKpenL038590 for perforce@freebsd.org; Mon, 18 Mar 2013 20:51:40 GMT (envelope-from jonathan@freebsd.org) Date: Mon, 18 Mar 2013 20:51:40 GMT Message-Id: <201303182051.r2IKpenL038590@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jonathan@freebsd.org using -f From: Jonathan Anderson Subject: PERFORCE change 223019 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 20:51:41 -0000 http://p4web.freebsd.org/@@223019?ac=10 Change 223019 by jonathan@jonathan-on-joe on 2013/03/18 20:51:04 Update to upstream commit 388531c0. Obtained from: https://github.com/CTSRD-TESLA/TESLA/commit/388531c0fb048e8f5f783bcc8d4c244d5304b237 Affected files ... .. //depot/projects/ctsrd/tesla/src/lib/libtesla/Makefile#2 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/state-perthread.c#4 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/state.c#4 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_dtrace.c#1 add .. //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_internal.h#4 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_notification.c#1 add .. //depot/projects/ctsrd/tesla/src/lib/libtesla/update.c#5 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/Makefile#2 (text+ko) ==== @@ -7,8 +7,8 @@ CFLAGS+= -I${.CURDIR} INCS= tesla.h libtesla.h -SRCS= debug.c key.c state.c state-global.c state-perthread.c \ - store.c update.c util.c +SRCS= debug.c key.c tesla_dtrace.c tesla_notification.c state.c state-global.c + state-perthread.c store.c update.c util.c .include ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/state-perthread.c#4 (text+ko) ==== @@ -68,7 +68,7 @@ } static void -tesla_perthread_dtor(struct thread *td) +tesla_perthread_dtor(__unused void *arg, struct thread *td) { struct tesla_store *store; ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/state.c#4 (text+ko) ==== @@ -241,11 +241,9 @@ key_str, trans_str); break; -#ifdef NOTYET case TESLA_ACTION_DTRACE: - dtrace_probe(...); + tesla_assert_fail_dtrace(class, NULL, trans); return; -#endif case TESLA_ACTION_PRINTF: #if defined(_KERNEL) && defined(KDB) @@ -280,11 +278,11 @@ tsp->ts_name, tsp->ts_description, transition_matrix(trans), tip->ti_state); break; /* A bit gratuitous. */ -#ifdef NOTYET + case TESLA_ACTION_DTRACE: - dtrace_probe(...); + tesla_assert_fail_dtrace(tsp, tip, trans); return; -#endif + case TESLA_ACTION_PRINTF: #if defined(_KERNEL) && defined(KDB) kdb_backtrace(); ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_internal.h#4 (text+ko) ==== @@ -46,6 +46,8 @@ #include #include +#include + #include #else #include @@ -285,6 +287,34 @@ void tesla_class_perthread_destroy(struct tesla_class*); /* + * Event notification: + */ +void tesla_state_notify_new_instance(struct tesla_class *, + struct tesla_instance *); + +void tesla_state_notify_transition(struct tesla_class *, + struct tesla_instance *, const struct tesla_transitions *, uint32_t index); + +void tesla_state_notify_clone(struct tesla_class *, struct tesla_instance *, + const struct tesla_transitions *, uint32_t index); + +void tesla_state_notify_fail(struct tesla_class *, struct tesla_instance *, + const struct tesla_transitions *); + +void tesla_state_notify_pass(struct tesla_class *, struct tesla_instance *); + +/* + * DTrace notifications of various events. + */ +void tesla_state_transition_dtrace(struct tesla_class *, + struct tesla_instance *, const struct tesla_transitions *, + uint32_t transition_index); +void tesla_assert_fail_dtrace(struct tesla_class *, + struct tesla_instance *, const struct tesla_transitions *); +void tesla_assert_pass_dtrace(struct tesla_class *, + struct tesla_instance *); + +/* * Debug helpers. */ ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/update.c#5 (text+ko) ==== @@ -83,8 +83,6 @@ } tesla_table *table = class->ts_table; - tesla_instance *start = table->tt_instances; - assert(table->tt_length <= 32); // Did we match any instances? @@ -141,8 +139,8 @@ // instructed to fork), just update the state. if (!(t->flags & TESLA_TRANS_FORK) && key->tk_mask == k->tk_mask) { - VERBOSE_PRINT("update %td: %tx->%tx\n", - inst - start, t->from, t->to); + tesla_state_notify_transition(class, inst, + trans, j); inst->ti_state = t->to; break; @@ -150,14 +148,12 @@ // If the keys weren't an exact match, we need to fork // a new (more specific) automaton instance. + tesla_state_notify_clone(class, inst, trans, j); + struct tesla_instance *clone = clones + cloned++; *clone = *inst; clone->ti_state = t->to; - VERBOSE_PRINT("clone %td:%tx -> %tx\n", - inst - start, inst->ti_state, - t->to); - CHECK(tesla_key_union, &clone->ti_key, key); break; } @@ -184,8 +180,7 @@ assert(tesla_instance_active(inst)); matched_something = true; - VERBOSE_PRINT("new %td: %tx\n", - inst - start, inst->ti_state); + tesla_state_notify_new_instance(class, inst); } if (t->flags & TESLA_TRANS_CLEANUP) { From owner-p4-projects@FreeBSD.ORG Mon Mar 18 20:57:48 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id B337F737; Mon, 18 Mar 2013 20:57:47 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 75449735 for ; Mon, 18 Mar 2013 20:57:47 +0000 (UTC) (envelope-from jonathan@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 65D27A56 for ; Mon, 18 Mar 2013 20:57:47 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2IKvlYm038827 for ; Mon, 18 Mar 2013 20:57:47 GMT (envelope-from jonathan@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2IKvlac038824 for perforce@freebsd.org; Mon, 18 Mar 2013 20:57:47 GMT (envelope-from jonathan@freebsd.org) Date: Mon, 18 Mar 2013 20:57:47 GMT Message-Id: <201303182057.r2IKvlac038824@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jonathan@freebsd.org using -f From: Jonathan Anderson Subject: PERFORCE change 223020 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 20:57:48 -0000 http://p4web.freebsd.org/@@223020?ac=10 Change 223020 by jonathan@jonathan-on-joe on 2013/03/18 20:56:59 Pull from upstream commit ef1741ad. Obtained from: https://github.com/CTSRD-TESLA/TESLA/commit/ef1741ade5111a31bdf90353114e103dd9991076 Affected files ... .. //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla.h#4 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla.h#4 (text+ko) ==== @@ -47,8 +47,11 @@ * * a counter to ensure uniqueness (__COUNTER__) * * the TESLA context (per-thread or global) */ -void __tesla_inline_assertion(const char *filename, int line, int count, - __tesla_locality*, ...); +inline void +__tesla_inline_assertion(const char *filename, int line, int count, + __tesla_locality *loc, ...) +{ +} /* Only define the following things if doing TESLA analysis, not compiling. */ From owner-p4-projects@FreeBSD.ORG Mon Mar 18 21:35:29 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4B2CD7E4; Mon, 18 Mar 2013 21:35:29 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 0D6907E2 for ; Mon, 18 Mar 2013 21:35:29 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id D62E6D2E for ; Mon, 18 Mar 2013 21:35:28 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2ILZSUJ042920 for ; Mon, 18 Mar 2013 21:35:28 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2ILZSUn042917 for perforce@freebsd.org; Mon, 18 Mar 2013 21:35:28 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 21:35:28 GMT Message-Id: <201303182135.r2ILZSUn042917@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 223022 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 21:35:29 -0000 http://p4web.freebsd.org/@@223022?ac=10 Change 223022 by rwatson@rwatson_cinnamon on 2013/03/18 21:35:01 Merge new libtesla parts -- specifically, loopback of (and enhancements to) events exposed via DTrace. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/Makefile#2 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#8 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#6 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla.h#4 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_dtrace.c#2 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#9 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_notification.c#1 branch .. //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#6 integrate Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/Makefile#2 (text+ko) ==== @@ -7,8 +7,8 @@ CFLAGS+= -I${.CURDIR} INCS= tesla.h libtesla.h -SRCS= debug.c key.c state.c state-global.c state-perthread.c \ - store.c update.c util.c +SRCS= debug.c key.c tesla_dtrace.c tesla_notification.c state.c state-global.c + state-perthread.c store.c update.c util.c .include ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#8 (text+ko) ==== ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#6 (text+ko) ==== @@ -241,11 +241,9 @@ key_str, trans_str); break; -#ifdef NOTYET case TESLA_ACTION_DTRACE: - dtrace_probe(...); + tesla_assert_fail_dtrace(class, NULL, trans); return; -#endif case TESLA_ACTION_PRINTF: #if defined(_KERNEL) && defined(KDB) @@ -280,11 +278,11 @@ tsp->ts_name, tsp->ts_description, transition_matrix(trans), tip->ti_state); break; /* A bit gratuitous. */ -#ifdef NOTYET + case TESLA_ACTION_DTRACE: - dtrace_probe(...); + tesla_assert_fail_dtrace(tsp, tip, trans); return; -#endif + case TESLA_ACTION_PRINTF: #if defined(_KERNEL) && defined(KDB) kdb_backtrace(); ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla.h#4 (text+ko) ==== @@ -47,8 +47,11 @@ * * a counter to ensure uniqueness (__COUNTER__) * * the TESLA context (per-thread or global) */ -void __tesla_inline_assertion(const char *filename, int line, int count, - __tesla_locality*, ...); +inline void +__tesla_inline_assertion(const char *filename, int line, int count, + __tesla_locality *loc, ...) +{ +} /* Only define the following things if doing TESLA analysis, not compiling. */ ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_dtrace.c#2 (text+ko) ==== ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#9 (text+ko) ==== @@ -287,12 +287,30 @@ void tesla_class_perthread_destroy(struct tesla_class*); /* + * Event notification: + */ +void tesla_state_notify_new_instance(struct tesla_class *, + struct tesla_instance *); + +void tesla_state_notify_transition(struct tesla_class *, + struct tesla_instance *, const struct tesla_transitions *, uint32_t index); + +void tesla_state_notify_clone(struct tesla_class *, struct tesla_instance *, + const struct tesla_transitions *, uint32_t index); + +void tesla_state_notify_fail(struct tesla_class *, struct tesla_instance *, + const struct tesla_transitions *); + +void tesla_state_notify_pass(struct tesla_class *, struct tesla_instance *); + +/* * DTrace notifications of various events. */ void tesla_state_transition_dtrace(struct tesla_class *, - struct tesla_instance *); + struct tesla_instance *, const struct tesla_transitions *, + uint32_t transition_index); void tesla_assert_fail_dtrace(struct tesla_class *, - struct tesla_instance *); + struct tesla_instance *, const struct tesla_transitions *); void tesla_assert_pass_dtrace(struct tesla_class *, struct tesla_instance *); ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#6 (text+ko) ==== @@ -83,8 +83,6 @@ } tesla_table *table = class->ts_table; - tesla_instance *start = table->tt_instances; - assert(table->tt_length <= 32); // Did we match any instances? @@ -141,8 +139,8 @@ // instructed to fork), just update the state. if (!(t->flags & TESLA_TRANS_FORK) && key->tk_mask == k->tk_mask) { - VERBOSE_PRINT("update %td: %tx->%tx\n", - inst - start, t->from, t->to); + tesla_state_notify_transition(class, inst, + trans, j); inst->ti_state = t->to; break; @@ -150,14 +148,12 @@ // If the keys weren't an exact match, we need to fork // a new (more specific) automaton instance. + tesla_state_notify_clone(class, inst, trans, j); + struct tesla_instance *clone = clones + cloned++; *clone = *inst; clone->ti_state = t->to; - VERBOSE_PRINT("clone %td:%tx -> %tx\n", - inst - start, inst->ti_state, - t->to); - CHECK(tesla_key_union, &clone->ti_key, key); break; } @@ -184,8 +180,7 @@ assert(tesla_instance_active(inst)); matched_something = true; - VERBOSE_PRINT("new %td: %tx\n", - inst - start, inst->ti_state); + tesla_state_notify_new_instance(class, inst); } if (t->flags & TESLA_TRANS_CLEANUP) { From owner-p4-projects@FreeBSD.ORG Mon Mar 18 22:04:00 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E46318CC; Mon, 18 Mar 2013 22:03:59 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id A17DD8C8 for ; Mon, 18 Mar 2013 22:03:59 +0000 (UTC) (envelope-from jonathan@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 91D84FC4 for ; Mon, 18 Mar 2013 22:03:59 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2IM3xK4045367 for ; Mon, 18 Mar 2013 22:03:59 GMT (envelope-from jonathan@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2IM3x1V045364 for perforce@freebsd.org; Mon, 18 Mar 2013 22:03:59 GMT (envelope-from jonathan@freebsd.org) Date: Mon, 18 Mar 2013 22:03:59 GMT Message-Id: <201303182203.r2IM3x1V045364@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jonathan@freebsd.org using -f From: Jonathan Anderson Subject: PERFORCE change 223023 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 22:04:00 -0000 http://p4web.freebsd.org/@@223023?ac=10 Change 223023 by jonathan@jonathan-on-joe on 2013/03/18 22:03:06 Update to upstream commit 9ac8889b. Obtained from: https://github.com/CTSRD-TESLA/TESLA/commit/9ac8889ba8d19732b347fba935d3b9b0e77a28fd Affected files ... .. //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_notification.c#2 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_notification.c#2 (text+ko) ==== @@ -48,6 +48,12 @@ VERBOSE_PRINT("new %td: %tx\n", tip - tcp->ts_table->tt_instances, tip->ti_state); + + /* + * XXXJA: convince self that we can never "pass" an assertion + * with an event that creates a new instance + */ + break; } } @@ -72,6 +78,10 @@ VERBOSE_PRINT("clone %td:%tx -> %tx\n", tip - tcp->ts_table->tt_instances, tip->ti_state, t->to); + + if (t->flags & TESLA_TRANS_CLEANUP) + tesla_state_notify_pass(tcp, tip); + break; } } @@ -97,6 +107,10 @@ VERBOSE_PRINT("update %td: %tx->%tx\n", tip - tcp->ts_table->tt_instances, t->from, t->to); + + if (t->flags & TESLA_TRANS_CLEANUP) + tesla_state_notify_pass(tcp, tip); + break; } } @@ -128,7 +142,8 @@ return; default: - /* for now, don't do anything */ + VERBOSE_PRINT("pass '%s': %td\n", tcp->ts_name, + tip - tcp->ts_table->tt_instances); break; } } From owner-p4-projects@FreeBSD.ORG Mon Mar 18 22:06:02 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5BDBE9DD; Mon, 18 Mar 2013 22:06:02 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 1CFA79DA for ; Mon, 18 Mar 2013 22:06:02 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id E641BFDC for ; Mon, 18 Mar 2013 22:06:01 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2IM611C045668 for ; Mon, 18 Mar 2013 22:06:01 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2IM61KD045665 for perforce@freebsd.org; Mon, 18 Mar 2013 22:06:01 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 22:06:01 GMT Message-Id: <201303182206.r2IM61KD045665@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 223024 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 22:06:02 -0000 http://p4web.freebsd.org/@@223024?ac=10 Change 223024 by rwatson@rwatson_cinnamon on 2013/03/18 22:05:05 Integrate "pass" notifications into kernel version of libtesla for use with DTrace. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_notification.c#2 integrate Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_notification.c#2 (text+ko) ==== @@ -48,6 +48,12 @@ VERBOSE_PRINT("new %td: %tx\n", tip - tcp->ts_table->tt_instances, tip->ti_state); + + /* + * XXXJA: convince self that we can never "pass" an assertion + * with an event that creates a new instance + */ + break; } } @@ -72,6 +78,10 @@ VERBOSE_PRINT("clone %td:%tx -> %tx\n", tip - tcp->ts_table->tt_instances, tip->ti_state, t->to); + + if (t->flags & TESLA_TRANS_CLEANUP) + tesla_state_notify_pass(tcp, tip); + break; } } @@ -97,6 +107,10 @@ VERBOSE_PRINT("update %td: %tx->%tx\n", tip - tcp->ts_table->tt_instances, t->from, t->to); + + if (t->flags & TESLA_TRANS_CLEANUP) + tesla_state_notify_pass(tcp, tip); + break; } } @@ -128,7 +142,8 @@ return; default: - /* for now, don't do anything */ + VERBOSE_PRINT("pass '%s': %td\n", tcp->ts_name, + tip - tcp->ts_table->tt_instances); break; } } From owner-p4-projects@FreeBSD.ORG Mon Mar 18 22:06:02 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9B86CA9D; Mon, 18 Mar 2013 22:06:02 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 44D9F9DB for ; Mon, 18 Mar 2013 22:06:02 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 19548FDD for ; Mon, 18 Mar 2013 22:06:02 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2IM61oW045674 for ; Mon, 18 Mar 2013 22:06:01 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2IM617E045671 for perforce@freebsd.org; Mon, 18 Mar 2013 22:06:01 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 22:06:01 GMT Message-Id: <201303182206.r2IM617E045671@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 223025 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 22:06:03 -0000 http://p4web.freebsd.org/@@223025?ac=10 Change 223025 by rwatson@rwatson_cinnamon on 2013/03/18 22:05:51 Properly merge userspace libtesla DTrace changes; I have clearly wielded P4 incorrectly when looping back changes. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_dtrace.c#3 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_dtrace.c#3 (text+ko) ==== @@ -43,39 +43,66 @@ "struct tesla_instance *"); SDT_PROBE_DEFINE2(tesla, kernel, assert, pass, pass, "struct tesla_class *", "struct tesla_instance *"); -#endif -/* - * XXXRW: Several of these functions might want additional state-related - * arguments -- e.g., next-state for transition, etc. - */ void tesla_state_transition_dtrace(struct tesla_class *tcp, - struct tesla_instance *tip) + struct tesla_instance *tip, + __unused const struct tesla_transitions *transp, + __unused uint32_t transition_index) { -#ifdef _KERNEL SDT_PROBE(tesla, kernel, , state_transition, tcp, tip, 0, 0, 0); -#else -#endif } void -tesla_assert_fail_dtrace(struct tesla_class *tcp, struct tesla_instance *tip) +tesla_assert_fail_dtrace(struct tesla_class *tcp, struct tesla_instance *tip, + __unused const struct tesla_transitions *transp) { -#ifdef _KERNEL - SDT_PROBE(tesla, kernel, assert, fail, tcp, tip, 0, 0, 0); -#else -#endif + if (tip) + SDT_PROBE(tesla, kernel, assert, fail, tcp, tip, 0, 0, 0); + + /* XXXRW: + * 'tip' could be NULL if we failed to match any automaton instances + * to go with a supplied key; perhaps a separate probe? + */ } void tesla_assert_pass_dtrace(struct tesla_class *tcp, struct tesla_instance *tip) { -#ifdef _KERNEL SDT_PROBE(tesla, kernel, assert, pass, tcp, tip, 0, 0, 0); -#else -#endif +} + +#else /* !_KERNEL */ + +void +tesla_state_transition_dtrace(__unused struct tesla_class *tcp, + __unused struct tesla_instance *tip, + __unused const struct tesla_transitions *transp, + __unused uint32_t transition_index) +{ + + assert(0 && "DTrace not implemented in userspace"); +} + +void +tesla_assert_fail_dtrace(__unused struct tesla_class *tcp, + __unused struct tesla_instance *tip, + __unused const struct tesla_transitions *transp) +{ + + assert(0 && "DTrace not implemented in userspace"); +} + +void +tesla_assert_pass_dtrace(__unused struct tesla_class *tcp, + __unused struct tesla_instance *tip) +{ + + assert(0 && "DTrace not implemented in userspace"); } + +#endif /* _KERNEL */ + From owner-p4-projects@FreeBSD.ORG Mon Mar 18 22:07:04 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 304B9BC0; Mon, 18 Mar 2013 22:07:04 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id E5703BBE for ; Mon, 18 Mar 2013 22:07:03 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id D3B32FF2 for ; Mon, 18 Mar 2013 22:07:03 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2IM73wr045770 for ; Mon, 18 Mar 2013 22:07:03 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2IM73ah045767 for perforce@freebsd.org; Mon, 18 Mar 2013 22:07:03 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 18 Mar 2013 22:07:03 GMT Message-Id: <201303182207.r2IM73ah045767@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 223026 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Mar 2013 22:07:04 -0000 http://p4web.freebsd.org/@@223026?ac=10 Change 223026 by rwatson@rwatson_cinnamon on 2013/03/18 22:06:24 Hook up tesla_notification.c to kernel build; remove duplicated stub function now that it has been merged upstream (in a different spot). Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/conf/files#5 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla.h#5 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/conf/files#5 (text+ko) ==== @@ -2875,6 +2875,7 @@ libtesla/state-perthread.c optional tesla libtesla/store.c optional tesla libtesla/tesla_dtrace.c optional tesla kdtrace_hooks +libtesla/tesla_notification.c optional tesla libtesla/update.c optional tesla libtesla/util.c optional tesla net/bpf.c standard ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla.h#5 (text+ko) ==== @@ -152,12 +152,6 @@ #define __tesla_optional(...) 0 #define __tesla_any(...) 0 -inline void -__tesla_inline_assertion(const char *filename, int line, int count, - __tesla_locality *loc, ...) -{ -} - #endif /* __TESLA_ANALYSER__ */ #endif /* TESLA_H */ From owner-p4-projects@FreeBSD.ORG Wed Mar 20 18:57:06 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 502E94F6; Wed, 20 Mar 2013 18:57:06 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 11CA74F4 for ; Wed, 20 Mar 2013 18:57:06 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id E0003E1C for ; Wed, 20 Mar 2013 18:57:05 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2KIv5FS023500 for ; Wed, 20 Mar 2013 18:57:05 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2KIv5I0023497 for perforce@freebsd.org; Wed, 20 Mar 2013 18:57:05 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Wed, 20 Mar 2013 18:57:05 GMT Message-Id: <201303201857.r2KIv5I0023497@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 223080 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Mar 2013 18:57:06 -0000 http://p4web.freebsd.org/@@223080?ac=10 Change 223080 by rwatson@rwatson_cinnamon on 2013/03/20 18:56:54 Merge libtesla from github through 8e193990d1df2418cc3b579309ad85501156e295. Affected files ... .. //depot/projects/ctsrd/tesla/src/lib/libtesla/Makefile#3 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/debug.c#4 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/libtesla.h#4 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/state.c#5 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_internal.h#5 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_notification.c#3 edit .. //depot/projects/ctsrd/tesla/src/lib/libtesla/update.c#6 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/Makefile#3 (text+ko) ==== @@ -7,8 +7,8 @@ CFLAGS+= -I${.CURDIR} INCS= tesla.h libtesla.h -SRCS= debug.c key.c tesla_dtrace.c tesla_notification.c state.c state-global.c - state-perthread.c store.c update.c util.c +SRCS= debug.c key.c tesla_dtrace.c tesla_notification.c state.c \ + state-global.c state-perthread.c store.c update.c util.c .include ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/debug.c#4 (text+ko) ==== @@ -37,61 +37,73 @@ #include #endif -#define SAFE_SPRINTF(dest, end, ...) \ - dest += snprintf(dest, end - dest, __VA_ARGS__); \ - if (dest >= end) \ - return (TESLA_ERROR_ENOMEM); +void +print_transitions(const struct tesla_transitions *transp) +{ + char buffer[1024]; + char *end = buffer + sizeof(buffer); + + sprint_transitions(buffer, end, transp); + print("%s", buffer); +} char* -transition_matrix(const struct tesla_transitions *trans) +sprint_transitions(char *buffer, const char *end, + const struct tesla_transitions *tp) { - static const char EACH[] = "(%d:0x%tx -> %d%s%s%s) "; + char *c = buffer; + + SAFE_SPRINTF(c, end, "[ "); + + for (size_t i = 0; i < tp->length; i++) { + const tesla_transition *t = tp->transitions + i; + + /* Note: On at least one Mac, combining the following + * into a single snprintf() causes the wrong thing + * to be printed (instead of t->mask, we get an address!). + */ + SAFE_SPRINTF(c, end, "(%d:", t->from); + SAFE_SPRINTF(c, end, "0x%tx", t->mask); + SAFE_SPRINTF(c, end, " -> %d", t->to); + + if (t->flags & TESLA_TRANS_FORK) + SAFE_SPRINTF(c, end, " "); - size_t needed = trans->length * (sizeof(EACH) + 12) + 4; - char *buffer = tesla_malloc(needed); - char *c = buffer; + if (t->flags & TESLA_TRANS_INIT) + SAFE_SPRINTF(c, end, " "); - c += sprintf(c, "[ "); + if (t->flags & TESLA_TRANS_CLEANUP) + SAFE_SPRINTF(c, end, " "); - for (size_t i = 0; i < trans->length; i++) { - const tesla_transition *t = trans->transitions + i; - c += sprintf(c, EACH, t->from, t->mask, t->to, - (t->flags & TESLA_TRANS_FORK ? " " : ""), - (t->flags & TESLA_TRANS_INIT ? " " : ""), - (t->flags & TESLA_TRANS_CLEANUP ? " " : "") - ); + SAFE_SPRINTF(c, end, ") "); } - c += sprintf(c, "]"); + SAFE_SPRINTF(c, end, "]"); - return buffer; + return c; } -int -key_string(char *buffer, size_t len, const struct tesla_key *key) +char* +key_string(char *buffer, const char *end, const struct tesla_key *key) { - char *current = buffer; - const char *end = buffer + len; + char *c = buffer; - SAFE_SPRINTF(current, end, "0x%tx [ ", key->tk_mask); + SAFE_SPRINTF(c, end, "0x%tx [ ", key->tk_mask); for (int32_t i = 0; i < TESLA_KEY_SIZE; i++) { - if (key->tk_mask & (1 << i)) { - SAFE_SPRINTF(current, end, "%tx ", key->tk_keys[i]); - } else { - SAFE_SPRINTF(current, end, "X "); - } + if (key->tk_mask & (1 << i)) + SAFE_SPRINTF(c, end, "%tx ", key->tk_keys[i]); + else + SAFE_SPRINTF(c, end, "X "); } - SAFE_SPRINTF(current, end, "]"); + SAFE_SPRINTF(c, end, "]"); - return (TESLA_SUCCESS); + return c; } #ifndef NDEBUG -#define print DEBUG_PRINT - /* TODO: kernel version... probably just say no? */ int32_t verbose_debug() @@ -167,11 +179,12 @@ { static const size_t LEN = 15 * TESLA_KEY_SIZE + 10; char buffer[LEN]; + char *end = buffer + LEN; - int err = key_string(buffer, LEN, key); - assert(err == TESLA_SUCCESS); + char *e = key_string(buffer, end, key); + assert(e < end); - printf("%s", buffer); + print("%s", buffer); } #endif /* !NDEBUG */ ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/libtesla.h#4 (text+ko) ==== @@ -205,14 +205,6 @@ #define TESLA_SCOPE_PERTHREAD 1 #define TESLA_SCOPE_GLOBAL 2 -/** - * Set the action to take when a TESLA assertion fails; implemented via a - * callback from the TESLA runtime. - */ -typedef void (*tesla_assert_fail_callback)(const struct tesla_instance *tip); -void tesla_class_setaction(struct tesla_class *tsp, - tesla_assert_fail_callback handler); - /** * Checks whether or not a TESLA automata instance is active (in use). @@ -242,15 +234,4 @@ void tesla_instance_destroy(struct tesla_class *tsp, struct tesla_instance *tip); -/** - * Function to invoke when a TESLA assertion fails. - * - * May not actually fail stop at this point, so assertions must handle - * continuation after this call. Further cases of this particular instance - * firing should be suppressed so that e.g. DTrace probes fire only once - * per failure. - */ -void tesla_assert_fail(struct tesla_class *tsp, - struct tesla_instance *tip, const struct tesla_transitions*); - #endif /* _TESLA_STATE */ ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/state.c#5 (text+ko) ==== @@ -211,92 +211,3 @@ assert(0 && "unhandled TESLA context"); } } - -void -tesla_match_fail(struct tesla_class *class, const struct tesla_key *key, - const struct tesla_transitions *trans) -{ - assert(class !=NULL); - - if (class->ts_handler != NULL) { - class->ts_handler(NULL); - return; - } - - static const char *message = - "TESLA failure in automaton '%s':\n%s\n\n" - "no instance found to match key '%s' for transition(s) %s"; - - // Assume a pretty big key... - static const size_t LEN = 160; - char key_str[LEN]; - int err = key_string(key_str, LEN, key); - assert(err == TESLA_SUCCESS); - - char *trans_str = transition_matrix(trans); - - switch (class->ts_action) { - case TESLA_ACTION_FAILSTOP: - tesla_panic(message, class->ts_name, class->ts_description, - key_str, trans_str); - break; - - case TESLA_ACTION_DTRACE: - tesla_assert_fail_dtrace(class, NULL, trans); - return; - - case TESLA_ACTION_PRINTF: -#if defined(_KERNEL) && defined(KDB) - kdb_backtrace(); -#endif - printf(message, class->ts_name, class->ts_description, - key_str, trans_str); - break; - } - - tesla_free(trans_str); -} - -void -tesla_assert_fail(struct tesla_class *tsp, struct tesla_instance *tip, - const struct tesla_transitions *trans) -{ - assert(tsp != NULL); - assert(tip != NULL); - - if (tsp->ts_handler != NULL) { - tsp->ts_handler(tip); - return; - } - - switch (tsp->ts_action) { - case TESLA_ACTION_FAILSTOP: - tesla_panic( - "TESLA failure; in automaton '%s':\n%s\n\n" - "required to take a transition in %s " - "but currently in state %d", - tsp->ts_name, tsp->ts_description, - transition_matrix(trans), tip->ti_state); - break; /* A bit gratuitous. */ - - case TESLA_ACTION_DTRACE: - tesla_assert_fail_dtrace(tsp, tip, trans); - return; - - case TESLA_ACTION_PRINTF: -#if defined(_KERNEL) && defined(KDB) - kdb_backtrace(); -#endif - printf("tesla_assert_failed: %s: %s\n", tsp->ts_name, - tsp->ts_description); - break; - } -} - -void -tesla_class_setaction(struct tesla_class *tsp, - tesla_assert_fail_callback handler) -{ - - tsp->ts_handler = handler; -} ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_internal.h#5 (text+ko) ==== @@ -106,33 +106,6 @@ int32_t tesla_key_union(struct tesla_key *dest, const struct tesla_key *source); -#ifndef NDEBUG - -#define __debug - -#ifdef _KERNEL -#include -#define DEBUG_PRINT(...) printf(__VA_ARGS__) -#else -#include -#define DEBUG_PRINT(...) printf(__VA_ARGS__) -#endif -#define VERBOSE_PRINT(...) if (verbose_debug()) DEBUG_PRINT(__VA_ARGS__) - -/** Are we in (verbose) debug mode? */ -int32_t verbose_debug(void); - -#else // NDEBUG - -// When not in debug mode, some values might not get checked. -#define __debug __unused -#define DEBUG_PRINT(...) -#define VERBOSE_PRINT(...) - -int32_t verbose_debug(void) { return 0; } - -#endif - #ifndef __unused #if __has_attribute(unused) #define __unused __attribute__((unused)) @@ -198,7 +171,6 @@ const char *ts_description;/* Description of the assertion. */ uint32_t ts_scope; /* Per-thread or global. */ uint32_t ts_limit; /* Simultaneous automata limit. */ - tesla_assert_fail_callback ts_handler; /* Run on failure. */ uint32_t ts_action; /* What to do on failure. */ /* @@ -248,9 +220,11 @@ int tesla_class_init(struct tesla_class*, uint32_t context, uint32_t instances); +#if 0 //! We have failed to find an instance that matches a @ref tesla_key. void tesla_match_fail(struct tesla_class*, const struct tesla_key*, const struct tesla_transitions*); +#endif /* * XXXRW: temporarily, maximum number of classes and instances are hard-coded @@ -289,19 +263,28 @@ /* * Event notification: */ -void tesla_state_notify_new_instance(struct tesla_class *, +/** A new @ref tesla_instance has been created. */ +void tesla_notify_new_instance(struct tesla_class *, struct tesla_instance *); -void tesla_state_notify_transition(struct tesla_class *, - struct tesla_instance *, const struct tesla_transitions *, uint32_t index); +/** A @ref tesla_instance has taken an expected transition. */ +void tesla_notify_transition(struct tesla_class *, struct tesla_instance *, + const struct tesla_transitions *, uint32_t index); -void tesla_state_notify_clone(struct tesla_class *, struct tesla_instance *, +/** An exisiting @ref tesla_instance has been cloned because of an event. */ +void tesla_notify_clone(struct tesla_class *, struct tesla_instance *, const struct tesla_transitions *, uint32_t index); -void tesla_state_notify_fail(struct tesla_class *, struct tesla_instance *, +/** A @ref tesla_instance was unable to take any of a set of transitions. */ +void tesla_notify_assert_fail(struct tesla_class *, struct tesla_instance *, + const struct tesla_transitions *); + +/** No @ref tesla_class instance was found to match a @ref tesla_key. */ +void tesla_notify_match_fail(struct tesla_class *, const struct tesla_key *, const struct tesla_transitions *); -void tesla_state_notify_pass(struct tesla_class *, struct tesla_instance *); +/** A @ref tesla_instance has "passed" (worked through the automaton). */ +void tesla_notify_pass(struct tesla_class *, struct tesla_instance *); /* * DTrace notifications of various events. @@ -318,6 +301,47 @@ * Debug helpers. */ +#define SAFE_SPRINTF(current, end, ...) do { \ + int written = snprintf(current, end - current, __VA_ARGS__); \ + if ((written > 0) && (current + written < end)) \ + current += written; \ +} while (0) + +#define print(...) printf(__VA_ARGS__) + +#ifdef _KERNEL +#define error(...) printf(__VA_ARGS__) +#else +#define error(...) fprintf(stderr, __VA_ARGS__) +#endif + +#ifndef NDEBUG + +#define __debug + +#ifdef _KERNEL +#include +#define DEBUG_PRINT(...) print(__VA_ARGS__) +#else +#include +#define DEBUG_PRINT(...) print(__VA_ARGS__) +#endif +#define VERBOSE_PRINT(...) if (verbose_debug()) DEBUG_PRINT(__VA_ARGS__) + +/** Are we in (verbose) debug mode? */ +int32_t verbose_debug(void); + +#else // NDEBUG + +// When not in debug mode, some values might not get checked. +#define __debug __unused +#define DEBUG_PRINT(...) +#define VERBOSE_PRINT(...) + +int32_t verbose_debug(void) { return 0; } + +#endif + /** * Assert that a @ref tesla_instance is an instance of a @ref tesla_class. * @@ -330,7 +354,7 @@ void assert_instanceof(struct tesla_instance *i, struct tesla_class *tclass); /** Print a key into a buffer. */ -int key_string(char *buffer, size_t len, const struct tesla_key *key); +char* key_string(char *buffer, const char *end, const struct tesla_key *); /** Print a @ref tesla_key to stderr. */ void print_key(const struct tesla_key *key); @@ -338,7 +362,11 @@ /** Print a @ref tesla_class to stderr. */ void print_class(const struct tesla_class*); -/** Provide a human-readable rendition of a transition matrix. */ -char* transition_matrix(const struct tesla_transitions*); +/** Print a human-readable version of @ref tesla_transitions. */ +void print_transitions(const struct tesla_transitions *); + +/** Print a human-readable version of @ref tesla_transitions into a buffer. */ +char* sprint_transitions(char *buffer, const char *end, + const struct tesla_transitions *); #endif /* TESLA_INTERNAL_H */ ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/tesla_notification.c#3 (text+ko) ==== @@ -32,8 +32,12 @@ #include "tesla_internal.h" +#define ERROR_BUFFER_LENGTH 1024 + +static void print_failure_header(const struct tesla_class *); + void -tesla_state_notify_new_instance(struct tesla_class *tcp, +tesla_notify_new_instance(struct tesla_class *tcp, struct tesla_instance *tip) { @@ -59,7 +63,7 @@ } void -tesla_state_notify_clone(struct tesla_class *tcp, struct tesla_instance *tip, +tesla_notify_clone(struct tesla_class *tcp, struct tesla_instance *tip, const struct tesla_transitions *transp, uint32_t index) { @@ -80,7 +84,7 @@ tip->ti_state, t->to); if (t->flags & TESLA_TRANS_CLEANUP) - tesla_state_notify_pass(tcp, tip); + tesla_notify_pass(tcp, tip); break; } @@ -88,7 +92,7 @@ } void -tesla_state_notify_transition(struct tesla_class *tcp, +tesla_notify_transition(struct tesla_class *tcp, struct tesla_instance *tip, const struct tesla_transitions *transp, uint32_t index) { @@ -109,7 +113,7 @@ t->from, t->to); if (t->flags & TESLA_TRANS_CLEANUP) - tesla_state_notify_pass(tcp, tip); + tesla_notify_pass(tcp, tip); break; } @@ -117,23 +121,86 @@ } void -tesla_state_notify_fail(struct tesla_class *tcp, struct tesla_instance *tip, +tesla_notify_assert_fail(struct tesla_class *tcp, struct tesla_instance *tip, const struct tesla_transitions *transp) { + assert(tcp != NULL); + assert(tip != NULL); + + if (tcp->ts_action == TESLA_ACTION_DTRACE) { + tesla_assert_fail_dtrace(tcp, tip, transp); + return; + } + + print_failure_header(tcp); + char buffer[ERROR_BUFFER_LENGTH]; + char *next = buffer; + const char *end = buffer + sizeof(buffer); + + SAFE_SPRINTF(next, end, + "Instance %td is in state %d\n" + "but required to take a transition in ", + (tip - tcp->ts_table->tt_instances), tip->ti_state); + assert(next > buffer); + + next = sprint_transitions(next, end, transp); + switch (tcp->ts_action) { case TESLA_ACTION_DTRACE: - tesla_assert_fail_dtrace(tcp, tip, transp); + assert(0 && "handled above"); + return; + + case TESLA_ACTION_FAILSTOP: + tesla_panic("%s", buffer); + break; + + case TESLA_ACTION_PRINTF: + error("%s", buffer); + break; + } +} + +void +tesla_notify_match_fail(struct tesla_class *tcp, const struct tesla_key *tkp, + const struct tesla_transitions *transp) +{ + assert(tcp != NULL); + assert(tkp != NULL); + + if (tcp->ts_action == TESLA_ACTION_DTRACE) { + tesla_assert_fail_dtrace(tcp, NULL, NULL); return; + } + + print_failure_header(tcp); + + char buffer[ERROR_BUFFER_LENGTH]; + char *next = buffer; + const char *end = buffer + sizeof(buffer); + + SAFE_SPRINTF(next, end, "No instance matched key '"); + next = key_string(next, end, tkp); + SAFE_SPRINTF(next, end, "' for transition(s) "); + next = sprint_transitions(next, end, transp); + + switch (tcp->ts_action) { + case TESLA_ACTION_DTRACE: + assert(0 && "handled above"); + break; - default: - /* for now, don't do anything */ + case TESLA_ACTION_FAILSTOP: + tesla_panic("%s", buffer); + break; + + case TESLA_ACTION_PRINTF: + error("%s", buffer); break; } } void -tesla_state_notify_pass(struct tesla_class *tcp, struct tesla_instance *tip) +tesla_notify_pass(struct tesla_class *tcp, struct tesla_instance *tip) { switch (tcp->ts_action) { @@ -148,3 +215,16 @@ } } + +static void +print_failure_header(const struct tesla_class *tcp) +{ + + error("\n\nTESLA failure:\n"); +#if defined(_KERNEL) && defined(KDB) + kdb_backtrace(); +#endif + + error("In automaton '%s':\n%s\n", tcp->ts_name, tcp->ts_description); +} + ==== //depot/projects/ctsrd/tesla/src/lib/libtesla/update.c#6 (text+ko) ==== @@ -58,10 +58,8 @@ : "per-thread")); DEBUG_PRINT(" class: %d ('%s')\n", class_id, name); - char *matrix = transition_matrix(trans); - DEBUG_PRINT(" transitions: %s", matrix); - tesla_free(matrix); - + DEBUG_PRINT(" transitions: "); + print_transitions(trans); DEBUG_PRINT("\n"); DEBUG_PRINT(" key: "); print_key(key); @@ -139,8 +137,7 @@ // instructed to fork), just update the state. if (!(t->flags & TESLA_TRANS_FORK) && key->tk_mask == k->tk_mask) { - tesla_state_notify_transition(class, inst, - trans, j); + tesla_notify_transition(class, inst, trans, j); inst->ti_state = t->to; break; @@ -148,7 +145,7 @@ // If the keys weren't an exact match, we need to fork // a new (more specific) automaton instance. - tesla_state_notify_clone(class, inst, trans, j); + tesla_notify_clone(class, inst, trans, j); struct tesla_instance *clone = clones + cloned++; *clone = *inst; @@ -159,7 +156,7 @@ } if (transition_required && !transition_taken) - tesla_assert_fail(class, inst, trans); + tesla_notify_assert_fail(class, inst, trans); } // Move any clones into the instance. @@ -180,7 +177,7 @@ assert(tesla_instance_active(inst)); matched_something = true; - tesla_state_notify_new_instance(class, inst); + tesla_notify_new_instance(class, inst); } if (t->flags & TESLA_TRANS_CLEANUP) { @@ -195,7 +192,7 @@ } if (!matched_something) - tesla_match_fail(class, key, trans); + tesla_notify_match_fail(class, key, trans); tesla_class_put(class); From owner-p4-projects@FreeBSD.ORG Wed Mar 20 18:59:09 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C9A5270A; Wed, 20 Mar 2013 18:59:08 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 87187708 for ; Wed, 20 Mar 2013 18:59:08 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 76F29E56 for ; Wed, 20 Mar 2013 18:59:08 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2KIx8rv023588 for ; Wed, 20 Mar 2013 18:59:08 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2KIx8KR023585 for perforce@freebsd.org; Wed, 20 Mar 2013 18:59:08 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Wed, 20 Mar 2013 18:59:08 GMT Message-Id: <201303201859.r2KIx8KR023585@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 223081 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Mar 2013 18:59:09 -0000 http://p4web.freebsd.org/@@223081?ac=10 Change 223081 by rwatson@rwatson_cinnamon on 2013/03/20 18:59:00 Merge recent libtesla changes from userspace to kernel. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/Makefile#3 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/debug.c#5 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/libtesla.h#5 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#7 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla-macros.h#4 edit .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#10 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_notification.c#3 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#7 integrate Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/Makefile#3 (text+ko) ==== @@ -7,8 +7,8 @@ CFLAGS+= -I${.CURDIR} INCS= tesla.h libtesla.h -SRCS= debug.c key.c tesla_dtrace.c tesla_notification.c state.c state-global.c - state-perthread.c store.c update.c util.c +SRCS= debug.c key.c tesla_dtrace.c tesla_notification.c state.c \ + state-global.c state-perthread.c store.c update.c util.c .include ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/debug.c#5 (text+ko) ==== @@ -37,61 +37,73 @@ #include #endif -#define SAFE_SPRINTF(dest, end, ...) \ - dest += snprintf(dest, end - dest, __VA_ARGS__); \ - if (dest >= end) \ - return (TESLA_ERROR_ENOMEM); +void +print_transitions(const struct tesla_transitions *transp) +{ + char buffer[1024]; + char *end = buffer + sizeof(buffer); + + sprint_transitions(buffer, end, transp); + print("%s", buffer); +} char* -transition_matrix(const struct tesla_transitions *trans) +sprint_transitions(char *buffer, const char *end, + const struct tesla_transitions *tp) { - static const char EACH[] = "(%d:0x%tx -> %d%s%s%s) "; + char *c = buffer; + + SAFE_SPRINTF(c, end, "[ "); + + for (size_t i = 0; i < tp->length; i++) { + const tesla_transition *t = tp->transitions + i; + + /* Note: On at least one Mac, combining the following + * into a single snprintf() causes the wrong thing + * to be printed (instead of t->mask, we get an address!). + */ + SAFE_SPRINTF(c, end, "(%d:", t->from); + SAFE_SPRINTF(c, end, "0x%tx", t->mask); + SAFE_SPRINTF(c, end, " -> %d", t->to); + + if (t->flags & TESLA_TRANS_FORK) + SAFE_SPRINTF(c, end, " "); - size_t needed = trans->length * (sizeof(EACH) + 12) + 4; - char *buffer = tesla_malloc(needed); - char *c = buffer; + if (t->flags & TESLA_TRANS_INIT) + SAFE_SPRINTF(c, end, " "); - c += sprintf(c, "[ "); + if (t->flags & TESLA_TRANS_CLEANUP) + SAFE_SPRINTF(c, end, " "); - for (size_t i = 0; i < trans->length; i++) { - const tesla_transition *t = trans->transitions + i; - c += sprintf(c, EACH, t->from, t->mask, t->to, - (t->flags & TESLA_TRANS_FORK ? " " : ""), - (t->flags & TESLA_TRANS_INIT ? " " : ""), - (t->flags & TESLA_TRANS_CLEANUP ? " " : "") - ); + SAFE_SPRINTF(c, end, ") "); } - c += sprintf(c, "]"); + SAFE_SPRINTF(c, end, "]"); - return buffer; + return c; } -int -key_string(char *buffer, size_t len, const struct tesla_key *key) +char* +key_string(char *buffer, const char *end, const struct tesla_key *key) { - char *current = buffer; - const char *end = buffer + len; + char *c = buffer; - SAFE_SPRINTF(current, end, "0x%tx [ ", key->tk_mask); + SAFE_SPRINTF(c, end, "0x%tx [ ", key->tk_mask); for (int32_t i = 0; i < TESLA_KEY_SIZE; i++) { - if (key->tk_mask & (1 << i)) { - SAFE_SPRINTF(current, end, "%tx ", key->tk_keys[i]); - } else { - SAFE_SPRINTF(current, end, "X "); - } + if (key->tk_mask & (1 << i)) + SAFE_SPRINTF(c, end, "%tx ", key->tk_keys[i]); + else + SAFE_SPRINTF(c, end, "X "); } - SAFE_SPRINTF(current, end, "]"); + SAFE_SPRINTF(c, end, "]"); - return (TESLA_SUCCESS); + return c; } #ifndef NDEBUG -#define print DEBUG_PRINT - /* TODO: kernel version... probably just say no? */ int32_t verbose_debug() @@ -167,11 +179,12 @@ { static const size_t LEN = 15 * TESLA_KEY_SIZE + 10; char buffer[LEN]; + char *end = buffer + LEN; - int err = key_string(buffer, LEN, key); - assert(err == TESLA_SUCCESS); + char *e = key_string(buffer, end, key); + assert(e < end); - printf("%s", buffer); + print("%s", buffer); } #endif /* !NDEBUG */ ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/libtesla.h#5 (text+ko) ==== @@ -205,14 +205,6 @@ #define TESLA_SCOPE_PERTHREAD 1 #define TESLA_SCOPE_GLOBAL 2 -/** - * Set the action to take when a TESLA assertion fails; implemented via a - * callback from the TESLA runtime. - */ -typedef void (*tesla_assert_fail_callback)(const struct tesla_instance *tip); -void tesla_class_setaction(struct tesla_class *tsp, - tesla_assert_fail_callback handler); - /** * Checks whether or not a TESLA automata instance is active (in use). @@ -242,15 +234,4 @@ void tesla_instance_destroy(struct tesla_class *tsp, struct tesla_instance *tip); -/** - * Function to invoke when a TESLA assertion fails. - * - * May not actually fail stop at this point, so assertions must handle - * continuation after this call. Further cases of this particular instance - * firing should be suppressed so that e.g. DTrace probes fire only once - * per failure. - */ -void tesla_assert_fail(struct tesla_class *tsp, - struct tesla_instance *tip, const struct tesla_transitions*); - #endif /* _TESLA_STATE */ ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#7 (text+ko) ==== @@ -211,92 +211,3 @@ assert(0 && "unhandled TESLA context"); } } - -void -tesla_match_fail(struct tesla_class *class, const struct tesla_key *key, - const struct tesla_transitions *trans) -{ - assert(class !=NULL); - - if (class->ts_handler != NULL) { - class->ts_handler(NULL); - return; - } - - static const char *message = - "TESLA failure in automaton '%s':\n%s\n\n" - "no instance found to match key '%s' for transition(s) %s"; - - // Assume a pretty big key... - static const size_t LEN = 160; - char key_str[LEN]; - int err = key_string(key_str, LEN, key); - assert(err == TESLA_SUCCESS); - - char *trans_str = transition_matrix(trans); - - switch (class->ts_action) { - case TESLA_ACTION_FAILSTOP: - tesla_panic(message, class->ts_name, class->ts_description, - key_str, trans_str); - break; - - case TESLA_ACTION_DTRACE: - tesla_assert_fail_dtrace(class, NULL, trans); - return; - - case TESLA_ACTION_PRINTF: -#if defined(_KERNEL) && defined(KDB) - kdb_backtrace(); -#endif - printf(message, class->ts_name, class->ts_description, - key_str, trans_str); - break; - } - - tesla_free(trans_str); -} - -void -tesla_assert_fail(struct tesla_class *tsp, struct tesla_instance *tip, - const struct tesla_transitions *trans) -{ - assert(tsp != NULL); - assert(tip != NULL); - - if (tsp->ts_handler != NULL) { - tsp->ts_handler(tip); - return; - } - - switch (tsp->ts_action) { - case TESLA_ACTION_FAILSTOP: - tesla_panic( - "TESLA failure; in automaton '%s':\n%s\n\n" - "required to take a transition in %s " - "but currently in state %d", - tsp->ts_name, tsp->ts_description, - transition_matrix(trans), tip->ti_state); - break; /* A bit gratuitous. */ - - case TESLA_ACTION_DTRACE: - tesla_assert_fail_dtrace(tsp, tip, trans); - return; - - case TESLA_ACTION_PRINTF: -#if defined(_KERNEL) && defined(KDB) - kdb_backtrace(); -#endif - printf("tesla_assert_failed: %s: %s\n", tsp->ts_name, - tsp->ts_description); - break; - } -} - -void -tesla_class_setaction(struct tesla_class *tsp, - tesla_assert_fail_callback handler) -{ - - tsp->ts_handler = handler; -} ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla-macros.h#4 (text+ko) ==== @@ -95,6 +95,15 @@ /** A more programmer-friendly way to write assertions about the future. */ #define eventually(x) TSEQUENCE(TESLA_NOW, x) +#ifdef _KERNEL + +#define TESLA_SYSCALL(x) TESLA_PERTHREAD( \ + callee(returned(syscall_thread_enter)), \ + callee(called(syscall_thread_exit)), \ + x) + +#endif + #endif /* !TESLA_MACROS_H */ ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#10 (text+ko) ==== @@ -106,33 +106,6 @@ int32_t tesla_key_union(struct tesla_key *dest, const struct tesla_key *source); -#ifndef NDEBUG - -#define __debug - -#ifdef _KERNEL -#include -#define DEBUG_PRINT(...) printf(__VA_ARGS__) -#else -#include -#define DEBUG_PRINT(...) printf(__VA_ARGS__) -#endif -#define VERBOSE_PRINT(...) if (verbose_debug()) DEBUG_PRINT(__VA_ARGS__) - -/** Are we in (verbose) debug mode? */ -int32_t verbose_debug(void); - -#else // NDEBUG - -// When not in debug mode, some values might not get checked. -#define __debug __unused -#define DEBUG_PRINT(...) -#define VERBOSE_PRINT(...) - -int32_t verbose_debug(void) { return 0; } - -#endif - #ifndef __unused #if __has_attribute(unused) #define __unused __attribute__((unused)) @@ -198,7 +171,6 @@ const char *ts_description;/* Description of the assertion. */ uint32_t ts_scope; /* Per-thread or global. */ uint32_t ts_limit; /* Simultaneous automata limit. */ - tesla_assert_fail_callback ts_handler; /* Run on failure. */ uint32_t ts_action; /* What to do on failure. */ /* @@ -248,9 +220,11 @@ int tesla_class_init(struct tesla_class*, uint32_t context, uint32_t instances); +#if 0 //! We have failed to find an instance that matches a @ref tesla_key. void tesla_match_fail(struct tesla_class*, const struct tesla_key*, const struct tesla_transitions*); +#endif /* * XXXRW: temporarily, maximum number of classes and instances are hard-coded @@ -289,19 +263,28 @@ /* * Event notification: */ -void tesla_state_notify_new_instance(struct tesla_class *, +/** A new @ref tesla_instance has been created. */ +void tesla_notify_new_instance(struct tesla_class *, struct tesla_instance *); -void tesla_state_notify_transition(struct tesla_class *, - struct tesla_instance *, const struct tesla_transitions *, uint32_t index); +/** A @ref tesla_instance has taken an expected transition. */ +void tesla_notify_transition(struct tesla_class *, struct tesla_instance *, + const struct tesla_transitions *, uint32_t index); -void tesla_state_notify_clone(struct tesla_class *, struct tesla_instance *, +/** An exisiting @ref tesla_instance has been cloned because of an event. */ +void tesla_notify_clone(struct tesla_class *, struct tesla_instance *, const struct tesla_transitions *, uint32_t index); -void tesla_state_notify_fail(struct tesla_class *, struct tesla_instance *, +/** A @ref tesla_instance was unable to take any of a set of transitions. */ +void tesla_notify_assert_fail(struct tesla_class *, struct tesla_instance *, + const struct tesla_transitions *); + +/** No @ref tesla_class instance was found to match a @ref tesla_key. */ +void tesla_notify_match_fail(struct tesla_class *, const struct tesla_key *, const struct tesla_transitions *); -void tesla_state_notify_pass(struct tesla_class *, struct tesla_instance *); +/** A @ref tesla_instance has "passed" (worked through the automaton). */ +void tesla_notify_pass(struct tesla_class *, struct tesla_instance *); /* * DTrace notifications of various events. @@ -318,6 +301,47 @@ * Debug helpers. */ +#define SAFE_SPRINTF(current, end, ...) do { \ + int written = snprintf(current, end - current, __VA_ARGS__); \ + if ((written > 0) && (current + written < end)) \ + current += written; \ +} while (0) + +#define print(...) printf(__VA_ARGS__) + +#ifdef _KERNEL +#define error(...) printf(__VA_ARGS__) +#else +#define error(...) fprintf(stderr, __VA_ARGS__) +#endif + +#ifndef NDEBUG + +#define __debug + +#ifdef _KERNEL +#include +#define DEBUG_PRINT(...) print(__VA_ARGS__) +#else +#include +#define DEBUG_PRINT(...) print(__VA_ARGS__) +#endif +#define VERBOSE_PRINT(...) if (verbose_debug()) DEBUG_PRINT(__VA_ARGS__) + +/** Are we in (verbose) debug mode? */ +int32_t verbose_debug(void); + +#else // NDEBUG + +// When not in debug mode, some values might not get checked. +#define __debug __unused +#define DEBUG_PRINT(...) +#define VERBOSE_PRINT(...) + +int32_t verbose_debug(void) { return 0; } + +#endif + /** * Assert that a @ref tesla_instance is an instance of a @ref tesla_class. * @@ -330,7 +354,7 @@ void assert_instanceof(struct tesla_instance *i, struct tesla_class *tclass); /** Print a key into a buffer. */ -int key_string(char *buffer, size_t len, const struct tesla_key *key); +char* key_string(char *buffer, const char *end, const struct tesla_key *); /** Print a @ref tesla_key to stderr. */ void print_key(const struct tesla_key *key); @@ -338,7 +362,11 @@ /** Print a @ref tesla_class to stderr. */ void print_class(const struct tesla_class*); -/** Provide a human-readable rendition of a transition matrix. */ -char* transition_matrix(const struct tesla_transitions*); +/** Print a human-readable version of @ref tesla_transitions. */ +void print_transitions(const struct tesla_transitions *); + +/** Print a human-readable version of @ref tesla_transitions into a buffer. */ +char* sprint_transitions(char *buffer, const char *end, + const struct tesla_transitions *); #endif /* TESLA_INTERNAL_H */ ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_notification.c#3 (text+ko) ==== @@ -32,8 +32,12 @@ #include "tesla_internal.h" +#define ERROR_BUFFER_LENGTH 1024 + +static void print_failure_header(const struct tesla_class *); + void -tesla_state_notify_new_instance(struct tesla_class *tcp, +tesla_notify_new_instance(struct tesla_class *tcp, struct tesla_instance *tip) { @@ -59,7 +63,7 @@ } void -tesla_state_notify_clone(struct tesla_class *tcp, struct tesla_instance *tip, +tesla_notify_clone(struct tesla_class *tcp, struct tesla_instance *tip, const struct tesla_transitions *transp, uint32_t index) { @@ -80,7 +84,7 @@ tip->ti_state, t->to); if (t->flags & TESLA_TRANS_CLEANUP) - tesla_state_notify_pass(tcp, tip); + tesla_notify_pass(tcp, tip); break; } @@ -88,7 +92,7 @@ } void -tesla_state_notify_transition(struct tesla_class *tcp, +tesla_notify_transition(struct tesla_class *tcp, struct tesla_instance *tip, const struct tesla_transitions *transp, uint32_t index) { @@ -109,7 +113,7 @@ t->from, t->to); if (t->flags & TESLA_TRANS_CLEANUP) - tesla_state_notify_pass(tcp, tip); + tesla_notify_pass(tcp, tip); break; } @@ -117,23 +121,86 @@ } void -tesla_state_notify_fail(struct tesla_class *tcp, struct tesla_instance *tip, +tesla_notify_assert_fail(struct tesla_class *tcp, struct tesla_instance *tip, const struct tesla_transitions *transp) { + assert(tcp != NULL); + assert(tip != NULL); + + if (tcp->ts_action == TESLA_ACTION_DTRACE) { + tesla_assert_fail_dtrace(tcp, tip, transp); + return; + } + + print_failure_header(tcp); + char buffer[ERROR_BUFFER_LENGTH]; + char *next = buffer; + const char *end = buffer + sizeof(buffer); + + SAFE_SPRINTF(next, end, + "Instance %td is in state %d\n" + "but required to take a transition in ", + (tip - tcp->ts_table->tt_instances), tip->ti_state); + assert(next > buffer); + + next = sprint_transitions(next, end, transp); + switch (tcp->ts_action) { case TESLA_ACTION_DTRACE: - tesla_assert_fail_dtrace(tcp, tip, transp); + assert(0 && "handled above"); + return; + + case TESLA_ACTION_FAILSTOP: + tesla_panic("%s", buffer); + break; + + case TESLA_ACTION_PRINTF: + error("%s", buffer); + break; + } +} + +void +tesla_notify_match_fail(struct tesla_class *tcp, const struct tesla_key *tkp, + const struct tesla_transitions *transp) +{ + assert(tcp != NULL); + assert(tkp != NULL); + + if (tcp->ts_action == TESLA_ACTION_DTRACE) { + tesla_assert_fail_dtrace(tcp, NULL, NULL); return; + } + + print_failure_header(tcp); + + char buffer[ERROR_BUFFER_LENGTH]; + char *next = buffer; + const char *end = buffer + sizeof(buffer); + + SAFE_SPRINTF(next, end, "No instance matched key '"); + next = key_string(next, end, tkp); + SAFE_SPRINTF(next, end, "' for transition(s) "); + next = sprint_transitions(next, end, transp); + + switch (tcp->ts_action) { + case TESLA_ACTION_DTRACE: + assert(0 && "handled above"); + break; - default: - /* for now, don't do anything */ + case TESLA_ACTION_FAILSTOP: + tesla_panic("%s", buffer); + break; + + case TESLA_ACTION_PRINTF: + error("%s", buffer); break; } } void -tesla_state_notify_pass(struct tesla_class *tcp, struct tesla_instance *tip) +tesla_notify_pass(struct tesla_class *tcp, struct tesla_instance *tip) { switch (tcp->ts_action) { @@ -148,3 +215,16 @@ } } + +static void +print_failure_header(const struct tesla_class *tcp) +{ + + error("\n\nTESLA failure:\n"); +#if defined(_KERNEL) && defined(KDB) + kdb_backtrace(); +#endif + + error("In automaton '%s':\n%s\n", tcp->ts_name, tcp->ts_description); +} + ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#7 (text+ko) ==== @@ -58,10 +58,8 @@ : "per-thread")); DEBUG_PRINT(" class: %d ('%s')\n", class_id, name); - char *matrix = transition_matrix(trans); - DEBUG_PRINT(" transitions: %s", matrix); - tesla_free(matrix); - + DEBUG_PRINT(" transitions: "); + print_transitions(trans); DEBUG_PRINT("\n"); DEBUG_PRINT(" key: "); print_key(key); @@ -139,8 +137,7 @@ // instructed to fork), just update the state. if (!(t->flags & TESLA_TRANS_FORK) && key->tk_mask == k->tk_mask) { - tesla_state_notify_transition(class, inst, - trans, j); + tesla_notify_transition(class, inst, trans, j); inst->ti_state = t->to; break; @@ -148,7 +145,7 @@ // If the keys weren't an exact match, we need to fork // a new (more specific) automaton instance. - tesla_state_notify_clone(class, inst, trans, j); + tesla_notify_clone(class, inst, trans, j); struct tesla_instance *clone = clones + cloned++; *clone = *inst; @@ -159,7 +156,7 @@ } if (transition_required && !transition_taken) - tesla_assert_fail(class, inst, trans); + tesla_notify_assert_fail(class, inst, trans); } // Move any clones into the instance. @@ -180,7 +177,7 @@ assert(tesla_instance_active(inst)); matched_something = true; - tesla_state_notify_new_instance(class, inst); + tesla_notify_new_instance(class, inst); } if (t->flags & TESLA_TRANS_CLEANUP) { @@ -195,7 +192,7 @@ } if (!matched_something) - tesla_match_fail(class, key, trans); + tesla_notify_match_fail(class, key, trans); tesla_class_put(class); From owner-p4-projects@FreeBSD.ORG Wed Mar 20 21:17:40 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id BBF6F924; Wed, 20 Mar 2013 21:17:40 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 7D5E5922 for ; Wed, 20 Mar 2013 21:17:40 +0000 (UTC) (envelope-from brooks@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 5FDB965E for ; Wed, 20 Mar 2013 21:17:40 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2KLHewT037337 for ; Wed, 20 Mar 2013 21:17:40 GMT (envelope-from brooks@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2KLHe2h037334 for perforce@freebsd.org; Wed, 20 Mar 2013 21:17:40 GMT (envelope-from brooks@freebsd.org) Date: Wed, 20 Mar 2013 21:17:40 GMT Message-Id: <201303202117.r2KLHe2h037334@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to brooks@freebsd.org using -f From: Brooks Davis Subject: PERFORCE change 223084 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Mar 2013 21:17:41 -0000 http://p4web.freebsd.org/@@223084?ac=10 Change 223084 by brooks@brooks_zenith on 2013/03/20 21:16:47 Implement bus_space_generic_*_8(). Extremly limited testing to date on beri. Potentially remains a panic() implementation on some platforms. Affected files ... .. //depot/projects/ctsrd/beribsd/src/sys/mips/include/cpufunc.h#4 edit .. //depot/projects/ctsrd/beribsd/src/sys/mips/mips/bus_space_generic.c#8 edit Differences ... ==== //depot/projects/ctsrd/beribsd/src/sys/mips/include/cpufunc.h#4 (text+ko) ==== @@ -354,9 +354,11 @@ #define readb(va) (*(volatile uint8_t *) (va)) #define readw(va) (*(volatile uint16_t *) (va)) #define readl(va) (*(volatile uint32_t *) (va)) +#define readd(va) mips3_ld(va) #define writeb(va, d) (*(volatile uint8_t *) (va) = (d)) #define writew(va, d) (*(volatile uint16_t *) (va) = (d)) #define writel(va, d) (*(volatile uint32_t *) (va) = (d)) +#define writed(va, d) mips3_sd((va), (d)) #endif /* !_MACHINE_CPUFUNC_H_ */ ==== //depot/projects/ctsrd/beribsd/src/sys/mips/mips/bus_space_generic.c#8 (text+ko) ==== @@ -202,9 +202,11 @@ #define rd8(a) cvmx_read64_uint8(a) #define rd16(a) cvmx_read64_uint16(a) #define rd32(a) cvmx_read64_uint32(a) +#define rd64(a) cvmx_read64_uint64(a) #define wr8(a, v) cvmx_write64_uint8(a, v) #define wr16(a, v) cvmx_write64_uint16(a, v) #define wr32(a, v) cvmx_write64_uint32(a, v) +#define wr64(a, v) cvmx_write64_uint64(a, v) #elif defined(CPU_SB1) && _BYTE_ORDER == _BIG_ENDIAN #include #define rd8(a) sb_big_endian_read8(a) @@ -217,9 +219,11 @@ #define rd8(a) readb(a) #define rd16(a) readw(a) #define rd32(a) readl(a) +#define rd64(a) readd(a) #define wr8(a, v) writeb(a, v) #define wr16(a, v) writew(a, v) #define wr32(a, v) writel(a, v) +#define wr64(a, v) writed(a, v) #endif /* generic bus_space tag */ @@ -297,7 +301,11 @@ generic_bs_r_8(void *t, bus_space_handle_t handle, bus_size_t offset) { +#ifdef rd64 + return(rd64(handle + offset)); +#else panic("%s: not implemented", __func__); +#endif } void @@ -333,8 +341,14 @@ generic_bs_rm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr = bsh + offset; + while (count--) + *addr++ = rd64(baddr); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -382,8 +396,16 @@ generic_bs_rr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr = bsh + offset; + while (count--) { + *addr++ = rd64(baddr); + baddr += 8; + } +#else panic("%s: not implemented", __func__); +#endif } /* @@ -419,7 +441,11 @@ uint64_t value) { +#ifdef rd64 + wr64(bsh + offset, value); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -460,8 +486,14 @@ generic_bs_wm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, const uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr = bsh + offset; + while (count--) + wr64(baddr, *addr++); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -508,8 +540,16 @@ generic_bs_wr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, const uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr = bsh + offset; + while (count--) { + wr64(baddr, *addr++); + baddr += 8; + } +#else panic("%s: not implemented", __func__); +#endif } /* @@ -550,8 +590,14 @@ generic_bs_sm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t value, size_t count) { +#ifdef rd64 + bus_addr_t addr = bsh + offset; + while (count--) + wr64(addr, value); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -592,8 +638,14 @@ generic_bs_sr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t value, size_t count) { +#ifdef rd64 + bus_addr_t addr = bsh + offset; + for (; count != 0; count--, addr += 8) + wr64(addr, value); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -664,8 +716,23 @@ generic_bs_c_8(void *t, bus_space_handle_t bsh1, bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, size_t count) { +#ifdef rd64 + bus_addr_t addr1 = bsh1 + off1; + bus_addr_t addr2 = bsh2 + off2; + if (addr1 >= addr2) { + /* src after dest: copy forward */ + for (; count != 0; count--, addr1 += 8, addr2 += 8) + wr64(addr2, rd64(addr1)); + } else { + /* dest after src: copy backwards */ + for (addr1 += 8 * (count - 1), addr2 += 8 * (count - 1); + count != 0; count--, addr1 -= 8, addr2 -= 8) + wr64(addr2, rd64(addr1)); + } +#else panic("%s: not implemented", __func__); +#endif } void From owner-p4-projects@FreeBSD.ORG Fri Mar 22 03:25:34 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 92F9E6E1; Fri, 22 Mar 2013 03:25:34 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 3A96B6DF for ; Fri, 22 Mar 2013 03:25:34 +0000 (UTC) (envelope-from brooks@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 1DFCCCD3 for ; Fri, 22 Mar 2013 03:25:34 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2M3PXNw014237 for ; Fri, 22 Mar 2013 03:25:33 GMT (envelope-from brooks@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2M3PX8C014234 for perforce@freebsd.org; Fri, 22 Mar 2013 03:25:33 GMT (envelope-from brooks@freebsd.org) Date: Fri, 22 Mar 2013 03:25:33 GMT Message-Id: <201303220325.r2M3PX8C014234@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to brooks@freebsd.org using -f From: Brooks Davis Subject: PERFORCE change 223121 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Mar 2013 03:25:34 -0000 http://p4web.freebsd.org/@@223121?ac=10 Change 223121 by brooks@brooks_zenith on 2013/03/22 03:24:48 Implement a driver for Robert Norton's PIC as an FDT interrupt controller. Devices whose interrupt-parent property points to a beripic device (or any other interrupt controller that registers as an FDT IC) will have their interrupt allocation, activation, and setup operations routed through the IC rather than down the traditional bus hierarchy. This driver largely abstracts the underlying CPU away allowing the PIC to be implemented on CPU's other than BERI. Due to insufficent abstractions in the FreeBSD codebase a small amount of MIPS specific code is currently required in fdt_mips.c and implementing counters properly will likely require a bit more MIPS specific code. TODO: * implement filters for each source. * add per-source counters. * SMP support. Affected files ... .. //depot/projects/ctsrd/beribsd/src/sys/boot/fdt/dts/beripad-de4.dts#19 edit .. //depot/projects/ctsrd/beribsd/src/sys/conf/files#16 edit .. //depot/projects/ctsrd/beribsd/src/sys/dev/fdt/fdt_common.c#7 edit .. //depot/projects/ctsrd/beribsd/src/sys/dev/fdt/fdt_common.h#6 edit .. //depot/projects/ctsrd/beribsd/src/sys/dev/fdt/fdt_ic_if.m#1 add .. //depot/projects/ctsrd/beribsd/src/sys/dev/fdt/fdt_mips.c#5 edit .. //depot/projects/ctsrd/beribsd/src/sys/dev/fdt/simplebus.c#4 edit .. //depot/projects/ctsrd/beribsd/src/sys/mips/beri/beri_pic.c#1 add .. //depot/projects/ctsrd/beribsd/src/sys/mips/beri/files.beri#31 edit Differences ... ==== //depot/projects/ctsrd/beribsd/src/sys/boot/fdt/dts/beripad-de4.dts#19 (text+ko) ==== @@ -48,6 +48,9 @@ #size-cells = <1>; cpus { + #address-cells = <1>; + #size-cells = <1>; + cpu@0 { compatible = "sri-cambridge,beri"; }; @@ -70,6 +73,24 @@ reg = <0x0 0x40000000>; // 1G at 0x0 }; + beripic: beripic@7f804000 { + compatible = "sri-cambridge,beri-pic"; + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <1>; + reg = <0x7f804000 0x400 + 0x7f806000 0x10 + 0x7f806080 0x10 + 0x7f806100 0x10>; + interrupts = <0 1 2 3 4>; + hard-interrupt-sources = <64>; + soft-interrupt-sources = <64>; + /* + * Ideally we'd have phandle to our core here so we + * can query things like nthreads. + */ + } + serial@7f000000 { compatible = "altera,jtag_uart-11_0"; reg = <0x7f000000 0x40>; @@ -147,6 +168,7 @@ 0x7f007420 0x20>; /* RX, TX */ interrupts = <1 2>; + //interrupt-parent =<&beripic>; }; ethernet@7f005000 { ==== //depot/projects/ctsrd/beribsd/src/sys/conf/files#16 (text+ko) ==== @@ -1293,6 +1293,7 @@ dev/fatm/if_fatm.c optional fatm pci dev/fb/splash.c optional splash dev/fdt/fdt_common.c optional fdt +dev/fdt/fdt_ic_if.m optional fdt dev/fdt/fdt_pci.c optional fdt pci dev/fdt/fdt_slicer.c optional fdt cfi | fdt nand dev/fdt/fdt_static_dtb.S optional fdt fdt_dtb_static ==== //depot/projects/ctsrd/beribsd/src/sys/dev/fdt/fdt_common.c#7 (text+ko) ==== @@ -63,6 +63,8 @@ vm_offset_t fdt_immr_va; vm_offset_t fdt_immr_size; +struct fdt_ic_list fdt_ic_list_head = SLIST_HEAD_INITIALIZER(fdt_ic_list_head); + int fdt_get_range(phandle_t node, int range_id, u_long *base, u_long *size) { ==== //depot/projects/ctsrd/beribsd/src/sys/dev/fdt/fdt_common.h#6 (text+ko) ==== @@ -70,6 +70,13 @@ }; extern struct fdt_fixup_entry fdt_fixup_table[]; +extern SLIST_HEAD(fdt_ic_list, fdt_ic) fdt_ic_list_head; +struct fdt_ic { + SLIST_ENTRY(fdt_ic) fdt_ics; + ihandle_t iph; + device_t dev; +}; + extern vm_paddr_t fdt_immr_pa; extern vm_offset_t fdt_immr_va; extern vm_offset_t fdt_immr_size; ==== //depot/projects/ctsrd/beribsd/src/sys/dev/fdt/fdt_mips.c#5 (text+ko) ==== @@ -68,7 +68,26 @@ return (0); } +/* + * CHERI PIC decoder. + */ +static int +fdt_pic_decode_beri(phandle_t node, pcell_t *intr, int *interrupt, + int *trig, int *pol) +{ + + if (!fdt_is_compatible(node, "sri-cambridge,beri-pic")) + return (ENXIO); + + *interrupt = fdt32_to_cpu(intr[0]); + *trig = INTR_TRIGGER_CONFORM; + *pol = INTR_POLARITY_CONFORM; + + return (0); +} + fdt_pic_decode_t fdt_pic_table[] = { &fdt_pic_decode_mips4k_cp0, + &fdt_pic_decode_beri, NULL }; ==== //depot/projects/ctsrd/beribsd/src/sys/dev/fdt/simplebus.c#4 (text+ko) ==== @@ -47,6 +47,7 @@ #include #include "fdt_common.h" +#include "fdt_ic_if.h" #include "ofw_bus_if.h" #ifdef DEBUG @@ -80,9 +81,18 @@ static int simplebus_print_child(device_t, device_t); static int simplebus_setup_intr(device_t, device_t, struct resource *, int, driver_filter_t *, driver_intr_t *, void *, void **); +static int simplebus_teardown_intr(device_t, device_t, struct resource *, + void *); +static int simplebus_activate_resource(device_t, device_t, int, int, + struct resource *); static struct resource *simplebus_alloc_resource(device_t, device_t, int, int *, u_long, u_long, u_long, u_int); +static int simplebus_deactivate_resource(device_t, device_t, int, int, + struct resource *); +static int simplebus_release_resource(device_t, device_t, int, int, + struct resource *); +static device_t simplebus_get_interrupt_parent(device_t); static struct resource_list *simplebus_get_resource_list(device_t, device_t); static ofw_bus_get_devinfo_t simplebus_get_devinfo; @@ -102,11 +112,11 @@ /* Bus interface */ DEVMETHOD(bus_print_child, simplebus_print_child), DEVMETHOD(bus_alloc_resource, simplebus_alloc_resource), - DEVMETHOD(bus_release_resource, bus_generic_release_resource), - DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), - DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_release_resource, simplebus_release_resource), + DEVMETHOD(bus_activate_resource, simplebus_activate_resource), + DEVMETHOD(bus_deactivate_resource, simplebus_deactivate_resource), DEVMETHOD(bus_setup_intr, simplebus_setup_intr), - DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), + DEVMETHOD(bus_teardown_intr, simplebus_teardown_intr), DEVMETHOD(bus_get_resource_list, simplebus_get_resource_list), /* OFW bus interface */ @@ -238,6 +248,7 @@ simplebus_alloc_resource(device_t bus, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) { + device_t ic; struct simplebus_devinfo *di; struct resource_list_entry *rle; @@ -263,10 +274,53 @@ count = rle->count; } + if (type == SYS_RES_IRQ && + (ic = simplebus_get_interrupt_parent(child)) != NULL) + return(FDT_IC_ALLOC_INTR(ic, child, rid, start, flags)); + return (bus_generic_alloc_resource(bus, child, type, rid, start, end, count, flags)); } +static int +simplebus_activate_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + device_t ic; + + if (type == SYS_RES_IRQ && + (ic = simplebus_get_interrupt_parent(child)) != NULL) + return (FDT_IC_ACTIVATE_INTR(ic, r)); + + return (bus_generic_activate_resource(dev, child, type, rid, r)); +} + +static int +simplebus_deactivate_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + device_t ic; + + if (type == SYS_RES_IRQ && + (ic = simplebus_get_interrupt_parent(child)) != NULL) + return (FDT_IC_DEACTIVATE_INTR(ic, r)); + + return (bus_generic_deactivate_resource(dev, child, type, rid, r)); +} + +static int +simplebus_release_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + device_t ic; + + if (type == SYS_RES_IRQ && + (ic = simplebus_get_interrupt_parent(child)) != NULL) + return (FDT_IC_RELEASE_INTR(ic, r)); + + return (bus_generic_release_resource(dev, child, type, rid, r)); +} + static struct resource_list * simplebus_get_resource_list(device_t bus, device_t child) { @@ -276,15 +330,40 @@ return (&di->di_res); } +static device_t +simplebus_get_interrupt_parent(device_t dev) +{ + struct simplebus_devinfo *di; + struct fdt_ic *ic; + ihandle_t iph; + phandle_t ph; + + di = device_get_ivars(dev); + if (di == NULL) + return (NULL); + + if (OF_getprop(di->di_ofw.obd_node, "interrupt-parent", &iph, + sizeof(iph)) > 0) { + iph = fdt32_to_cpu(iph); + ph = OF_instance_to_package(iph); + SLIST_FOREACH(ic, &fdt_ic_list_head, fdt_ics) { + if (ic->iph == ph) + return (ic->dev); + } + } + return (NULL); +} + static int simplebus_setup_intr(device_t bus, device_t child, struct resource *res, int flags, driver_filter_t *filter, driver_intr_t *ihand, void *arg, void **cookiep) { struct simplebus_devinfo *di; + device_t ic; enum intr_trigger trig; enum intr_polarity pol; - int error, rid; + int error, irq, rid; if (device_get_parent(child) != bus) return (ECHILD); @@ -300,20 +379,41 @@ if (rid >= DI_MAX_INTR_NUM) return (ENOENT); + ic = simplebus_get_interrupt_parent(child); + trig = di->di_intr_sl[rid].trig; pol = di->di_intr_sl[rid].pol; if (trig != INTR_TRIGGER_CONFORM || pol != INTR_POLARITY_CONFORM) { - error = bus_generic_config_intr(bus, rman_get_start(res), - trig, pol); + irq = rman_get_start(res); + if (ic != NULL) + error = FDT_IC_CONFIG_INTR(ic, irq, trig, pol); + else + error = bus_generic_config_intr(bus, irq, trig, pol); if (error) return (error); } - error = bus_generic_setup_intr(bus, child, res, flags, filter, ihand, - arg, cookiep); + if (ic != NULL) + error = FDT_IC_SETUP_INTR(ic, child, res, flags, filter, + ihand, arg, cookiep); + else + error = bus_generic_setup_intr(bus, child, res, flags, filter, + ihand, arg, cookiep); return (error); } +static int +simplebus_teardown_intr(device_t bus, device_t child, struct resource *res, + void *cookie) +{ + device_t ic; + + if ((ic = simplebus_get_interrupt_parent(child)) != NULL) + return (FDT_IC_TEARDOWN_INTR(ic, child, res, cookie)); + + return (bus_generic_teardown_intr(bus, child, res, cookie)); +} + static const struct ofw_bus_devinfo * simplebus_get_devinfo(device_t bus, device_t child) { ==== //depot/projects/ctsrd/beribsd/src/sys/mips/beri/files.beri#31 (text+ko) ==== @@ -19,5 +19,6 @@ mips/beri/beri_asm.S standard mips/beri/beri_machdep.c standard mips/beri/beri_mp.c optional smp +mips/beri/beri_pic.c optional fdt mips/mips/intr_machdep.c standard mips/mips/tick.c standard From owner-p4-projects@FreeBSD.ORG Fri Mar 22 18:48:15 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6EE9A7EB; Fri, 22 Mar 2013 18:48:15 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 8145F7DB for ; Fri, 22 Mar 2013 18:48:14 +0000 (UTC) (envelope-from brooks@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 72DACA84 for ; Fri, 22 Mar 2013 18:48:14 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2MImEcv075824 for ; Fri, 22 Mar 2013 18:48:14 GMT (envelope-from brooks@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2MImEsD075821 for perforce@freebsd.org; Fri, 22 Mar 2013 18:48:14 GMT (envelope-from brooks@freebsd.org) Date: Fri, 22 Mar 2013 18:48:14 GMT Message-Id: <201303221848.r2MImEsD075821@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to brooks@freebsd.org using -f From: Brooks Davis Subject: PERFORCE change 225861 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Mar 2013 18:48:15 -0000 http://p4web.freebsd.org/@@225861?ac=10 Change 225861 by brooks@brooks_zenith on 2013/03/22 18:47:50 Add (mips only) per-source interrupt statistics to beripic. Reduce verbosity a bit. Affected files ... .. //depot/projects/ctsrd/beribsd/src/sys/mips/beri/beri_pic.c#2 edit Differences ... ==== //depot/projects/ctsrd/beribsd/src/sys/mips/beri/beri_pic.c#2 (text+ko) ==== @@ -58,6 +58,9 @@ static char *bp_strconfig(uint64_t, char *, size_t); static void bp_print_config(device_t); static void bp_config_source(device_t, int, int, u_long, u_long); +#ifdef __mips__ +static void bp_set_counter_name(device_t, device_t, int); +#endif static int beripic_fdt_probe(device_t); static int beripic_fdt_attach(device_t); @@ -110,6 +113,10 @@ int bp_nsrcs; struct rman bp_src_rman; +#ifdef __mips__ + mips_intrcnt_t *bp_counters; +#endif + struct mtx bp_cfgmtx; }; @@ -118,6 +125,9 @@ driver_intr_t *intr; void *arg; struct resource *irq; +#ifdef __mips__ + mips_intrcnt_t counter; +#endif /* XXX counter */ }; @@ -234,7 +244,7 @@ { char configstr[64]; struct beripic_softc *sc; - uint64_t config, oconfig; + uint64_t config; sc = device_get_softc(ic); @@ -243,16 +253,31 @@ config |= tid << BP_CFG_SHIFT_TID; config |= irq << BP_CFG_SHIFT_IRQ; - oconfig = bp_read_cfg(sc, src); - if (oconfig != 0 && config != 0) - device_printf(ic, "src %d previous config: %s\n", - src, bp_strconfig(oconfig, configstr, sizeof(configstr))); if (bootverbose) device_printf(ic, "src %d: %s\n", src, bp_strconfig(config, configstr, sizeof(configstr))); bp_write_cfg(sc, src, config); } +#ifdef __mips__ +static void +bp_set_counter_name(device_t ic, device_t child, int src) +{ + struct beripic_softc *sc; + char name[MAXCOMLEN + 1]; + + sc = device_get_softc(ic); + + if (snprintf(name, sizeof(name), "bp%dsrc%d%s%s%s", + device_get_unit(ic), src, src < sc->bp_nhard ? "" : "s", + child == NULL ? "" : " ", + child == NULL ? " " : device_get_nameunit(child)) >= sizeof(name)) + name[sizeof(name) - 2] = '+'; + + mips_intrcnt_setname(sc->bp_counters[src], name); +} +#endif + static int beripic_fdt_probe(device_t dev) { @@ -387,6 +412,15 @@ if (bootverbose) device_printf(dev, "%d hard and %d soft sources\n", sc->bp_nhard, sc->bp_nsoft); + +#ifdef __mips__ + sc->bp_counters = malloc(sizeof(*sc->bp_counters) * sc->bp_nsrcs, + M_BERIPIC, M_WAITOK|M_ZERO); + for (i = 0; i < sc->bp_nsrcs; i++) { + sc->bp_counters[i] = mips_intrcnt_create(""); + bp_set_counter_name(dev, NULL, i); + } +#endif sc->bp_src_rman.rm_start = 0; sc->bp_src_rman.rm_end = sc->bp_nsrcs - 1; @@ -492,19 +526,24 @@ struct beripic_intr_arg *bpia; struct beripic_cookie *bpc; int error; - u_long hirq, tid; + u_long hirq, src, tid; sc = device_get_softc(ic); - KASSERT(rman_get_start(irq) < sc->bp_nsrcs, - ("source (%ul) out of range 0-%d", rman_get_start(irq), - rman_get_start(irq) - 1)); + src = rman_get_start(irq); + + KASSERT(src < sc->bp_nsrcs, ("source (%ul) out of range 0-%d", + src, sc->bp_nsrcs - 1)); bpia = malloc(sizeof(*bpia), M_BERIPIC, M_WAITOK|M_ZERO); bpia->filter = filter; bpia->intr = intr; bpia->arg = arg; bpia->irq = irq; +#ifdef __mips__ + bpia->counter = sc->bp_counters[src]; + bp_set_counter_name(ic, child, src); +#endif bpc = malloc(sizeof(*bpc), M_BERIPIC, M_WAITOK|M_ZERO); bpc->bpia = bpia; @@ -514,13 +553,9 @@ hirq = rman_get_start(bpc->hirq); tid = sc->bp_next_tid; -device_printf(ic, "allocated irq %lu tid %lu to %s who requsted %lu\n", - hirq, tid, device_get_nameunit(child), rman_get_start(irq)); - - /* XXX: should add a filter that checks IP state */ error = BUS_SETUP_INTR(device_get_parent(ic), ic, bpc->hirq, flags, - filter == NULL ? NULL : beripic_filter, - intr == NULL ? NULL : beripic_intr, bpia, &(bpc->cookie)); + beripic_filter, intr == NULL ? NULL : beripic_intr, bpia, + &(bpc->cookie)); if (error != 0) goto err; @@ -577,8 +612,14 @@ bpic = arg; - KASSERT(bpic->filter != NULL, - ("%s installed, but no child filter", __func__)); +#ifdef __mips__ + mips_intrcnt_inc(bpic->counter); +#endif + + /* XXX: Add a check that our source is high */ + + if (bpic->filter == NULL) + return (FILTER_SCHEDULE_THREAD); return (bpic->filter(bpic->arg)); } From owner-p4-projects@FreeBSD.ORG Fri Mar 22 18:54:25 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7F0609F2; Fri, 22 Mar 2013 18:54:25 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 1CB649EA for ; Fri, 22 Mar 2013 18:54:25 +0000 (UTC) (envelope-from brooks@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 0DADFAE5 for ; Fri, 22 Mar 2013 18:54:25 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2MIsODv078929 for ; Fri, 22 Mar 2013 18:54:24 GMT (envelope-from brooks@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2MIsOOm078926 for perforce@freebsd.org; Fri, 22 Mar 2013 18:54:24 GMT (envelope-from brooks@freebsd.org) Date: Fri, 22 Mar 2013 18:54:24 GMT Message-Id: <201303221854.r2MIsOOm078926@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to brooks@freebsd.org using -f From: Brooks Davis Subject: PERFORCE change 225891 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Mar 2013 18:54:25 -0000 http://p4web.freebsd.org/@@225891?ac=10 Change 225891 by brooks@brooks_zenith on 2013/03/22 18:53:39 Route atse0 and altera_jtag_uart0 interupts through the pic. Due to probe order and current allocation algorithm there is no change in hard interrupt use at the moment. Affected files ... .. //depot/projects/ctsrd/beribsd/src/sys/boot/fdt/dts/beripad-de4.dts#20 edit Differences ... ==== //depot/projects/ctsrd/beribsd/src/sys/boot/fdt/dts/beripad-de4.dts#20 (text+ko) ==== @@ -95,6 +95,7 @@ compatible = "altera,jtag_uart-11_0"; reg = <0x7f000000 0x40>; interrupts = <0>; + interrupt-parent = <&beripic>; }; serial@7f001000 { @@ -168,7 +169,7 @@ 0x7f007420 0x20>; /* RX, TX */ interrupts = <1 2>; - //interrupt-parent =<&beripic>; + interrupt-parent = <&beripic>; }; ethernet@7f005000 { From owner-p4-projects@FreeBSD.ORG Fri Mar 22 19:52:06 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id B469B87A; Fri, 22 Mar 2013 19:52:06 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 0421786F for ; Fri, 22 Mar 2013 19:52:06 +0000 (UTC) (envelope-from brooks@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id E924CFB for ; Fri, 22 Mar 2013 19:52:05 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2MJq5jw009115 for ; Fri, 22 Mar 2013 19:52:05 GMT (envelope-from brooks@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2MJq5Xa009112 for perforce@freebsd.org; Fri, 22 Mar 2013 19:52:05 GMT (envelope-from brooks@freebsd.org) Date: Fri, 22 Mar 2013 19:52:05 GMT Message-Id: <201303221952.r2MJq5Xa009112@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to brooks@freebsd.org using -f From: Brooks Davis Subject: PERFORCE change 226199 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Mar 2013 19:52:07 -0000 http://p4web.freebsd.org/@@226199?ac=10 Change 226199 by brooks@brooks_zenith on 2013/03/22 19:51:51 Merge the BERI PIC driver and required support for bus_space_*_8 functions. Affected files ... .. //depot/projects/ctsrd/cheribsd/src/sys/boot/fdt/dts/beripad-de4.dts#7 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/conf/files#8 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_common.c#6 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_common.h#5 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_ic_if.m#1 branch .. //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_mips.c#4 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/simplebus.c#4 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/mips/beri/beri_pic.c#1 branch .. //depot/projects/ctsrd/cheribsd/src/sys/mips/beri/files.beri#13 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/mips/include/cpufunc.h#4 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/mips/mips/bus_space_generic.c#5 integrate Differences ... ==== //depot/projects/ctsrd/cheribsd/src/sys/boot/fdt/dts/beripad-de4.dts#7 (text+ko) ==== @@ -48,6 +48,9 @@ #size-cells = <1>; cpus { + #address-cells = <1>; + #size-cells = <1>; + cpu@0 { compatible = "sri-cambridge,beri"; }; @@ -70,10 +73,29 @@ reg = <0x0 0x40000000>; // 1G at 0x0 }; + beripic: beripic@7f804000 { + compatible = "sri-cambridge,beri-pic"; + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <1>; + reg = <0x7f804000 0x400 + 0x7f806000 0x10 + 0x7f806080 0x10 + 0x7f806100 0x10>; + interrupts = <0 1 2 3 4>; + hard-interrupt-sources = <64>; + soft-interrupt-sources = <64>; + /* + * Ideally we'd have phandle to our core here so we + * can query things like nthreads. + */ + } + serial@7f000000 { compatible = "altera,jtag_uart-11_0"; reg = <0x7f000000 0x40>; interrupts = <0>; + interrupt-parent = <&beripic>; }; serial@7f001000 { @@ -147,6 +169,7 @@ 0x7f007420 0x20>; /* RX, TX */ interrupts = <1 2>; + interrupt-parent = <&beripic>; }; ethernet@7f005000 { ==== //depot/projects/ctsrd/cheribsd/src/sys/conf/files#8 (text+ko) ==== @@ -1293,6 +1293,7 @@ dev/fatm/if_fatm.c optional fatm pci dev/fb/splash.c optional splash dev/fdt/fdt_common.c optional fdt +dev/fdt/fdt_ic_if.m optional fdt dev/fdt/fdt_pci.c optional fdt pci dev/fdt/fdt_slicer.c optional fdt cfi | fdt nand dev/fdt/fdt_static_dtb.S optional fdt fdt_dtb_static ==== //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_common.c#6 (text+ko) ==== @@ -63,6 +63,8 @@ vm_offset_t fdt_immr_va; vm_offset_t fdt_immr_size; +struct fdt_ic_list fdt_ic_list_head = SLIST_HEAD_INITIALIZER(fdt_ic_list_head); + int fdt_get_range(phandle_t node, int range_id, u_long *base, u_long *size) { ==== //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_common.h#5 (text+ko) ==== @@ -70,6 +70,13 @@ }; extern struct fdt_fixup_entry fdt_fixup_table[]; +extern SLIST_HEAD(fdt_ic_list, fdt_ic) fdt_ic_list_head; +struct fdt_ic { + SLIST_ENTRY(fdt_ic) fdt_ics; + ihandle_t iph; + device_t dev; +}; + extern vm_paddr_t fdt_immr_pa; extern vm_offset_t fdt_immr_va; extern vm_offset_t fdt_immr_size; ==== //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_mips.c#4 (text+ko) ==== @@ -68,7 +68,26 @@ return (0); } +/* + * CHERI PIC decoder. + */ +static int +fdt_pic_decode_beri(phandle_t node, pcell_t *intr, int *interrupt, + int *trig, int *pol) +{ + + if (!fdt_is_compatible(node, "sri-cambridge,beri-pic")) + return (ENXIO); + + *interrupt = fdt32_to_cpu(intr[0]); + *trig = INTR_TRIGGER_CONFORM; + *pol = INTR_POLARITY_CONFORM; + + return (0); +} + fdt_pic_decode_t fdt_pic_table[] = { &fdt_pic_decode_mips4k_cp0, + &fdt_pic_decode_beri, NULL }; ==== //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/simplebus.c#4 (text+ko) ==== @@ -47,6 +47,7 @@ #include #include "fdt_common.h" +#include "fdt_ic_if.h" #include "ofw_bus_if.h" #ifdef DEBUG @@ -80,9 +81,18 @@ static int simplebus_print_child(device_t, device_t); static int simplebus_setup_intr(device_t, device_t, struct resource *, int, driver_filter_t *, driver_intr_t *, void *, void **); +static int simplebus_teardown_intr(device_t, device_t, struct resource *, + void *); +static int simplebus_activate_resource(device_t, device_t, int, int, + struct resource *); static struct resource *simplebus_alloc_resource(device_t, device_t, int, int *, u_long, u_long, u_long, u_int); +static int simplebus_deactivate_resource(device_t, device_t, int, int, + struct resource *); +static int simplebus_release_resource(device_t, device_t, int, int, + struct resource *); +static device_t simplebus_get_interrupt_parent(device_t); static struct resource_list *simplebus_get_resource_list(device_t, device_t); static ofw_bus_get_devinfo_t simplebus_get_devinfo; @@ -102,11 +112,11 @@ /* Bus interface */ DEVMETHOD(bus_print_child, simplebus_print_child), DEVMETHOD(bus_alloc_resource, simplebus_alloc_resource), - DEVMETHOD(bus_release_resource, bus_generic_release_resource), - DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), - DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_release_resource, simplebus_release_resource), + DEVMETHOD(bus_activate_resource, simplebus_activate_resource), + DEVMETHOD(bus_deactivate_resource, simplebus_deactivate_resource), DEVMETHOD(bus_setup_intr, simplebus_setup_intr), - DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), + DEVMETHOD(bus_teardown_intr, simplebus_teardown_intr), DEVMETHOD(bus_get_resource_list, simplebus_get_resource_list), /* OFW bus interface */ @@ -238,6 +248,7 @@ simplebus_alloc_resource(device_t bus, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) { + device_t ic; struct simplebus_devinfo *di; struct resource_list_entry *rle; @@ -263,10 +274,53 @@ count = rle->count; } + if (type == SYS_RES_IRQ && + (ic = simplebus_get_interrupt_parent(child)) != NULL) + return(FDT_IC_ALLOC_INTR(ic, child, rid, start, flags)); + return (bus_generic_alloc_resource(bus, child, type, rid, start, end, count, flags)); } +static int +simplebus_activate_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + device_t ic; + + if (type == SYS_RES_IRQ && + (ic = simplebus_get_interrupt_parent(child)) != NULL) + return (FDT_IC_ACTIVATE_INTR(ic, r)); + + return (bus_generic_activate_resource(dev, child, type, rid, r)); +} + +static int +simplebus_deactivate_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + device_t ic; + + if (type == SYS_RES_IRQ && + (ic = simplebus_get_interrupt_parent(child)) != NULL) + return (FDT_IC_DEACTIVATE_INTR(ic, r)); + + return (bus_generic_deactivate_resource(dev, child, type, rid, r)); +} + +static int +simplebus_release_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + device_t ic; + + if (type == SYS_RES_IRQ && + (ic = simplebus_get_interrupt_parent(child)) != NULL) + return (FDT_IC_RELEASE_INTR(ic, r)); + + return (bus_generic_release_resource(dev, child, type, rid, r)); +} + static struct resource_list * simplebus_get_resource_list(device_t bus, device_t child) { @@ -276,15 +330,40 @@ return (&di->di_res); } +static device_t +simplebus_get_interrupt_parent(device_t dev) +{ + struct simplebus_devinfo *di; + struct fdt_ic *ic; + ihandle_t iph; + phandle_t ph; + + di = device_get_ivars(dev); + if (di == NULL) + return (NULL); + + if (OF_getprop(di->di_ofw.obd_node, "interrupt-parent", &iph, + sizeof(iph)) > 0) { + iph = fdt32_to_cpu(iph); + ph = OF_instance_to_package(iph); + SLIST_FOREACH(ic, &fdt_ic_list_head, fdt_ics) { + if (ic->iph == ph) + return (ic->dev); + } + } + return (NULL); +} + static int simplebus_setup_intr(device_t bus, device_t child, struct resource *res, int flags, driver_filter_t *filter, driver_intr_t *ihand, void *arg, void **cookiep) { struct simplebus_devinfo *di; + device_t ic; enum intr_trigger trig; enum intr_polarity pol; - int error, rid; + int error, irq, rid; if (device_get_parent(child) != bus) return (ECHILD); @@ -300,20 +379,41 @@ if (rid >= DI_MAX_INTR_NUM) return (ENOENT); + ic = simplebus_get_interrupt_parent(child); + trig = di->di_intr_sl[rid].trig; pol = di->di_intr_sl[rid].pol; if (trig != INTR_TRIGGER_CONFORM || pol != INTR_POLARITY_CONFORM) { - error = bus_generic_config_intr(bus, rman_get_start(res), - trig, pol); + irq = rman_get_start(res); + if (ic != NULL) + error = FDT_IC_CONFIG_INTR(ic, irq, trig, pol); + else + error = bus_generic_config_intr(bus, irq, trig, pol); if (error) return (error); } - error = bus_generic_setup_intr(bus, child, res, flags, filter, ihand, - arg, cookiep); + if (ic != NULL) + error = FDT_IC_SETUP_INTR(ic, child, res, flags, filter, + ihand, arg, cookiep); + else + error = bus_generic_setup_intr(bus, child, res, flags, filter, + ihand, arg, cookiep); return (error); } +static int +simplebus_teardown_intr(device_t bus, device_t child, struct resource *res, + void *cookie) +{ + device_t ic; + + if ((ic = simplebus_get_interrupt_parent(child)) != NULL) + return (FDT_IC_TEARDOWN_INTR(ic, child, res, cookie)); + + return (bus_generic_teardown_intr(bus, child, res, cookie)); +} + static const struct ofw_bus_devinfo * simplebus_get_devinfo(device_t bus, device_t child) { ==== //depot/projects/ctsrd/cheribsd/src/sys/mips/beri/files.beri#13 (text+ko) ==== @@ -19,6 +19,7 @@ mips/beri/beri_asm.S standard mips/beri/beri_machdep.c standard mips/beri/beri_mp.c optional smp +mips/beri/beri_pic.c optional fdt mips/cheri/cheri.c optional cpu_cheri mips/mips/intr_machdep.c standard mips/mips/tick.c standard ==== //depot/projects/ctsrd/cheribsd/src/sys/mips/include/cpufunc.h#4 (text+ko) ==== @@ -354,9 +354,11 @@ #define readb(va) (*(volatile uint8_t *) (va)) #define readw(va) (*(volatile uint16_t *) (va)) #define readl(va) (*(volatile uint32_t *) (va)) +#define readd(va) mips3_ld(va) #define writeb(va, d) (*(volatile uint8_t *) (va) = (d)) #define writew(va, d) (*(volatile uint16_t *) (va) = (d)) #define writel(va, d) (*(volatile uint32_t *) (va) = (d)) +#define writed(va, d) mips3_sd((va), (d)) #endif /* !_MACHINE_CPUFUNC_H_ */ ==== //depot/projects/ctsrd/cheribsd/src/sys/mips/mips/bus_space_generic.c#5 (text+ko) ==== @@ -202,9 +202,11 @@ #define rd8(a) cvmx_read64_uint8(a) #define rd16(a) cvmx_read64_uint16(a) #define rd32(a) cvmx_read64_uint32(a) +#define rd64(a) cvmx_read64_uint64(a) #define wr8(a, v) cvmx_write64_uint8(a, v) #define wr16(a, v) cvmx_write64_uint16(a, v) #define wr32(a, v) cvmx_write64_uint32(a, v) +#define wr64(a, v) cvmx_write64_uint64(a, v) #elif defined(CPU_SB1) && _BYTE_ORDER == _BIG_ENDIAN #include #define rd8(a) sb_big_endian_read8(a) @@ -217,9 +219,11 @@ #define rd8(a) readb(a) #define rd16(a) readw(a) #define rd32(a) readl(a) +#define rd64(a) readd(a) #define wr8(a, v) writeb(a, v) #define wr16(a, v) writew(a, v) #define wr32(a, v) writel(a, v) +#define wr64(a, v) writed(a, v) #endif /* generic bus_space tag */ @@ -297,7 +301,11 @@ generic_bs_r_8(void *t, bus_space_handle_t handle, bus_size_t offset) { +#ifdef rd64 + return(rd64(handle + offset)); +#else panic("%s: not implemented", __func__); +#endif } void @@ -333,8 +341,14 @@ generic_bs_rm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr = bsh + offset; + while (count--) + *addr++ = rd64(baddr); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -382,8 +396,16 @@ generic_bs_rr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr = bsh + offset; + while (count--) { + *addr++ = rd64(baddr); + baddr += 8; + } +#else panic("%s: not implemented", __func__); +#endif } /* @@ -419,7 +441,11 @@ uint64_t value) { +#ifdef rd64 + wr64(bsh + offset, value); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -460,8 +486,14 @@ generic_bs_wm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, const uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr = bsh + offset; + while (count--) + wr64(baddr, *addr++); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -508,8 +540,16 @@ generic_bs_wr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, const uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr = bsh + offset; + while (count--) { + wr64(baddr, *addr++); + baddr += 8; + } +#else panic("%s: not implemented", __func__); +#endif } /* @@ -550,8 +590,14 @@ generic_bs_sm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t value, size_t count) { +#ifdef rd64 + bus_addr_t addr = bsh + offset; + while (count--) + wr64(addr, value); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -592,8 +638,14 @@ generic_bs_sr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t value, size_t count) { +#ifdef rd64 + bus_addr_t addr = bsh + offset; + for (; count != 0; count--, addr += 8) + wr64(addr, value); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -664,8 +716,23 @@ generic_bs_c_8(void *t, bus_space_handle_t bsh1, bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, size_t count) { +#ifdef rd64 + bus_addr_t addr1 = bsh1 + off1; + bus_addr_t addr2 = bsh2 + off2; + if (addr1 >= addr2) { + /* src after dest: copy forward */ + for (; count != 0; count--, addr1 += 8, addr2 += 8) + wr64(addr2, rd64(addr1)); + } else { + /* dest after src: copy backwards */ + for (addr1 += 8 * (count - 1), addr2 += 8 * (count - 1); + count != 0; count--, addr1 -= 8, addr2 -= 8) + wr64(addr2, rd64(addr1)); + } +#else panic("%s: not implemented", __func__); +#endif } void