From 529c481c39506d0b331bfd0cdea35e5d1aeaaad0 Mon Sep 17 00:00:00 2001 From: Nathan Chong <52972368+nchong-at-aws@users.noreply.github.com> Date: Thu, 2 Jul 2020 15:55:20 -0400 Subject: [PATCH] Add VeriFast kernel queue proofs (#117) --- FreeRTOS/Test/README.md | 3 +- FreeRTOS/Test/VeriFast/Makefile | 52 ++ FreeRTOS/Test/VeriFast/README.md | 122 ++++ FreeRTOS/Test/VeriFast/docs/callgraph.png | Bin 0 -> 377517 bytes .../Test/VeriFast/include/proof/common.gh | 539 ++++++++++++++++++ FreeRTOS/Test/VeriFast/include/proof/queue.h | 435 ++++++++++++++ .../VeriFast/include/proof/queuecontracts.h | 57 ++ FreeRTOS/Test/VeriFast/queue/README.md | 25 + FreeRTOS/Test/VeriFast/queue/create.c | 258 +++++++++ .../VeriFast/queue/prvCopyDataFromQueue.c | 85 +++ .../Test/VeriFast/queue/prvCopyDataToQueue.c | 179 ++++++ .../Test/VeriFast/queue/prvIsQueueEmpty.c | 49 ++ FreeRTOS/Test/VeriFast/queue/prvIsQueueFull.c | 50 ++ FreeRTOS/Test/VeriFast/queue/prvLockQueue.c | 67 +++ FreeRTOS/Test/VeriFast/queue/prvUnlockQueue.c | 162 ++++++ .../VeriFast/queue/uxQueueMessagesWaiting.c | 68 +++ .../VeriFast/queue/uxQueueSpacesAvailable.c | 48 ++ FreeRTOS/Test/VeriFast/queue/vQueueDelete.c | 80 +++ .../Test/VeriFast/queue/xQueueGenericSend.c | 278 +++++++++ .../VeriFast/queue/xQueueGenericSendFromISR.c | 224 ++++++++ .../queue/xQueueIsQueueEmptyFromISR.c | 48 ++ .../VeriFast/queue/xQueueIsQueueFullFromISR.c | 48 ++ FreeRTOS/Test/VeriFast/queue/xQueuePeek.c | 206 +++++++ .../Test/VeriFast/queue/xQueuePeekFromISR.c | 89 +++ FreeRTOS/Test/VeriFast/queue/xQueueReceive.c | 204 +++++++ .../VeriFast/queue/xQueueReceiveFromISR.c | 134 +++++ .../VeriFast/scripts/annotation_overhead.sh | 3 + FreeRTOS/Test/VeriFast/scripts/callgraph.md | 20 + FreeRTOS/Test/VeriFast/scripts/callgraph.py | 83 +++ FreeRTOS/Test/VeriFast/scripts/diff_files.md | 40 ++ .../VeriFast/scripts/generate_diff_files.sh | 47 ++ 31 files changed, 3702 insertions(+), 1 deletion(-) create mode 100644 FreeRTOS/Test/VeriFast/Makefile create mode 100644 FreeRTOS/Test/VeriFast/README.md create mode 100644 FreeRTOS/Test/VeriFast/docs/callgraph.png create mode 100644 FreeRTOS/Test/VeriFast/include/proof/common.gh create mode 100644 FreeRTOS/Test/VeriFast/include/proof/queue.h create mode 100644 FreeRTOS/Test/VeriFast/include/proof/queuecontracts.h create mode 100644 FreeRTOS/Test/VeriFast/queue/README.md create mode 100644 FreeRTOS/Test/VeriFast/queue/create.c create mode 100644 FreeRTOS/Test/VeriFast/queue/prvCopyDataFromQueue.c create mode 100644 FreeRTOS/Test/VeriFast/queue/prvCopyDataToQueue.c create mode 100644 FreeRTOS/Test/VeriFast/queue/prvIsQueueEmpty.c create mode 100644 FreeRTOS/Test/VeriFast/queue/prvIsQueueFull.c create mode 100644 FreeRTOS/Test/VeriFast/queue/prvLockQueue.c create mode 100644 FreeRTOS/Test/VeriFast/queue/prvUnlockQueue.c create mode 100644 FreeRTOS/Test/VeriFast/queue/uxQueueMessagesWaiting.c create mode 100644 FreeRTOS/Test/VeriFast/queue/uxQueueSpacesAvailable.c create mode 100644 FreeRTOS/Test/VeriFast/queue/vQueueDelete.c create mode 100644 FreeRTOS/Test/VeriFast/queue/xQueueGenericSend.c create mode 100644 FreeRTOS/Test/VeriFast/queue/xQueueGenericSendFromISR.c create mode 100644 FreeRTOS/Test/VeriFast/queue/xQueueIsQueueEmptyFromISR.c create mode 100644 FreeRTOS/Test/VeriFast/queue/xQueueIsQueueFullFromISR.c create mode 100644 FreeRTOS/Test/VeriFast/queue/xQueuePeek.c create mode 100644 FreeRTOS/Test/VeriFast/queue/xQueuePeekFromISR.c create mode 100644 FreeRTOS/Test/VeriFast/queue/xQueueReceive.c create mode 100644 FreeRTOS/Test/VeriFast/queue/xQueueReceiveFromISR.c create mode 100755 FreeRTOS/Test/VeriFast/scripts/annotation_overhead.sh create mode 100644 FreeRTOS/Test/VeriFast/scripts/callgraph.md create mode 100755 FreeRTOS/Test/VeriFast/scripts/callgraph.py create mode 100644 FreeRTOS/Test/VeriFast/scripts/diff_files.md create mode 100755 FreeRTOS/Test/VeriFast/scripts/generate_diff_files.sh diff --git a/FreeRTOS/Test/README.md b/FreeRTOS/Test/README.md index a85db2642d..47f4409715 100644 --- a/FreeRTOS/Test/README.md +++ b/FreeRTOS/Test/README.md @@ -6,4 +6,5 @@ For more information on FreeRTOS testing please refer to https://www.freertos.or ## Directory structure This directory is in working progress -- we are migrating scattered test cases to this directory. Here only lists what's currently under this directory. -- ```./CBMC```: This directory contains automated proofs of the memory safety of various parts of the FreeRTOS code base. \ No newline at end of file +- ```./CBMC```: This directory contains automated proofs of the memory safety of various parts of the FreeRTOS code base. +- ```./VeriFast```: This directory contains automated proofs of the functional correctness of various parts of the FreeRTOS code base. diff --git a/FreeRTOS/Test/VeriFast/Makefile b/FreeRTOS/Test/VeriFast/Makefile new file mode 100644 index 0000000000..50bec41e49 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/Makefile @@ -0,0 +1,52 @@ +VERIFAST ?= verifast +VERIFAST_ARGS = -I include -c $(EXTRA_VERIFAST_ARGS) + +ifeq ($(NO_COVERAGE), 1) +check_coverage = cat +else +check_coverage = perl -pe \ + 'END { \ + if ($$status) { \ + print "Coverage regression failed: Expected $1 statements verified.\n"; \ + } \ + exit $$status; \ + } \ + $$status=/$1 statements verified/ ? 0 : 1;' +endif + +all: queue + +.PHONY: queue +queue: + @$(VERIFAST) $(VERIFAST_ARGS) queue/create.c | $(call check_coverage,269) + @$(VERIFAST) $(VERIFAST_ARGS) queue/prvCopyDataFromQueue.c | $(call check_coverage,253) + @$(VERIFAST) $(VERIFAST_ARGS) -disable_overflow_check queue/prvCopyDataToQueue.c | $(call check_coverage,280) + @$(VERIFAST) $(VERIFAST_ARGS) queue/prvIsQueueEmpty.c | $(call check_coverage,234) + @$(VERIFAST) $(VERIFAST_ARGS) queue/prvIsQueueFull.c | $(call check_coverage,234) + @$(VERIFAST) $(VERIFAST_ARGS) queue/prvLockQueue.c | $(call check_coverage,235) + @$(VERIFAST) $(VERIFAST_ARGS) queue/prvUnlockQueue.c | $(call check_coverage,249) + @$(VERIFAST) $(VERIFAST_ARGS) queue/uxQueueMessagesWaiting.c | $(call check_coverage,237) + @$(VERIFAST) $(VERIFAST_ARGS) queue/uxQueueSpacesAvailable.c | $(call check_coverage,235) + @$(VERIFAST) $(VERIFAST_ARGS) queue/vQueueDelete.c | $(call check_coverage,232) + @$(VERIFAST) $(VERIFAST_ARGS) queue/xQueueGenericSend.c | $(call check_coverage,280) + @$(VERIFAST) $(VERIFAST_ARGS) -disable_overflow_check queue/xQueueGenericSendFromISR.c | $(call check_coverage,262) + @$(VERIFAST) $(VERIFAST_ARGS) queue/xQueueIsQueueEmptyFromISR.c | $(call check_coverage,232) + @$(VERIFAST) $(VERIFAST_ARGS) queue/xQueueIsQueueFullFromISR.c | $(call check_coverage,232) + @$(VERIFAST) $(VERIFAST_ARGS) queue/xQueuePeek.c | $(call check_coverage,280) + @$(VERIFAST) $(VERIFAST_ARGS) queue/xQueuePeekFromISR.c | $(call check_coverage,245) + @$(VERIFAST) $(VERIFAST_ARGS) queue/xQueueReceive.c | $(call check_coverage,282) + @$(VERIFAST) $(VERIFAST_ARGS) -disable_overflow_check queue/xQueueReceiveFromISR.c | $(call check_coverage,259) + +.PHONY: proof_changes +proof_changes: + @git grep "if[n]*def VERIFAST" -- '*.c' | cut -f 3- -d ' ' | sort | uniq + +GIT?=git +NO_CHANGE_CHECKOUT_DIR=no-change-check-freertos-kernel +NO_CHANGE_EXPECTED_HASH=4a61f9ff7e2 +.PHONY: synced_with_source_check +synced_with_source_check: + @rm -rf $(NO_CHANGE_CHECKOUT_DIR) + @$(GIT) clone --shallow-since="30-06-2020" https://github.com/FreeRTOS/FreeRTOS-Kernel.git $(NO_CHANGE_CHECKOUT_DIR) + @cd $(NO_CHANGE_CHECKOUT_DIR) && $(GIT) diff --quiet $(NO_CHANGE_EXPECTED_HASH) queue.c + @cd $(NO_CHANGE_CHECKOUT_DIR) && $(GIT) diff --quiet $(NO_CHANGE_EXPECTED_HASH) include/queue.h diff --git a/FreeRTOS/Test/VeriFast/README.md b/FreeRTOS/Test/VeriFast/README.md new file mode 100644 index 0000000000..4af61ae272 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/README.md @@ -0,0 +1,122 @@ +# FreeRTOS VeriFast proofs + +This directory contains automated functional correctness proofs of the FreeRTOS +kernel queue data structure. These properties are proven with the +[VeriFast](https://github.com/verifast/verifast) verifier. + +## Proof directory structure + +We split proofs by data structure into separate proof directories. Each file +within a proof directory is a proof of one or more related API functions. A +proof is the source code of the FreeRTOS implementation with VeriFast +annotations (denoted by special comments `/*@ ... @*/`). A set of common +predicates, functions and lemmas used by all proofs is maintained in the +`include/proof` directory. + + - `queue`: proofs for the FreeRTOS queue data structure + +The following figure gives the callgraph of the queue proofs. Green=Proven +functions, Blue=Functions modeled by lock invariants (underlying implementation +assumed to provide these atomicity guarantees), Grey=Assumed stubs. + +![Queue proof callgraph](docs/callgraph.png?raw=true "Queue proofs") + +## Prerequisites + +Proof checking needs VeriFast and proof regression further needs make and perl. + +We recommend installing VeriFast from the nightly builds on the [VeriFast +GitHub page](https://github.com/verifast/verifast). After unpacking the build +tarball, the `verifast` and `vfide` binaries will be in the directory +`verifast-COMMIT/bin/` where `COMMIT` is the Git commit of the VeriFast build. + +Note that for CI we use [VeriFast 19.12](https://github.com/verifast/verifast/releases). + +## Proof checking a single proof in the VeriFast IDE + +To load a proof in the `vfide` VeriFast IDE: + +``` +$ /path/to/vfide -I include queue/xQueueGenericSend.c +``` + +Then click `Verify` and `Verify Program` (or press F5). Note that the following +proofs require arithmetic overflow checking to be turned off (click `Verify` +and uncheck `Check arithmetic overflow`). + + - `queue/prvCopyDataToQueue.c` + - `queue/xQueueGenericSendFromISR.c` + - `queue/xQueueReceiveFromISR.c` + +A successful proof results in the top banner turning green with a statement +similar to: `0 errors found (286 statements verified)`. + +## Proof checking a single proof at the command-line + +The following is an example of checking a proof using the `verifast` +command-line tool. Turn off arithmetic overflow checking where necessary with +the flag `-disable_overflow_check`. + +``` +$ /path/to/verifast -I include -c queue/xQueueGenericSend.c +``` + +A successful proof results in output similar to: + +``` +queue/xQueueGenericSend.c +0 errors found (286 statements verified) +``` + +## Running proof regression + +The following will check all proofs in the repo along with a statement coverage +regression. + +``` +$ VERIFAST=/path/to/verifast make +``` + +If you have made changes to the proofs so the statement coverage no longer +matches then you can temporarily turn off coverage checking: + +``` +$ VERIFAST=/path/to/verifast NO_COVERAGE=1 make +``` + +## Annotation burden + +VeriFast can emit statistics about the number of source code lines and +annotations. + +``` +$ VERIFAST=/path/to/verifast ./scripts/annotation_overhead.sh +``` + +## Reading a VeriFast proof + +VeriFast is a modular deductive verifier using separation logic. A quick +introduction is given by [Jacobs and +Piessens](https://people.cs.kuleuven.be/~bart.jacobs/verifast/verifast.pdf). +In particular, Section 1 Introduction, gives a high-level overview of the proof +technique, which uses forward symbolic execution over a symbolic heap. + +Learning how to use VeriFast will help you read and understand the proofs. +The VeriFast +[tutorial](https://people.cs.kuleuven.be/~bart.jacobs/verifast/tutorial.pdf) is +a good guide. You will need to understand: + + - Sec 4. Functions and Contracts + - Sec 5. Patterns + - Sec 6. Predicates + - Sec 7. Recursive Predicates + - Sec 8. Loops + - Sec 9. Inductive Datatypes + - Sec 10. Inductive Datatypes + - Sec 11. Lemmas + +## Contributors + +We acknowledge and thank the following contributors, listed alphabetically: + + - Bart Jacobs, KU Leuven, https://people.cs.kuleuven.be/~bart.jacobs/ diff --git a/FreeRTOS/Test/VeriFast/docs/callgraph.png b/FreeRTOS/Test/VeriFast/docs/callgraph.png new file mode 100644 index 0000000000000000000000000000000000000000..283c770b53f06fe704614cde7460abbbb2d2bd32 GIT binary patch literal 377517 zcmZ^Lby!qu_ckCYNT)OmU4nFXN{DnzOA1JLNq2XH(nB{A0|JstcL~zn;J4=-@x0$3 zKd<5Pavb)4_Ig&__r2CLVJb>8&z?Si3IhZ4Oior(6$S=@4)}3JMg-m|5T6770R!u# zDkBb4IYROa21XP{PEt(G4R$XJ$w*Co?&I>=5));iiug85=!bVtL+M+LA(fpqS{hQW zEY|Z<%rkh^Jj`WA5-O#BX9n0h6qw?&;vQLQ52vJ=sl6Z&rP-jT3&z%xz-8T*682VB z)lBAV1ZI#Z-2eF+Yk^<0(RCFbk^a9wBMN7MqLR5G;14hB_kX-{6_IBe2g)-O|G)oF zPxI?C5`FzTt}-|{IQF!rhC_d7XsE0n4-c;z4EE2;BDJx#b+#6CdH>!oApu8EPp?#6 zMyB7~fIWm77MtSnmCHMD34;>*_vI&tNl#BN>fyn!lq0NPF+4aZ?&8Aj=;+8;cC2@^ zv9%@9`?WM6zpRXDVPT;T=AFHL6{Nqk0y&mSFWizryr{0vgfHbdQoID5bi25?=zM;0 zAw9XXxrsndPJVTJOHEHNJN@O0=prIKyd~@p5QP)gf95kXhPO$@?C;G+PLcS}V))Xc zy*=ywG3y%x39?E`Q|CWEze(z6U|@)4#E+yp2uszhPcp&4zzBu0ET=*n1ecVQG}z&? zt1?sS)`UWr6k13Xtx@5~!o#C^NX^BCr}}+j;zLGS+UHALZ0vyQ>K8#FA-fvUQCn1& zHUDD>JnYZ{-gm*uS-P~3#-i~535rcg3F!&Jpr)i0i-@I?)Tn?!Afch5exXi%bCvq7 zgX?2sDlAK3#Pu}z;IH4leibz~&adq5b7QtuRmBc^tEQ$_p&q1#|KAQ&tH9yXv7B`| z>i%bmv2u7x!TC<#PJGJs_4T*qGSMXdO&YGhCZsg6o){Kmu-M7c` zI@MO0D>vFbFDo?)3JNIgcK*jNjef$@E2UpQ**KB=>tVUtD50LtHa6w>R2U?@Dzo9J zwaCVcEzT0ArXYUTgL3NfY!Vu|eW5YfOfyukEPT7W`pd%z{wSci}y0$8p&!om;pa&bv^v3hojJH(C(pL_UfA|x!iXj#d2M# zPn_XN)>Gx+o)^q>`5x zPxiUL`8C(+>nn@rYBLZ$Y}^dL(Huc|KX2dptHtNu!xmP+Zh=?Naezjr`h%lmjULPb z(PNbP@nHftKvxd42K{$~Ib=eX%?7*0QUtkoLxY2iCYTrd^O~sf@r56Q;U&v)!5-Hq zn_4xdVZvm5jv(4sseWNNbonOz(Ls{`8M;EzZ_U&iXUpqY)fSS%uEty-3By;6xK=OqLLE2%BHoadd`#TIx7ue@Vl=s z+Cu(IJR>16kb%>@{*M2-gDU(}RMdJHhRP;Y9@{ziFeHXBrH^Pt`MO~Qabt6ye*wmtNPKDWTEPQ&gMh(}ozXu9s7Kh+BV`T}=Yb30vBZ zbbqg3EGf!CZ9m_jh#E&FZMW2>jT%cOEsw`zDIl|Crhz%PV`c{CyyK2(*FcxI1EIt%-QC^qFBe@+c7A+DQ!r9h4vTmUlLQ(d^i9d15&RdU zC-5gHC)LJ~r+0U!qb=dqyPsYcFe1p&R?yU1np%*0 znZ`SIRd~5D8V2Ky-Y}f{;KH)9vTNILCR%?Ds@SZo3Kj;bPl<)fRI2i+PyQ#BUj;%9 zi}ycbyHeNlPmo5l1C^u{~b!b6=1S7MmBzKRzCtS*sd`t^EvJa?E$< zbIJQzvy`j?0>i&Gry34;_=*)ur-;7~|BRyA`_{z^*oBtx`e~XJy?lg$2(}Kw?Ck7k zg#L|yw{r%4Q5LxmqRa8Zc5!iWyO_18r*V|HIVSu2q`=i2CaB1nc%&ZF$9pBXwd{76 zeH|8QpWpYF?;RYv5*glnAmy|i<>)rslXPJ! z&-h39kjemrh55}≶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

    FfA-%HbKDG1|+{c#-TRGlUiQ$Kr1(d*0dVNdsm) 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 xg8ZL9@h6xFLr=*RKJGR{ai2YNTvy6JGVgpReG + +fixpoint list rotate_left(int n, list xs) { + return append(drop(n, xs), take(n, xs)); +} + +fixpoint list singleton(t x) { + return cons(x, nil); +} + +lemma void note(bool b) + requires b; + ensures b; +{} + +lemma_auto void rotate_length(int n, list xs) + requires 0 <= n && n <= length(xs); + ensures length(rotate_left(n, xs)) == length(xs); +{} + +lemma void take_length_eq(int k, list xs, list ys) + requires 0 <= k && k <= length(xs) && take(k, xs) == ys; + ensures length(ys) == k; +{} + +lemma void leq_bound(int x, int b) + requires b <= x && x <= b; + ensures x == b; +{} + +lemma void mul_mono_l_strict(int x, int y, int n) + requires 0 < n &*& x < y; + ensures x * n < y * n; +{ + for (int i = 1; i < n; i++) + invariant i <= n &*& x * i < y * i; + decreases n - i; + {} +} + +lemma void div_leq(int x, int y, int n) + requires 0 < n && x * n <= y * n; + ensures x <= y; +{ + assert x * n <= y * n; + if (x <= y) { + mul_mono_l(x,y,n); + } else { + mul_mono_l_strict(y,x,n); //< contradiction + } +} + +lemma void div_lt(int x, int y, int n) + requires 0 < n && x * n < y * n; + ensures x < y; +{ + assert x * n <= y * n; + if (x == y) { + } else if (x <= y) { + mul_mono_l(x,y,n); + } else { + assert y < x; + mul_mono_l(y,x,n); //< contradiction + } +} + +lemma_auto void mod_same(int n) + requires 0 < n; + ensures n % n == 0; +{ + div_rem_nonneg(n, n); + if (n / n < 1) {} else if (n / n > 1) { + mul_mono_l(2, n/n, n); + } else {} +} + +lemma void mod_lt(int x, int n) + requires 0 <= x && x < n; + ensures x % n == x; +{ + div_rem_nonneg(x, n); + if (x / n > 0) { + mul_mono_l(1, x / n, n); + } else { + } +} + +lemma void mod_plus_one(int x, int y, int n) + requires 0 <= y && 0 < n && x == (y % n); + ensures ((x+1) % n) == ((y+1) % n); +{ + div_rem_nonneg(y, n); + div_rem_nonneg(y+1, n); + div_rem_nonneg(y%n+1, n); + if (y%n+1 < n) { + mod_lt(y%n+1, n); + assert y%n == y - y/n*n; + assert (y+1)%n == y + 1 - (y + 1)/n*n; + if ((y+1)/n > y/n) { + mul_mono_l(y/n + 1, (y+1)/n, n); + } else if ((y+1)/n < y/n) { + mul_mono_l((y+1)/n + 1, y/n, n); + } + assert y - (y+1)/n*n == y - y/n*n; + assert y+1 - (y+1)/n*n == y - y/n*n + 1; + assert (y+1)%n == y%n + 1; + } else { + assert y%n+1 == n; + assert (y%n+1)%n == 0; + if (y/n + 1 < (y+1)/n) { + mul_mono_l(y/n + 2, (y+1)/n, n); + } else if (y/n + 1 > (y+1)/n) { + mul_mono_l((y+1)/n, y/n, n); + } + assert (y+1)/n == y/n + 1; + note((y+1)/n*n == (y/n + 1)*n); + assert (y+1)%n == 0; + } + assert (y%n+1)%n == (y+1)%n; +} + +lemma void mod_mul(int x, int n, int y) + requires 0 < n && 0 <= x && 0 <= y; + ensures (x*n + y)%n == y%n; +{ + mul_mono_l(0, x, n); + div_rem_nonneg(x*n+y, n); + div_rem_nonneg(y, n); + + if ((x*n+y)/n > x + y/n) { + mul_mono_l(x + y/n + 1, (x*n+y)/n, n); + } else if ((x*n+y)/n < x + y/n) { + mul_mono_l((x*n+y)/n + 1, x + y/n, n); + } + note((x*n + y)/n == x + y/n); + note((x*n + y)/n*n == (x + y/n)*n); +} + +lemma void mod_plus_distr(int x, int y, int n) + requires 0 < n && 0 <= x && 0 <= y; + ensures ((x % n) + y) % n == (x + y) % n; +{ + div_rem_nonneg(x, n); + div_rem_nonneg(x%n+y, n); + div_rem_nonneg(x+y, n); + + assert x == x/n*n + x%n; + mod_mul(x/n, n, x%n + y); +} + +lemma_auto void mod_mod(int x, int n) + requires 0 < n && 0 <= x; + ensures (x % n) % n == (x % n); +{ + mod_plus_distr(x, 0, n); +} + +lemma void mod_plus(int x, int y, int n); + requires 0 < n && 0 <= x && 0 <= y; + ensures (x + y) % n == ((x % n) + (y % n)) % n; + +lemma_auto void mod_range(int x, int n) + requires 0 <= x && 0 < n; + ensures 0 <= (x % n) && (x % n) < n; +{ + div_rem_nonneg(x, n); +} + +lemma void drop_update_le(int i, int j, t x, list xs) + requires 0 <= i && i <= j && j < length(xs); + ensures drop(i, update(j, x, xs)) == update(j - i, x, drop(i, xs)); +{ + switch (xs) { + case nil: + case cons(x0, xs0): + if (i == 0) { + } else { + drop_update_le(i - 1, j - 1, x, xs0); + } + } +} + +lemma void drop_update_ge(int i, int j, t x, list xs) + requires 0 <= j && j < i && i < length(xs); + ensures drop(i, update(j, x, xs)) == drop(i, xs); +{ + switch (xs) { + case nil: + case cons(x0, xs0): + if (j == 0) { + } else { + drop_update_ge(i - 1, j - 1, x, xs0); + } + } +} + +lemma void take_update_le(int i, int j, t x, list xs) + requires 0 <= i && i <= j; + ensures take(i, update(j, x, xs)) == take(i, xs); +{ + switch (xs) { + case nil: + case cons(x0, xs0): + if (i == 0) { + } else { + take_update_le(i - 1, j - 1, x, xs0); + } + } +} + +lemma void take_update_ge(int i, int j, t x, list xs) + requires 0 <= j && j < i && i <= length(xs); + ensures take(i, update(j, x, xs)) == update(j, x, take(i, xs)); +{ + switch (xs) { + case nil: + case cons(x0, xs0): + if (j == 0) { + } else { + take_update_ge(i - 1, j - 1, x, xs0); + } + } +} + +lemma void update_eq_append(int i, t x, list xs) + requires 0 <= i && i < length(xs); + ensures update(i, x, xs) == append(take(i, xs), cons(x, drop(i + 1, xs))); +{ + switch (xs) { + case nil: + case cons(x0, xs0): + if (i == 0) { + } else { + update_eq_append(i - 1, x, xs0); + } + } +} + +lemma void take_append_ge(int n, list xs, list ys) + requires length(xs) <= n; + ensures take(n, append(xs, ys)) == append(xs, take(n - length(xs), ys)); +{ + switch (xs) { + case nil: + case cons(x0, xs0): + take_append_ge(n - 1, xs0, ys); + } +} + +lemma void drop_drop(int m, int n, list xs) + requires 0 <= m && 0 <= n; + ensures drop(m, drop(n, xs)) == drop(m+n, xs); +{ + switch (xs) { + case nil: + case cons(x0, xs0): + if (n == 0) {} else { + drop_drop(m, n-1, xs0); + } + } +} + +lemma void take_take(int m, int n, list xs) + requires 0 <= m && m <= n && n <= length(xs); + ensures take(m, take(n, xs)) == take(m, xs); +{ + switch (xs) { + case nil: + case cons(x0, xs0): + if (m == 0) {} else { + take_take(m - 1, n - 1, xs0); + } + } +} + +lemma void index_of_distinct(list xs, t x1, t x2) + requires mem(x1, xs) == true &*& mem(x2, xs) == true &*& x1 != x2; + ensures index_of(x1, xs) != index_of(x2, xs); +{ + switch (xs) { + case nil: + case cons(h, tl): + if (h == x1 || h == x2) { + /* trivial */ + } else { + index_of_distinct(tl, x1, x2); + } + } +} + +lemma void remove_remove_nth(list xs, t x) + requires mem(x, xs) == true; + ensures remove(x, xs) == remove_nth(index_of(x, xs), xs); +{ + switch (xs) { + case nil: + case cons(h, tl): + if (x == h) { + assert index_of(x, xs) == 0; + } else { + remove_remove_nth(tl, x); + } + } +} + +lemma void enq_lemma(int k, int i, list xs, list ys, t z) + requires 0 <= k && 0 <= i && 0 < length(xs) && k < length(xs) && i < length(xs) && take(k, rotate_left(i, xs)) == ys; + ensures take(k+1, rotate_left(i, update((i+k)%length(xs), z, xs))) == append(ys, cons(z, nil)); +{ + int j = (i+k)%length(xs); + assert take(k, append(drop(i, xs), take(i, xs))) == ys; + if (i + k < length(xs)) { + mod_lt(i + k, length(xs)); + assert j == i + k; + drop_update_le(i, i + k, z, xs); + assert drop(i, update(i + k, z, xs)) == update(k, z, drop(i, xs)); + take_update_le(i, i + k, z, xs); + assert take(i, update(i + k, z, xs)) == take(i, xs); + take_append(k+1, update(k, z, drop(i, xs)), take(i, xs)); + assert take(k+1, append(update(k, z, drop(i, xs)), take(i, xs))) == take(k+1, update(k, z, drop(i, xs))); + update_eq_append(k, z, drop(i, xs)); + assert update(k, z, drop(i, xs)) == append(take(k, drop(i, xs)), cons(z, drop(k + 1, drop(i, xs)))); + take_append_ge(k+1, take(k, drop(i, xs)), cons(z, drop(k + 1, drop(i, xs)))); + assert take(k+1, append(take(k, drop(i, xs)), cons(z, drop(k + 1, drop(i, xs))))) == + append(take(k, drop(i, xs)), {z}); + take_append(k, drop(i, xs), take(i, xs)); + assert take(k+1, append(take(k, drop(i, xs)), cons(z, drop(k + 1, drop(i, xs))))) == + append(take(k, append(drop(i, xs), take(i, xs))), {z}); + assert take(k+1, update(k, z, drop(i, xs))) == + append(take(k, append(drop(i, xs), take(i, xs))), {z}); + assert take(k+1, append(update(k, z, drop(i, xs)), take(i, xs))) == + append(take(k, append(drop(i, xs), take(i, xs))), {z}); + assert take(k+1, append(drop(i, update(i + k, z, xs)), take(i, update(i + k, z, xs)))) == + append(take(k, append(drop(i, xs), take(i, xs))), {z}); + + } else { + assert i + k < 2 * length(xs); + div_rem_nonneg(i + k, length(xs)); + if ((i + k) / length(xs) > 1) { + mul_mono_l(2, (i + k) / length(xs), length(xs)); + } else if ((i + k) / length(xs) < 1) { + mul_mono_l((i + k) / length(xs), 0, length(xs)); + } + assert j == i + k - length(xs); + assert j < i; + drop_update_ge(i, j, z, xs); + assert drop(i, update(j, z, xs)) == drop(i, xs); + take_update_ge(i, j, z, xs); + assert update(j, z, take(i, xs)) == take(i, update(j, z, xs)); + take_append_ge(k+1, drop(i, xs), take(i, update(j, z, xs))); + assert take(k+1, append(drop(i, update(j, z, xs)), take(i, update(j, z, xs)))) == + append(drop(i, xs), take(j+1, update(j, z, take(i, xs)))); + update_eq_append(j, z, take(i, xs)); + assert update(j, z, take(i, xs)) == append(take(j, take(i, xs)), cons(z, drop(j + 1, take(i, xs)))); + take_take(j, i, xs); + assert update(j, z, take(i, xs)) == append(take(j, xs), cons(z, drop(j+1, take(i, xs)))); + take_append_ge(j+1, take(j, xs), cons(z, drop(j+1, take(i, xs)))); + assert append(drop(i, xs), take(j+1, update(j, z, take(i, xs)))) == + append(drop(i, xs), append(take(j, xs), {z})); + take_append_ge(k, drop(i, xs), take(i, xs)); + append_assoc(drop(i, xs), take(j, xs), {z}); + assert append(drop(i, xs), append(take(j, xs), {z})) == + append(take(k, append(drop(i, xs), take(i, xs))), {z}); + assert append(drop(i, xs), take(j+1, update(j, z, take(i, xs)))) == + append(take(k, append(drop(i, xs), take(i, xs))), {z}); + } + assert take(k+1, append(drop(i, update(j, z, xs)), take(i, update(j, z, xs)))) == + append(take(k, append(drop(i, xs), take(i, xs))), {z}); + assert take(k+1, append(drop(i, update(j, z, xs)), take(i, update(j, z, xs)))) == append(ys, {z}); +} + +lemma void front_enq_lemma(int k, int i, list xs, list ys, t z) + requires 0 < length(xs) && 0 <= k && k < length(xs) && 0 <= i && i < length(xs) && take(k, rotate_left((i+1)%length(xs), xs)) == ys; + ensures take(k+1, rotate_left(i, update(i, z, xs))) == cons(z, ys); +{ + int n = length(xs); + if (i+1 < n) { + mod_lt(i+1, n); + assert i < n; + assert take(k+1, rotate_left(i, update(i, z, xs))) == + take(k+1, append(drop(i, update(i, z, xs)), take(i, update(i, z, xs)))); + drop_update_le(i, i, z, xs); + take_update_le(i, i, z, xs); + assert take(k+1, append(drop(i, update(i, z, xs)), take(i, update(i, z, xs)))) == + take(k+1, append(update(0, z, drop(i, xs)), take(i, xs))); + update_eq_append(0, z, drop(i, xs)); + assert update(0, z, drop(i, xs)) == cons(z, drop(1, drop(i, xs))); + drop_drop(1, i, xs); + assert take(k+1, append(update(0, z, drop(i, xs)), take(i, xs))) == + take(k+1, append(cons(z, drop(i+1, xs)), take(i, xs))); + assert take(k+1, append(cons(z, drop(i+1, xs)), take(i, xs))) == + cons(z, take(k, append(drop(i+1, xs), take(i, xs)))); + + assert ys == take(k, rotate_left(i+1, xs)); + assert ys == take(k, append(drop(i+1, xs), take(i+1, xs))); + if (k <= length(drop(i+1, xs))) { + take_append(k, drop(i+1, xs), take(i+1, xs)); + take_append(k, drop(i+1, xs), take(i, xs)); + } else { + take_append_ge(k, drop(i+1, xs), take(i+1, xs)); + take_append_ge(k, drop(i+1, xs), take(i, xs)); + + assert (i+1) + k < 2 * n; + div_rem_nonneg((i+1) + k, n); + if (((i+1) + k) / n > 1) { + mul_mono_l(2, ((i+1) + k) / n, n); + } else if (((i+1) + k) / n < 1) { + mul_mono_l(((i+1) + k) / n, 0, n); + } + int j = ((i+1)+k)%n; + assert j <= i; + int l = length(drop(i+1, xs)); + assert l == n - i - 1; + take_take(k - l, i + 1, xs); + take_take(k - l, i, xs); + } + } else { + assert i == (n-1); + assert (i + 1) % n == 0; + drop_update_le(i, i, z, xs); + update_eq_append(0, z, xs); + assert take(k+1, rotate_left(i, update(i, z, xs))) == + take(k+1, append(drop(i, update(i, z, xs)), take(i, update(i, z, xs)))); + drop_update_le(i, i, z, xs); + assert take(k+1, rotate_left(i, update(i, z, xs))) == + take(k+1, append(update(0, z, drop(i, xs)), take(i, update(i, z, xs)))); + update_eq_append(0, z, drop(i, xs)); + assert take(k+1, rotate_left(i, update(i, z, xs))) == + take(k+1, append(cons(z, drop(1, drop(i, xs))), take(i, update(i, z, xs)))); + drop_drop(1, i, xs); + assert take(k+1, rotate_left(i, update(i, z, xs))) == + take(k+1, append(cons(z, nil), take(i, update(i, z, xs)))); + take_update_le(i, i, z, xs); + assert take(k+1, rotate_left(i, update(i, z, xs))) == + cons(z, take(k, take(i, xs))); + take_take(k, i, xs); + assert take(k+1, rotate_left(i, update(i, z, xs))) == cons(z, ys); + } +} + +lemma void deq_lemma(int k, int i, list xs, list ys, t z) + requires 0 < k && k <= length(xs) && 0 <= i && i < length(xs) && take(k, rotate_left(i, xs)) == ys && z == head(ys); + ensures take(k-1, rotate_left((i+1)%length(xs), xs)) == tail(ys); +{ + int j = (i+1)%length(xs); + drop_n_plus_one(i, xs); + assert tail(take(k, append(drop(i, xs), take(i, xs)))) == take(k-1, append(drop(i+1, xs), take(i, xs))); + if (i+1 < length(xs)) { + mod_lt(i+1, length(xs)); + assert j == i+1; + if (k-1 <= length(xs)-j) { + take_append(k-1, drop(j, xs), take(j, xs)); + take_append(k-1, drop(j, xs), take(i, xs)); + } else { + assert k+i > length(xs); + take_append_ge(k-1, drop(j, xs), take(j, xs)); + take_append_ge(k-1, drop(j, xs), take(i, xs)); + assert k-1-(length(xs)-j) == k+i-length(xs); + assert k+i-length(xs) <= i; + take_take(k+i-length(xs), j, xs); + take_take(k+i-length(xs), i, xs); + assert take(k+i-length(xs), take(j, xs)) == take(k+i-length(xs), take(i, xs)); + } + } else { + assert i+1 == length(xs); + assert (i+1)%length(xs) == 0; + assert j == 0; + assert append(drop(j, xs), take(j, xs)) == xs; + assert append(drop(i+1, xs), take(i, xs)) == take(i, xs); + take_append_ge(k-1, drop(i+1, xs), take(i, xs)); + take_take(k-1, i, xs); + } + assert take(k-1, append(drop(j, xs), take(j, xs))) == take(k-1, append(drop(i+1, xs), take(i, xs))); + assert take(k-1, append(drop(j, xs), take(j, xs))) == tail(take(k, append(drop(i, xs), take(i, xs)))); +} + +lemma void deq_value_lemma(int k, int i, list xs, list ys) + requires 0 < k && k <= length(ys) && 0 <= i && i < length(xs) && take(k, rotate_left(i, xs)) == ys; + ensures nth(i, xs) == head(ys); +{ + drop_n_plus_one(i, xs); + assert nth(i, xs) == head(take(k, append(drop(i, xs), take(i, xs)))); +} + +lemma void combine_list_no_change(listprefix, t x, listsuffix, int i, list xs) + requires 0 <= i && i < length(xs) && prefix == take(i, xs) && x == nth(i, xs) && suffix == drop(i+1, xs); + ensures xs == append(prefix, cons(x, suffix)); +{ + drop_n_plus_one(i, xs); +} + +/* Following lemma from `verifast/examples/vstte2010/problem4.java`. */ +lemma void update_rewrite(list vs, t v, int pos) + requires 0 <= pos && pos < length(vs); + ensures update(pos, v, vs) == append(take(pos, vs), cons(v, (drop(pos+1, vs)))); +{ + switch(vs) { + case nil: + case cons(h, t): + if(pos == 0) { + } else { + update_rewrite(t, v, pos - 1); + } + } +} + +lemma void combine_list_update(listprefix, t x, listsuffix, int i, list xs) + requires 0 <= i && i < length(xs) && prefix == take(i, xs) && suffix == drop(i+1, xs); + ensures update(i, x, xs) == append(prefix, cons(x, suffix)); +{ + update_rewrite(xs, x, i); +} + +#endif /* COMMON_H */ diff --git a/FreeRTOS/Test/VeriFast/include/proof/queue.h b/FreeRTOS/Test/VeriFast/include/proof/queue.h new file mode 100644 index 0000000000..3caa066e05 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/include/proof/queue.h @@ -0,0 +1,435 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef QUEUE_H +#define QUEUE_H + +#define VERIFAST +#include +#include +#include +#include +/*@#include "common.gh"@*/ + +typedef size_t TickType_t; +typedef size_t UBaseType_t; +typedef ssize_t BaseType_t; + +/* Empty/no-op macros */ +/* Tracing */ +#define traceBLOCKING_ON_QUEUE_PEEK(x) +#define traceBLOCKING_ON_QUEUE_RECEIVE(x) +#define traceBLOCKING_ON_QUEUE_SEND(x) +#define traceQUEUE_CREATE(x) +#define traceQUEUE_CREATE_FAILED(x) +#define traceQUEUE_DELETE(x) +#define traceQUEUE_PEEK(x) +#define traceQUEUE_PEEK_FAILED(x) +#define traceQUEUE_PEEK_FROM_ISR(x) +#define traceQUEUE_PEEK_FROM_ISR_FAILED(x) +#define traceQUEUE_RECEIVE(x) +#define traceQUEUE_RECEIVE_FAILED(x) +#define traceQUEUE_RECEIVE_FROM_ISR(x) +#define traceQUEUE_RECEIVE_FROM_ISR_FAILED(x) +#define traceQUEUE_SEND(x) +#define traceQUEUE_SEND_FAILED(x) +#define traceQUEUE_SEND_FROM_ISR(x) +#define traceQUEUE_SEND_FROM_ISR_FAILED(x) +/* Coverage */ +#define mtCOVERAGE_TEST_MARKER() +/* Asserts */ +#define configASSERT(x) +#define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() + +/* Map portable memory management functions */ +#define pvPortMalloc malloc +#define vPortFree free + +#define queueSEND_TO_BACK 0 +#define queueSEND_TO_FRONT 1 +#define queueOVERWRITE 2 + +#define pdTRUE 1 +#define pdFALSE 0 + +#define pdPASS pdTRUE +#define pdFAIL pdFALSE +#define errQUEUE_FULL 0 +#define errQUEUE_EMPTY 0 + +#define queueUNLOCKED ( ( int8_t ) -1 ) +#define queueLOCKED_UNMODIFIED ( ( int8_t ) 0 ) +#define queueINT8_MAX ( ( int8_t ) 127 ) + +typedef struct QueuePointers +{ + int8_t *pcTail; /*< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ + int8_t *pcReadFrom; /*< Points to the last place that a queued item was read from when the structure is used as a queue. */ +} QueuePointers_t; + +typedef struct SemaphoreData +{ +#ifdef VERIFAST /*< do not model xMutexHolder */ + void *xMutexHolder; +#else + TaskHandle_t xMutexHolder; /*< The handle of the task that holds the mutex. */ +#endif + UBaseType_t uxRecursiveCallCount;/*< Maintains a count of the number of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */ +} SemaphoreData_t; + +/* VeriFast does not support unions so we replace with a struct */ +struct fake_union_t { + QueuePointers_t xQueue; + SemaphoreData_t xSemaphore; +}; + +typedef struct xLIST { + UBaseType_t uxNumberOfItems; +#ifndef VERIFAST /*< do not model pxIndex and xListEnd of xLIST struct */ + struct xLIST_ITEM *pxIndex; + MiniListItem_t xListEnd; +#endif +} List_t; + +typedef struct QueueDefinition /* The old naming convention is used to prevent breaking kernel aware debuggers. */ { + int8_t *pcHead; /*< Points to the beginning of the queue storage area. */ + int8_t *pcWriteTo; /*< Points to the free next place in the storage area. */ + +#ifdef VERIFAST /*< VeriFast does not model unions */ + struct fake_union_t u; +#else + union + { + QueuePointers_t xQueue; /*< Data required exclusively when this structure is used as a queue. */ + SemaphoreData_t xSemaphore; /*< Data required exclusively when this structure is used as a semaphore. */ + } u; +#endif + + List_t xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ + List_t xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ + + volatile UBaseType_t uxMessagesWaiting;/*< The number of items currently in the queue. */ + UBaseType_t uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ + UBaseType_t uxItemSize; /*< The size of each items that the queue will hold. */ + + volatile int8_t cRxLock; /*< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + volatile int8_t cTxLock; /*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + + /*@struct mutex *irqMask;@*/ /*< Ghost mutex simulates the effect of irq masking */ + /*@struct mutex *schedulerSuspend;@*/ /*< Ghost mutex simulates the effect of scheduler suspension */ + /*@struct mutex *locked;@*/ /*< Ghost mutex simulates the effect of queue locking */ +} xQUEUE; + +typedef xQUEUE Queue_t; + +typedef struct QueueDefinition * QueueHandle_t; + +/*@ +#define QUEUE_SHAPE(q, Storage, N, M, K) \ + malloc_block_QueueDefinition(q) &*& \ + q->pcHead |-> Storage &*& \ + q->pcWriteTo |-> ?WPtr &*& \ + q->u.xQueue.pcTail |-> ?End &*& \ + q->u.xQueue.pcReadFrom |-> ?RPtr &*& \ + q->uxItemSize |-> M &*& \ + q->uxLength |-> N &*& \ + q->uxMessagesWaiting |-> K &*& \ + q->cRxLock |-> ?rxLock &*& \ + q->cTxLock |-> ?txLock &*& \ + struct_QueuePointers_padding(&q->u.xQueue) &*& \ + struct_SemaphoreData_padding(&q->u.xSemaphore) &*& \ + struct_fake_union_t_padding(&q->u) &*& \ + struct_xLIST_padding(&q->xTasksWaitingToSend) &*& \ + struct_xLIST_padding(&q->xTasksWaitingToReceive) &*& \ + q->u.xSemaphore.xMutexHolder |-> _ &*& \ + q->u.xSemaphore.uxRecursiveCallCount |-> _ &*& \ + true + +predicate queue(QueueHandle_t q, int8_t *Storage, size_t N, size_t M, size_t W, size_t R, size_t K, bool is_locked; list >abs) = + QUEUE_SHAPE(q, Storage, N, M, K) &*& + 0 < N &*& + 0 < M &*& + 0 <= W &*& W < N &*& + 0 <= R &*& R < N &*& + 0 <= K &*& K <= N &*& + W == (R + 1 + K) % N &*& + (-1) <= rxLock &*& + (-1) <= txLock &*& + (is_locked ? 0 <= rxLock : (-1) == rxLock) &*& + (is_locked ? 0 <= txLock : (-1) == txLock) &*& + WPtr == Storage + (W*M) &*& + RPtr == Storage + (R*M) &*& + End == Storage + (N*M) &*& + buffer(Storage, N, M, ?contents) &*& + length(contents) == N &*& + abs == take(K, rotate_left((R+1)%N, contents)) &*& + malloc_block(Storage, N*M) &*& + true + ; + +predicate buffer(char *buffer, size_t N, size_t M; list > elements) = + N == 0 + ? elements == nil + : chars(buffer, M, ?x) &*& buffer(buffer + M, N - 1, M, ?xs) &*& elements == cons(x, xs); + +// TODO: buffer_from_chars proof +lemma void buffer_from_chars(char *buffer, size_t N, size_t M); +requires chars(buffer, N*M, _); +ensures exists > >(?elements) &*& buffer(buffer, N, M, elements) &*& length(elements) == N; + +// TODO: split_element proof +lemma void split_element(char *buffer, size_t N, size_t M, size_t i); +requires buffer(buffer, N, M, ?elements) &*& i < N; +ensures + buffer(buffer, i, M, take(i, elements)) &*& + chars(buffer + i * M, M, nth(i, elements)) &*& + buffer(buffer + (i + 1) * M, (N-1-i), M, drop(i+1, elements)); + +// TODO: join_element proof +lemma void join_element(char *buffer, size_t N, size_t M, size_t i); +requires + buffer(buffer, i, M, ?prefix) &*& + chars(buffer + i * M, M, ?element) &*& + buffer(buffer + (i + 1) * M, (N-1-i), M, ?suffix); +ensures buffer(buffer, N, M, append(prefix, cons(element, suffix))); + +predicate list(List_t *l;) = + l->uxNumberOfItems |-> _; + +predicate queuelists(QueueHandle_t q;) = + list(&q->xTasksWaitingToSend) &*& + list(&q->xTasksWaitingToReceive); +@*/ + +/* Because prvCopyDataFromQueue does *not* decrement uxMessagesWaiting (K) the +queue predicate above does not hold as a postcondition. If the caller +subsequently decrements K then the queue predicate can be reinstated. */ +/*@ +predicate queue_after_prvCopyDataFromQueue(QueueHandle_t q, int8_t *Storage, size_t N, size_t M, size_t W, size_t R, size_t K, bool is_locked; list >abs) = + QUEUE_SHAPE(q, Storage, N, M, K) &*& + 0 < N &*& + 0 < M &*& + 0 <= W &*& W < N &*& + 0 <= R &*& R < N &*& + 0 <= K &*& K <= N &*& + W == (R + K) % N &*& //< Differs from queue predicate + (-1) <= rxLock &*& + (-1) <= txLock &*& + (is_locked ? 0 <= rxLock : (-1) == rxLock) &*& + (is_locked ? 0 <= txLock : (-1) == txLock) &*& + WPtr == Storage + (W*M) &*& + RPtr == Storage + (R*M) &*& + End == Storage + (N*M) &*& + buffer(Storage, N, M, ?contents) &*& + length(contents) == N &*& + abs == take(K, rotate_left(R, contents)) &*& //< Differs from queue predicate + malloc_block(Storage, N*M) &*& + true + ; +@*/ + +/* Can't be called `mutex` as this clashes with VeriFast's predicate */ +/*@ +predicate freertos_mutex(QueueHandle_t q, int8_t *Storage, size_t N, size_t K;) = + QUEUE_SHAPE(q, Storage, N, 0, K) &*& + queuelists(q) &*& + 0 < N &*& + 0 <= K &*& K <= N &*& + (-1) <= rxLock &*& + (-1) <= txLock &*& + WPtr == Storage &*& + RPtr == Storage &*& + End == Storage &*& + malloc_block(Storage, 0) &*& + chars(Storage, 0, _) &*& + true + ; +@*/ + +/* A queuehandle can be shared between tasks and ISRs. Acquiring the ghost +`irqMask` gives access to the core queue resources. The permissions granted +after masking interrupts depends on the caller: +- A task has access to the queue and the queuelists +- An ISR has access to the queue and, if the queue is unlocked, the queuelists */ +/*@ +predicate queuehandle(QueueHandle_t q, size_t N, size_t M, bool is_isr;) = + q->irqMask |-> ?m &*& mutex(m, irqs_masked_invariant(q, N, M, is_isr)); + +predicate_ctor irqs_masked_invariant(QueueHandle_t queue, size_t N, size_t M, bool is_isr)() = + queue(queue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs) &*& + (is_isr && is_locked ? true : queuelists(queue)); +@*/ + +/* A queuesuspend can be shared between tasks. Acquiring the ghost `schedulerSuspend` gives access to the `locked` mutex. */ +/*@ +predicate_ctor scheduler_suspended_invariant(QueueHandle_t queue)() = + queue->locked |-> ?m &*& + mutex(m, queue_locked_invariant(queue)); + +predicate queuesuspend(QueueHandle_t q;) = + q->schedulerSuspend |-> ?m &*& + mutex(m, scheduler_suspended_invariant(q)); +@*/ + +/* A queuelock is exclusively acquired by a task. Acquiring the ghost `queuelock` gives access to the queue list resources. */ +/*@ +predicate queuelock(QueueHandle_t q;) = + q->locked |-> ?m &*& + mutex(m, queue_locked_invariant(q)); + +predicate_ctor queue_locked_invariant(QueueHandle_t queue)() = + queuelists(queue); +@*/ + +BaseType_t vListInitialise(List_t *list); +/*@requires list(list);@*/ +/*@ensures list(list);@*/ + +BaseType_t listLIST_IS_EMPTY(List_t *list); +/*@requires list->uxNumberOfItems |-> ?len;@*/ +/*@ensures list->uxNumberOfItems |-> len &*& result == (len == 0 ? pdTRUE : pdFALSE);@*/ + +typedef struct xTIME_OUT +{ + BaseType_t xOverflowCount; + TickType_t xTimeOnEntering; +} TimeOut_t; + +/*@ +predicate xTIME_OUT(struct xTIME_OUT *to;) = + to->xOverflowCount |-> _ &*& + to->xTimeOnEntering |-> _ &*& + struct_xTIME_OUT_padding(to); +@*/ + +void vTaskInternalSetTimeOutState( TimeOut_t * x); +/*@requires xTIME_OUT(x);@*/ +/*@ensures xTIME_OUT(x);@*/ + +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ); +/*@requires xTIME_OUT(pxTimeOut) &*& u_integer(pxTicksToWait, _);@*/ +/*@ensures xTIME_OUT(pxTimeOut) &*& u_integer(pxTicksToWait, _);@*/ + +BaseType_t xTaskRemoveFromEventList(List_t *list); +/*@requires list(list);@*/ +/*@ensures list(list);@*/ + +void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ); +/*@requires list(pxEventList);@*/ +/*@ensures list(pxEventList);@*/ + +void vTaskMissedYield(); +/*@requires true;@*/ +/*@ensures true;@*/ + +void vTaskSuspendAll(); +/*@requires exists(?xQueue) &*& + [1/2]xQueue->schedulerSuspend |-> ?m &*& + [1/2]mutex(m, scheduler_suspended_invariant(xQueue));@*/ +/*@ensures [1/2]xQueue->schedulerSuspend |-> m &*& + mutex_held(m, scheduler_suspended_invariant(xQueue), currentThread, 1/2) &*& + xQueue->locked |-> ?m2 &*& + mutex(m2, queue_locked_invariant(xQueue));@*/ + +BaseType_t xTaskResumeAll( void ); +/*@requires exists(?xQueue) &*& + [1/2]xQueue->schedulerSuspend |-> ?m &*& + mutex_held(m, scheduler_suspended_invariant(xQueue), currentThread, 1/2) &*& + xQueue->locked |-> ?m2 &*& + mutex(m2, queue_locked_invariant(xQueue));@*/ +/*@ensures [1/2]xQueue->schedulerSuspend |-> m &*& + [1/2]mutex(m, scheduler_suspended_invariant(xQueue));@*/ + +void prvLockQueue( QueueHandle_t xQueue ); +/*@requires [1/2]queuehandle(xQueue, ?N, ?M, ?is_isr) &*& is_isr == false &*& + [1/2]queuelock(xQueue); @*/ +/*@ensures [1/2]queuehandle(xQueue, N, M, is_isr) &*& + [1/2]xQueue->locked |-> ?m &*& + mutex_held(m, queue_locked_invariant(xQueue), currentThread, 1/2) &*& + queue_locked_invariant(xQueue)();@*/ + +void prvUnlockQueue( QueueHandle_t xQueue ); +/*@requires [1/2]queuehandle(xQueue, ?N, ?M, ?is_isr) &*& is_isr == false &*& + [1/2]xQueue->locked |-> ?m &*& + mutex_held(m, queue_locked_invariant(xQueue), currentThread, 1/2) &*& + queue_locked_invariant(xQueue)();@*/ +/*@ensures [1/2]queuehandle(xQueue, N, M, is_isr) &*& + [1/2]queuelock(xQueue);@*/ + +void setInterruptMask(QueueHandle_t xQueue) +/*@requires [1/2]queuehandle(xQueue, ?N, ?M, ?is_isr) &*& is_isr == false;@*/ +/*@ensures [1/2]xQueue->irqMask |-> ?m &*& + mutex_held(m, irqs_masked_invariant(xQueue, N, M, is_isr), currentThread, 1/2) &*& + queue(xQueue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs) &*& + queuelists(xQueue);@*/ +{ + /*@open queuehandle(xQueue, N, M, is_isr);@*/ + mutex_acquire(xQueue->irqMask); + /*@open irqs_masked_invariant(xQueue, N, M, is_isr)();@*/ +} + +void clearInterruptMask(QueueHandle_t xQueue) +/*@requires queue(xQueue, ?Storage, ?N, ?M, ?W, ?R, ?K, ?is_locked, ?abs) &*& + [1/2]xQueue->irqMask |-> ?m &*& + mutex_held(m, irqs_masked_invariant(xQueue, N, M, false), currentThread, 1/2) &*& + queuelists(xQueue);@*/ +/*@ensures [1/2]queuehandle(xQueue, N, M, false);@*/ +{ + /*@close irqs_masked_invariant(xQueue, N, M, false)();@*/ + mutex_release(xQueue->irqMask); + /*@close [1/2]queuehandle(xQueue, N, M, false);@*/ +} + +#define taskENTER_CRITICAL() setInterruptMask(xQueue) +#define taskEXIT_CRITICAL() clearInterruptMask(xQueue) +#define portYIELD_WITHIN_API() +#define queueYIELD_IF_USING_PREEMPTION() + +UBaseType_t setInterruptMaskFromISR(QueueHandle_t xQueue) +/*@requires [1/2]queuehandle(xQueue, ?N, ?M, ?is_isr) &*& is_isr == true;@*/ +/*@ensures [1/2]xQueue->irqMask |-> ?m &*& + mutex_held(m, irqs_masked_invariant(xQueue, N, M, is_isr), currentThread, 1/2) &*& + queue(xQueue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs) &*& + (is_locked ? true : queuelists(xQueue));@*/ +{ + /*@open queuehandle(xQueue, N, M, is_isr);@*/ + mutex_acquire(xQueue->irqMask); + /*@open irqs_masked_invariant(xQueue, N, M, is_isr)();@*/ + return 0; +} + +void clearInterruptMaskFromISR(QueueHandle_t xQueue, UBaseType_t uxSavedInterruptStatus) +/*@requires queue(xQueue, ?Storage, ?N, ?M, ?W, ?R, ?K, ?is_locked, ?abs) &*& + [1/2]xQueue->irqMask |-> ?m &*& + mutex_held(m, irqs_masked_invariant(xQueue, N, M, true), currentThread, 1/2) &*& + (is_locked ? true : queuelists(xQueue));@*/ +/*@ensures [1/2]queuehandle(xQueue, N, M, true);@*/ +{ + /*@close irqs_masked_invariant(xQueue, N, M, true)();@*/ + mutex_release(xQueue->irqMask); + /*@close [1/2]queuehandle(xQueue, N, M, true);@*/ +} + +#define portSET_INTERRUPT_MASK_FROM_ISR() setInterruptMaskFromISR(xQueue) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(uxSavedInterruptStatus) clearInterruptMaskFromISR(xQueue, uxSavedInterruptStatus) + +#endif /* QUEUE_H */ diff --git a/FreeRTOS/Test/VeriFast/include/proof/queuecontracts.h b/FreeRTOS/Test/VeriFast/include/proof/queuecontracts.h new file mode 100644 index 0000000000..b89e44b0bc --- /dev/null +++ b/FreeRTOS/Test/VeriFast/include/proof/queuecontracts.h @@ -0,0 +1,57 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef QUEUECONTRACTS_H +#define QUEUECONTRACTS_H + +#include "queue.h" + +void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ); +/*@requires queue(pxQueue, ?Storage, ?N, ?M, ?W, ?R, ?K, ?is_locked, ?abs) &*& 0 < K &*& chars(pvBuffer, M, _);@*/ +/*@ensures queue_after_prvCopyDataFromQueue(pxQueue, Storage, N, M, W, (R+1)%N, K, is_locked, abs) &*& + chars(pvBuffer, M, head(abs));@*/ + +BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ); +/*@requires queue(pxQueue, ?Storage, ?N, ?M, ?W, ?R, ?K, ?is_locked, ?abs) &*& + (K < N || xPosition == queueOVERWRITE) &*& + chars(pvItemToQueue, M, ?x) &*& + (xPosition == queueSEND_TO_BACK || xPosition == queueSEND_TO_FRONT || (xPosition == queueOVERWRITE && N == 1));@*/ +/*@ensures + (xPosition == queueSEND_TO_BACK + ? queue(pxQueue, Storage, N, M, (W+1)%N, R, (K+1), is_locked, append(abs, singleton(x))) + : (xPosition == queueSEND_TO_FRONT + ? (R == 0 + ? queue(pxQueue, Storage, N, M, W, (N-1), (K+1), is_locked, cons(x, abs)) + : queue(pxQueue, Storage, N, M, W, (R-1), (K+1), is_locked, cons(x, abs))) + : xPosition == queueOVERWRITE &*& queue(pxQueue, Storage, N, M, W, R, 1, is_locked, singleton(x))) + ) &*& + chars(pvItemToQueue, M, x);@*/ + +BaseType_t prvIsQueueEmpty( Queue_t * pxQueue ); +/*@requires [1/2]queuehandle(pxQueue, ?N, ?M, ?is_isr) &*& is_isr == false;@*/ +/*@ensures [1/2]queuehandle(pxQueue, N, M, is_isr);@*/ + +BaseType_t prvIsQueueFull( Queue_t * pxQueue ); +/*@requires [1/2]queuehandle(pxQueue, ?N, ?M, ?is_isr) &*& is_isr == false;@*/ +/*@ensures [1/2]queuehandle(pxQueue, N, M, is_isr);@*/ + +#endif /* QUEUECONTRACTS_H */ diff --git a/FreeRTOS/Test/VeriFast/queue/README.md b/FreeRTOS/Test/VeriFast/queue/README.md new file mode 100644 index 0000000000..a21b66810a --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/README.md @@ -0,0 +1,25 @@ +# FreeRTOS queue proofs + +In the queue predicates and proofs we use the following variable names. + + - `N` : the queue length (i.e., the maximum number of items the queue can + store) + - `M` : the size in bytes of each element + - `W` : the logical index of the write pointer, necessarily between `0..(N-1)` + - `R` : the logical index of the read pointer, necessarily between `0..(N-1)` + - `K` : the number of items currently in the queue + +Consequently, the size of the concrete queue storage is `N*M` bytes. The +`buffer` predicate, defined in `include/proof/queue.h` allows us to treat the +queue storage as a list `contents` of `N` items, each of which is `M` bytes. + +The `queue` predicate, defined in `include/proof/queue.h`, relates the concrete +representation to an abstract list `abs` of `K` items. More precisely, the main +queue invariant is: + +``` +abs == take(K, rotate_left((R+1)%N, contents)) +``` + +where `(R+1)%N` is the front of the queue, `rotate_left` allows for the +wraparound of queue storage, and `take` gives the first `K` elements. diff --git a/FreeRTOS/Test/VeriFast/queue/create.c b/FreeRTOS/Test/VeriFast/queue/create.c new file mode 100644 index 0000000000..673427f406 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/create.c @@ -0,0 +1,258 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" + +/* Simplifying assumption: we do not verify queue initialisation in a +concurrent environment. We assume the queue initialization (including reset) +happens-before all concurrent send/receives. */ +#ifdef VERIFAST /*< ***xQueueGenericReset happens-before concurrent behavior*** */ +#define taskENTER_CRITICAL() +#define taskEXIT_CRITICAL() +#endif + +/* The following intermediate queue predicates summarise states used by queue +initialization but not used elsewhere so we confine them to these proofs +locally. */ +/*@ +predicate queue_init1(QueueHandle_t q;) = + QUEUE_SHAPE(q, _, _, _, _) &*& + queuelists(q) + ; + +predicate queue_init2(QueueHandle_t q, int8_t *Storage, size_t N, size_t M;) = + QUEUE_SHAPE(q, Storage, N, M, _) &*& + queuelists(q) &*& + 0 < N &*& + chars(Storage, (N*M), _) &*& + malloc_block(Storage, N*M) &*& + Storage + N * M <= (int8_t *)UINTPTR_MAX &*& + true + ; +@*/ + +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) +/*@requires queue_init2(xQueue, ?Storage, ?N, ?M);@*/ +/*@ensures 0 == M + ? freertos_mutex(xQueue, Storage, N, 0) + : queue(xQueue, Storage, N, M, 0, (N-1), 0, false, nil) &*& queuelists(xQueue);@*/ +{ +#ifdef VERIFAST /*< const pointer declaration */ +Queue_t * pxQueue = xQueue; +#else +Queue_t * const pxQueue = xQueue; +#endif + + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + { + pxQueue->u.xQueue.pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U; + pxQueue->pcWriteTo = pxQueue->pcHead; + /*@mul_mono_l(0, N-1, M);@*/ + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - 1U ) * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + pxQueue->cRxLock = queueUNLOCKED; + pxQueue->cTxLock = queueUNLOCKED; + + if( xNewQueue == pdFALSE ) + { + /* If there are tasks blocked waiting to read from the queue, then + the tasks will remain blocked as after this function exits the queue + will still be empty. If there are tasks blocked waiting to write to + the queue, then one should be unblocked as after this function exits + it will be possible to write to it. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Ensure the event queues start in the correct state. */ + vListInitialise( &( pxQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxQueue->xTasksWaitingToReceive ) ); + } + /* Logically, we move from a flat character array of `N*M` bytes (using + the `chars` predicate) to an array of `N` elements where each element + is `M` bytes (using the `buffer` predicate) */ + /*@if (M != 0) { buffer_from_chars(pxQueue->pcHead, N, M); }@*/ + } + taskEXIT_CRITICAL(); + + /* A value is returned for calling semantic consistency with previous + versions. */ + return pdPASS; +} + +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, const uint8_t ucQueueType, Queue_t *pxNewQueue ) +/*@requires queue_init1(pxNewQueue) &*& + 0 < uxQueueLength &*& 0 < uxItemSize &*& + malloc_block(pucQueueStorage, uxQueueLength * uxItemSize) &*& + pucQueueStorage + uxQueueLength * uxItemSize <= (uint8_t *)UINTPTR_MAX &*& + uchars(pucQueueStorage, uxQueueLength * uxItemSize,_);@*/ +/*@ensures queue(pxNewQueue, ((int8_t *)(void *)pucQueueStorage), uxQueueLength, uxItemSize, 0, (uxQueueLength-1), 0, false, nil) &*& + queuelists(pxNewQueue);@*/ +{ +#ifndef VERIFAST /*< void cast of unused var */ + /* Remove compiler warnings about unused parameters should + configUSE_TRACE_FACILITY not be set to 1. */ + ( void ) ucQueueType; +#endif + + if( uxItemSize == ( UBaseType_t ) 0 ) + { + /* No RAM was allocated for the queue storage area, but PC head cannot + be set to NULL because NULL is used as a key to say the queue is used as + a mutex. Therefore just set pcHead to point to the queue as a benign + value that is known to be within the memory map. */ +#ifdef VERIFAST /*< stricter casting */ + pxNewQueue->pcHead = ( int8_t * ) ( void * ) pxNewQueue; +#else + pxNewQueue->pcHead = ( int8_t * ) pxNewQueue; +#endif + } + else + { + /* Set the head to the start of the queue storage area. */ +#ifdef VERIFAST /*< stricter casting */ + pxNewQueue->pcHead = ( int8_t * ) ( void * ) pucQueueStorage; +#else + pxNewQueue->pcHead = ( int8_t * ) pucQueueStorage; +#endif + } + + /* Initialise the queue members as described where the queue type is + defined. */ + pxNewQueue->uxLength = uxQueueLength; + pxNewQueue->uxItemSize = uxItemSize; + /*@close queue_init2(pxNewQueue, _, uxQueueLength, uxItemSize);@*/ +#ifdef VERIFAST /*< void cast of unused return value */ + xQueueGenericReset( pxNewQueue, pdTRUE ); +#else + ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); +#endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxNewQueue->ucQueueType = ucQueueType; + } + #endif /* configUSE_TRACE_FACILITY */ + + #if( configUSE_QUEUE_SETS == 1 ) + { + pxNewQueue->pxQueueSetContainer = NULL; + } + #endif /* configUSE_QUEUE_SETS */ + + traceQUEUE_CREATE( pxNewQueue ); +} + + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) + /*@requires 0 < uxQueueLength &*& + 0 < uxItemSize &*& + 0 < uxQueueLength * uxItemSize &*& + uxQueueLength * uxItemSize <= UINT_MAX;@*/ + /*@ensures result == NULL + ? true + : queue(result, _, uxQueueLength, uxItemSize, 0, (uxQueueLength-1), 0, false, nil) &*& + queuelists(result) &*& + result->irqMask |-> _ &*& + result->schedulerSuspend |-> _ &*& + result->locked |-> _;@*/ + { + Queue_t *pxNewQueue; + size_t xQueueSizeInBytes; + uint8_t *pucQueueStorage; + + configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); + + /* Allocate enough space to hold the maximum number of items that + can be in the queue at any time. It is valid for uxItemSize to be + zero in the case the queue is used as a semaphore. */ + xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Check for multiplication overflow. */ + configASSERT( ( uxItemSize == 0 ) || ( uxQueueLength == ( xQueueSizeInBytes / uxItemSize ) ) ); + +#ifdef VERIFAST /*< ***model single malloc of struct and buffer*** */ + pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) ); +#else + /* Allocate the queue and storage area. Justification for MISRA + deviation as follows: pvPortMalloc() always ensures returned memory + blocks are aligned per the requirements of the MCU stack. In this case + pvPortMalloc() must return a pointer that is guaranteed to meet the + alignment requirements of the Queue_t structure - which in this case + is an int8_t *. Therefore, whenever the stack alignment requirements + are greater than or equal to the pointer to char requirements the cast + is safe. In other cases alignment requirements are not strict (one or + two bytes). */ + pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); /*lint !e9087 !e9079 see comment above. */ +#endif + + if( pxNewQueue != NULL ) + { +#ifdef VERIFAST /*< ***model single malloc of struct and buffer*** */ + pucQueueStorage = ( uint8_t * ) pvPortMalloc( xQueueSizeInBytes ); + if ( pucQueueStorage == NULL ) { + vPortFree( pxNewQueue ); + return NULL; + } + /*@malloc_block_limits(pucQueueStorage);@*/ +#else + /* Jump past the queue structure to find the location of the queue + storage area. */ + pucQueueStorage = ( uint8_t * ) pxNewQueue; + pucQueueStorage += sizeof( Queue_t ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ +#endif + + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Queues can be created either statically or dynamically, so + note this task was created dynamically in case it is later + deleted. */ + pxNewQueue->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + else + { + traceQUEUE_CREATE_FAILED( ucQueueType ); + mtCOVERAGE_TEST_MARKER(); + } + + return pxNewQueue; + } + diff --git a/FreeRTOS/Test/VeriFast/queue/prvCopyDataFromQueue.c b/FreeRTOS/Test/VeriFast/queue/prvCopyDataFromQueue.c new file mode 100644 index 0000000000..95a4e5926b --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/prvCopyDataFromQueue.c @@ -0,0 +1,85 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" + +static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ) +/*@requires queue(pxQueue, ?Storage, ?N, ?M, ?W, ?R, ?K, ?is_locked, ?abs) &*& 0 < K &*& chars(pvBuffer, M, _);@*/ +/*@ensures queue_after_prvCopyDataFromQueue(pxQueue, Storage, N, M, W, (R+1)%N, K, is_locked, abs) &*& + chars(pvBuffer, M, head(abs));@*/ +{ + if( pxQueue->uxItemSize != ( UBaseType_t ) 0 ) + { + /*@assert buffer(Storage, N, M, ?contents);@*/ + /*@mul_mono_l(R, N-1, M);@*/ + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */ + { + /*@div_leq(N, R+1, M);@*/ // now we know R == N-1 + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + /*@{ + div_lt(R+1, N, M); // now we know R+1 < N + mod_lt(R+1, N); // so, R+1 == (R+1)%N + note(pxQueue->u.xQueue.pcReadFrom == Storage + ((R + 1) * M)); + note( Storage + ((R + 1) * M) == Storage + (((R + 1) % N) * M)); + }@*/ + mtCOVERAGE_TEST_MARKER(); + } + /*@mod_plus(R+1, K, N);@*/ + /*@mod_mod(R+1, N);@*/ + /*@split_element(Storage, N, M, (R+1)%N);@*/ + /*@assert + buffer(Storage, (R+1)%N, M, ?prefix) &*& + chars(Storage + ((R+1)%N) * M, M, ?element) &*& + buffer(Storage + ((R+1)%N + 1) * M, (N-1-(R+1)%N), M, ?suffix);@*/ +#ifdef VERIFAST /*< void cast of unused return value */ + memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); +#else + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports. Also previous logic ensures a null pointer can only be passed to memcpy() when the count is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ +#endif + /*@{ + combine_list_no_change(prefix, element, suffix, (R+1)%N, contents); + join_element(Storage, N, M, (R+1)%N); + length_take(K, contents); + take_length_eq(K, rotate_left((R+1)%N, contents), abs); + deq_value_lemma(K, (R+1)%N, contents, abs); + }@*/ + } +} + +void caller_reinstates_queue_predicate(Queue_t *const pxQueue, void *const pvBuffer) +/*@requires queue(pxQueue, ?Storage, ?N, ?M, ?W, ?R, ?K, ?is_locked, ?abs) &*& + 0 < K &*& + chars(pvBuffer, M, _);@*/ +/*@ensures + queue(pxQueue, Storage, N, M, W, (R+1)%N, K-1, is_locked, tail(abs)) &*& + chars(pvBuffer, M, head(abs));@*/ +{ + prvCopyDataFromQueue(pxQueue, pvBuffer); + /*@open queue_after_prvCopyDataFromQueue(pxQueue, Storage, N, M, W, (R+1)%N, K, is_locked, abs);@*/ + /*@assert buffer(Storage, N, M, ?contents);@*/ + pxQueue->uxMessagesWaiting = pxQueue->uxMessagesWaiting - 1; + /*@deq_lemma(K, (R+1)%N, contents, abs, head(abs));@*/ +} diff --git a/FreeRTOS/Test/VeriFast/queue/prvCopyDataToQueue.c b/FreeRTOS/Test/VeriFast/queue/prvCopyDataToQueue.c new file mode 100644 index 0000000000..c80db2af4f --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/prvCopyDataToQueue.c @@ -0,0 +1,179 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" + +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ) +/*@requires queue(pxQueue, ?Storage, ?N, ?M, ?W, ?R, ?K, ?is_locked, ?abs) &*& + (K < N || xPosition == queueOVERWRITE) &*& + chars(pvItemToQueue, M, ?x) &*& + (xPosition == queueSEND_TO_BACK || xPosition == queueSEND_TO_FRONT || (xPosition == queueOVERWRITE && N == 1));@*/ +/*@ensures + (xPosition == queueSEND_TO_BACK + ? queue(pxQueue, Storage, N, M, (W+1)%N, R, (K+1), is_locked, append(abs, singleton(x))) + : (xPosition == queueSEND_TO_FRONT + ? (R == 0 + ? queue(pxQueue, Storage, N, M, W, (N-1), (K+1), is_locked, cons(x, abs)) + : queue(pxQueue, Storage, N, M, W, (R-1), (K+1), is_locked, cons(x, abs))) + : xPosition == queueOVERWRITE &*& queue(pxQueue, Storage, N, M, W, R, 1, is_locked, singleton(x))) + ) &*& + chars(pvItemToQueue, M, x);@*/ +{ +BaseType_t xReturn = pdFALSE; +UBaseType_t uxMessagesWaiting; + + /* This function is called from a critical section. */ + + uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* The abstract list of list of chars of `Storage` is `contents` */ + /*@assert buffer(Storage, N, M, ?contents);@*/ + if( pxQueue->uxItemSize == ( UBaseType_t ) 0 ) + { + /* This case is unreachable for queues */ + /*@assert false;@*/ + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* The mutex is no longer being held. */ + xReturn = xTaskPriorityDisinherit( pxQueue->u.xSemaphore.xMutexHolder ); + pxQueue->u.xSemaphore.xMutexHolder = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + } + else if( xPosition == queueSEND_TO_BACK ) + { +#ifdef VERIFAST /*< void cast of unused return value */ + /* Now we focus the proof on the logical element of the buffer that + will be updated using the following lemma to split the buffer into 3 + parts: a prefix, the element we want to update, and the suffix. This + enables the subsequent memcpy to verify. */ + /*@split_element(Storage, N, M, W);@*/ + /*@assert + buffer(Storage, W, M, ?prefix) &*& + chars(Storage + W * M, M, _) &*& + buffer(Storage + (W + 1) * M, (N-1-W), M, ?suffix);@*/ + memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); + /* After the update we stitch the buffer back together */ + /*@join_element(Storage, N, M, W);@*/ + /*@combine_list_update(prefix, x, suffix, W, contents);@*/ +#else + ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports, plus previous logic ensures a null pointer can only be passed to memcpy() if the copy size is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ +#endif + pxQueue->pcWriteTo += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ + if( pxQueue->pcWriteTo >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + /*@div_leq(N, W+1, M);@*/ // now we know W == N-1 + pxQueue->pcWriteTo = pxQueue->pcHead; + } + else + { + /*@{ + div_lt(W+1, N, M); // now we know W+1 < N + mod_lt(W+1, N); // so, W+1 == (W+1)%N + note(pxQueue->pcWriteTo == Storage + ((W + 1) * M)); + note( Storage + ((W + 1) * M) == Storage + (((W + 1) % N) * M)); + }@*/ + mtCOVERAGE_TEST_MARKER(); + } + } + else + { +#ifdef VERIFAST /*< void cast of unused return value */ + /*@split_element(Storage, N, M, R);@*/ + /*@assert + buffer(Storage, R, M, ?prefix) &*& + chars(Storage + R * M, M, _) &*& + buffer(Storage + (R + 1) * M, (N-1-R), M, ?suffix);@*/ + memcpy( ( void * ) pxQueue->u.xQueue.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); + /*@join_element(Storage, N, M, R);@*/ + /*@combine_list_update(prefix, x, suffix, R, contents);@*/ +#else + ( void ) memcpy( ( void * ) pxQueue->u.xQueue.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e9087 !e418 MISRA exception as the casts are only redundant for some ports. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. Assert checks null pointer only used when length is 0. */ +#endif + pxQueue->u.xQueue.pcReadFrom -= pxQueue->uxItemSize; + if( pxQueue->u.xQueue.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->u.xQueue.pcReadFrom = ( pxQueue->u.xQueue.pcTail - pxQueue->uxItemSize ); + /*@{ + div_leq(R-1, 0, M); + leq_bound(R, 0); + }@*/ + /*@assert R == 0;@*/ + /*@assert pxQueue->u.xQueue.pcReadFrom == Storage + (N-1) * M;@*/ + } + else + { + /*@assert 0 < R;@*/ + /*@assert pxQueue->u.xQueue.pcReadFrom == Storage + (R-1) * M;@*/ + mtCOVERAGE_TEST_MARKER(); + } + + /*@ + if (R == 0) { + mod_plus(N, (K+1), N); mod_same(N); mod_mod(K+1, N); + assert W == ((N-1) + 1 + (K+1)) % N; + } + @*/ + if( xPosition == queueOVERWRITE ) + { + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* An item is not being added but overwritten, so subtract + one from the recorded number of items in the queue so when + one is added again below the number of recorded items remains + correct. */ + --uxMessagesWaiting; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1; + + /*@ + if (xPosition == queueSEND_TO_BACK) { + enq_lemma(K, (R+1)%N, contents, abs, x); + mod_plus_one(W, R + 1 + K, N); + mod_plus_distr(R+1, K, N); + } else if (xPosition == queueSEND_TO_FRONT) { + front_enq_lemma(K, R, contents, abs, x); + if (0 < R) { + mod_lt(R, N); + } + } + @*/ + return xReturn; +} diff --git a/FreeRTOS/Test/VeriFast/queue/prvIsQueueEmpty.c b/FreeRTOS/Test/VeriFast/queue/prvIsQueueEmpty.c new file mode 100644 index 0000000000..1a0e42688f --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/prvIsQueueEmpty.c @@ -0,0 +1,49 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" +#define taskENTER_CRITICAL() setInterruptMask(pxQueue) +#define taskEXIT_CRITICAL() clearInterruptMask(pxQueue) + +static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue ) +/*@requires [1/2]queuehandle(pxQueue, ?N, ?M, ?is_isr) &*& is_isr == false;@*/ +/*@ensures [1/2]queuehandle(pxQueue, N, M, is_isr);@*/ +{ +BaseType_t xReturn; + + taskENTER_CRITICAL(); + /*@assert queue(pxQueue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + taskEXIT_CRITICAL(); + + return xReturn; +} diff --git a/FreeRTOS/Test/VeriFast/queue/prvIsQueueFull.c b/FreeRTOS/Test/VeriFast/queue/prvIsQueueFull.c new file mode 100644 index 0000000000..399d13bcde --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/prvIsQueueFull.c @@ -0,0 +1,50 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" +#define taskENTER_CRITICAL() setInterruptMask(pxQueue) +#define taskEXIT_CRITICAL() clearInterruptMask(pxQueue) + +static BaseType_t prvIsQueueFull( const Queue_t *pxQueue ) +/*@requires [1/2]queuehandle(pxQueue, ?N, ?M, ?is_isr) &*& is_isr == false;@*/ +/*@ensures [1/2]queuehandle(pxQueue, N, M, is_isr);@*/ +{ +BaseType_t xReturn; + + taskENTER_CRITICAL(); + /*@assert queue(pxQueue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ + { + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + taskEXIT_CRITICAL(); + + return xReturn; +} + diff --git a/FreeRTOS/Test/VeriFast/queue/prvLockQueue.c b/FreeRTOS/Test/VeriFast/queue/prvLockQueue.c new file mode 100644 index 0000000000..60c66242b0 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/prvLockQueue.c @@ -0,0 +1,67 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" + +/* In this case we cannot wrap the macro in a function call to give a function +contract because we require annotations within the macro body, which is not +supported by VeriFast */ +#define prvLockQueue( pxQueue ) \ + taskENTER_CRITICAL(); \ + { \ + if( ( pxQueue )->cRxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cRxLock = queueLOCKED_UNMODIFIED; \ + } \ + if( ( pxQueue )->cTxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cTxLock = queueLOCKED_UNMODIFIED; \ + } \ + } \ + taskEXIT_CRITICAL() + +void wrapper_prvLockQueue( QueueHandle_t xQueue ) +/*@requires [1/2]queuehandle(xQueue, ?N, ?M, ?is_isr) &*& is_isr == false &*& + [1/2]queuelock(xQueue);@*/ +/*@ensures [1/2]queuehandle(xQueue, N, M, is_isr) &*& + [1/2]xQueue->locked |-> ?m &*& + mutex_held(m, queue_locked_invariant(xQueue), currentThread, 1/2) &*& + queue_locked_invariant(xQueue)();@*/ +{ + taskENTER_CRITICAL(); + /*@open queue(xQueue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ + { + if( ( xQueue )->cRxLock == queueUNLOCKED ) + { + ( xQueue )->cRxLock = queueLOCKED_UNMODIFIED; + } + if( ( xQueue )->cTxLock == queueUNLOCKED ) + { + ( xQueue )->cTxLock = queueLOCKED_UNMODIFIED; + } + } + /*@close queue(xQueue, Storage, N, M, W, R, K, true, abs);@*/ + taskEXIT_CRITICAL(); +#ifdef VERIFAST /*< ghost action */ + mutex_acquire(xQueue->locked); +#endif +} diff --git a/FreeRTOS/Test/VeriFast/queue/prvUnlockQueue.c b/FreeRTOS/Test/VeriFast/queue/prvUnlockQueue.c new file mode 100644 index 0000000000..370dcaa0b2 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/prvUnlockQueue.c @@ -0,0 +1,162 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" +#define taskENTER_CRITICAL() setInterruptMask(pxQueue) +#define taskEXIT_CRITICAL() clearInterruptMask(pxQueue) + +/* VeriFast: we make one major change. We merge the critical regions for +decrementing `cTxLock` and `cRxLock`. */ + +static void prvUnlockQueue( Queue_t * const pxQueue ) +/*@requires [1/2]queuehandle(pxQueue, ?N, ?M, ?is_isr) &*& is_isr == false &*& + [1/2]pxQueue->locked |-> ?m &*& + mutex_held(m, queue_locked_invariant(pxQueue), currentThread, 1/2) &*& + queue_locked_invariant(pxQueue)();@*/ +/*@ensures [1/2]queuehandle(pxQueue, N, M, is_isr) &*& + [1/2]queuelock(pxQueue);@*/ +{ + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* The lock counts contains the number of extra data items placed or + removed from the queue while the queue was locked. When a queue is + locked items can be added or removed, but the event lists cannot be + updated. */ + taskENTER_CRITICAL(); + /*@open queue(pxQueue, ?Storage, N, M, ?W, ?R, ?K, _, ?abs);@*/ + { + int8_t cTxLock = pxQueue->cTxLock; + + /* See if data was added to the queue while it was locked. */ + while( cTxLock > queueLOCKED_UNMODIFIED ) + /*@invariant queuelists(pxQueue);@*/ + { + /* Data was posted while the queue was locked. Are any tasks + blocked waiting for data to become available? */ + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting to + the queue set caused a higher priority task to unblock. + A context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Tasks that are removed from the event list will get + added to the pending ready list as the scheduler is still + suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that + a context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + #endif /* configUSE_QUEUE_SETS */ + + --cTxLock; + } + + pxQueue->cTxLock = queueUNLOCKED; + } +#ifndef VERIFAST /*< ***merge cTxLock and cRxLock critical regions*** */ + taskEXIT_CRITICAL(); + + /* Do the same for the Rx lock. */ + taskENTER_CRITICAL(); +#endif + { + int8_t cRxLock = pxQueue->cRxLock; + + while( cRxLock > queueLOCKED_UNMODIFIED ) + /*@invariant queuelists(pxQueue);@*/ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --cRxLock; + } + else + { + break; + } + } + + pxQueue->cRxLock = queueUNLOCKED; + } + /*@close queue(pxQueue, Storage, N, M, W, R, K, false, abs);@*/ + taskEXIT_CRITICAL(); +#ifdef VERIFAST /*< ghost action */ + mutex_release(pxQueue->locked); +#endif +} diff --git a/FreeRTOS/Test/VeriFast/queue/uxQueueMessagesWaiting.c b/FreeRTOS/Test/VeriFast/queue/uxQueueMessagesWaiting.c new file mode 100644 index 0000000000..ca81eb4945 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/uxQueueMessagesWaiting.c @@ -0,0 +1,68 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" + +/* It may seem that the read of `pxQueue->uxMessagesWaiting` is required to be +contained in a critical region to be thread-safe. However, it is impossible for +this read to be involved in a data race due to the atomicity mechanism used by +tasks and ISRs: masking and enabling interrupts. If we assume (1) a +uniprocessor system and (2) that higher priority ISRs never call queue API +functions then masking interrupts ensures *strong isolation* meaning critical +regions protected by interrupt masking/enabling are isolated from other +critical regions and code outside of critical regions. */ + +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) +/*@requires queue(xQueue, ?Storage, ?N, ?M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ +/*@ensures queue(xQueue, Storage, N, M, W, R, K, is_locked, abs) &*& result == K;@*/ +{ +UBaseType_t uxReturn; +#ifdef VERIFAST /*< const pointer declaration */ +Queue_t * pxQueue = xQueue; +#else +Queue_t * const pxQueue = xQueue; +#endif + + configASSERT( pxQueue ); + uxReturn = pxQueue->uxMessagesWaiting; + + return uxReturn; +} + +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) +/*@requires [1/2]queuehandle(xQueue, ?N, ?M, ?is_isr) &*& is_isr == false;@*/ +/*@ensures [1/2]queuehandle(xQueue, N, M, is_isr);@*/ +{ +UBaseType_t uxReturn; + + configASSERT( xQueue ); + + taskENTER_CRITICAL(); + { + /*@assert queue(xQueue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ + uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; + /*@close queue(xQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + } + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ diff --git a/FreeRTOS/Test/VeriFast/queue/uxQueueSpacesAvailable.c b/FreeRTOS/Test/VeriFast/queue/uxQueueSpacesAvailable.c new file mode 100644 index 0000000000..e0059f91d6 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/uxQueueSpacesAvailable.c @@ -0,0 +1,48 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" + +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) +/*@requires [1/2]queuehandle(xQueue, ?N, ?M, ?is_isr) &*& is_isr == false;@*/ +/*@ensures [1/2]queuehandle(xQueue, N, M, is_isr);@*/ +{ +UBaseType_t uxReturn; +#ifdef VERIFAST /*< const pointer declaration */ +Queue_t * pxQueue = xQueue; +#else +Queue_t * const pxQueue = xQueue; +#endif + + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + /*@assert queue(xQueue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ + { + uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting; + /*@assert uxReturn == N - K;@*/ + } + /*@close queue(xQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ diff --git a/FreeRTOS/Test/VeriFast/queue/vQueueDelete.c b/FreeRTOS/Test/VeriFast/queue/vQueueDelete.c new file mode 100644 index 0000000000..dbc8f9e240 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/vQueueDelete.c @@ -0,0 +1,80 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" +#define configSUPPORT_DYNAMIC_ALLOCATION 1 +#define configSUPPORT_STATIC_ALLOCATION 0 + +void vQueueDelete( QueueHandle_t xQueue ) +/*@requires queue(xQueue, ?Storage, ?N, ?M, ?W, ?R, ?K, ?is_locked, ?abs) &*& + queuelists(xQueue) &*& + xQueue->irqMask |-> _ &*& + xQueue->schedulerSuspend |-> _ &*& + xQueue->locked |-> _;@*/ +/*@ensures true;@*/ +{ +#ifdef VERIFAST /*< const pointer declaration */ +Queue_t * pxQueue = xQueue; +#else +Queue_t * const pxQueue = xQueue; +#endif + + configASSERT( pxQueue ); + traceQUEUE_DELETE( pxQueue ); + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + vQueueUnregisterQueue( pxQueue ); + } + #endif + + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The queue can only have been allocated dynamically - free it + again. */ + vPortFree( pxQueue ); +#ifdef VERIFAST /*< leak ghost state on deletion */ + /*@leak buffer(_, _, _, _);@*/ + /*@leak malloc_block(_, _);@*/ +#endif + } + #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The queue could have been allocated statically or dynamically, so + check before attempting to free the memory. */ + if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxQueue ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else + { + /* The queue must have been statically allocated, so is not going to be + deleted. Avoid compiler warnings about the unused parameter. */ + ( void ) pxQueue; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +} diff --git a/FreeRTOS/Test/VeriFast/queue/xQueueGenericSend.c b/FreeRTOS/Test/VeriFast/queue/xQueueGenericSend.c new file mode 100644 index 0000000000..e23ca30d59 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/xQueueGenericSend.c @@ -0,0 +1,278 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" +#include "proof/queuecontracts.h" + +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) +/*@requires [1/2]queuehandle(xQueue, ?N, ?M, ?is_isr) &*& is_isr == false &*& + [1/2]queuesuspend(xQueue) &*& + chars(pvItemToQueue, M, ?x) &*& + (xCopyPosition == queueSEND_TO_BACK || xCopyPosition == queueSEND_TO_FRONT || (xCopyPosition == queueOVERWRITE && N == 1));@*/ +/*@ensures [1/2]queuehandle(xQueue, N, M, is_isr) &*& + [1/2]queuesuspend(xQueue) &*& + chars(pvItemToQueue, M, x);@*/ +{ +BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired; +TimeOut_t xTimeOut; +#ifdef VERIFAST /*< const pointer declaration */ +Queue_t * pxQueue = xQueue; +#else +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + +#endif + + /*lint -save -e904 This function relaxes the coding standard somewhat to + allow return statements within the function itself. This is done in the + interest of execution time efficiency. */ + for( ;; ) + /*@invariant [1/2]queuehandle(xQueue, N, M, is_isr) &*& + [1/2]queuesuspend(xQueue) &*& + chars(pvItemToQueue, M, x) &*& + u_integer(&xTicksToWait, _) &*& + (xCopyPosition == queueSEND_TO_BACK || xCopyPosition == queueSEND_TO_FRONT || (xCopyPosition == queueOVERWRITE && N == 1)) &*& + xTIME_OUT(&xTimeOut);@*/ + { + taskENTER_CRITICAL(); + { + /*@assert queue(pxQueue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ + /* Is there room on the queue now? The running task must be the + highest priority task wanting to access the queue. If the head item + in the queue is to be overwritten then it does not matter if the + queue is full. */ + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + traceQUEUE_SEND( pxQueue ); + + /* VeriFast: we do not verify this configuration option */ + #if ( configUSE_QUEUE_SETS == 1 ) + { + const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; + + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) + { + /* Do not notify the queue set as an existing item + was overwritten in the queue so the number of items + in the queue has not changed. */ + mtCOVERAGE_TEST_MARKER(); + } + else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + to the queue set caused a higher priority task to + unblock. A context switch is required. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. Yes it is ok to + do this from within the critical section - the + kernel takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + executed if the task was holding multiple mutexes + and the mutexes were given back in an order that is + different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. Yes it is ok to do + this from within the critical section - the kernel + takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + executed if the task was holding multiple mutexes and + the mutexes were given back in an order that is + different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + + /*@ + if (xCopyPosition == queueSEND_TO_BACK) { + close queue(pxQueue, Storage, N, M, (W+1)%N, R, (K+1), is_locked, append(abs, singleton(x))); + } else if (xCopyPosition == queueSEND_TO_FRONT) { + close queue(pxQueue, Storage, N, M, W, (R == 0 ? (N-1) : (R-1)), (K+1), is_locked, cons(x, abs)); + } else if (xCopyPosition == queueOVERWRITE) { + close queue(pxQueue, Storage, N, M, W, R, 1, is_locked, singleton(x)); + } + @*/ + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + /* The queue was full and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + + /* Return to the original privilege level before exiting + the function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was full and a block time was specified so + configure the timeout structure. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + /*@close exists(pxQueue);@*/ + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + /*@open queue_locked_invariant(xQueue)();@*/ + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + + /* Unlocking the queue means queue events can effect the + event list. It is possible that interrupts occurring now + remove this task from the event list again - but as the + scheduler is suspended the task will go onto the pending + ready last instead of the actual ready list. */ + /*@close queue_locked_invariant(xQueue)();@*/ + prvUnlockQueue( pxQueue ); + + /* Resuming the scheduler will move tasks from the pending + ready list into the ready list - so it is feasible that this + task is already in a ready list before it yields - in which + case the yield will not cause a context switch unless there + is also a higher priority task in the pending ready list. */ + /*@close exists(pxQueue);@*/ + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); +#ifdef VERIFAST /*< void cast of unused return value */ + /*@close exists(pxQueue);@*/ + xTaskResumeAll(); +#else + ( void ) xTaskResumeAll(); +#endif + } + } + else + { + /* The timeout has expired. */ + prvUnlockQueue( pxQueue ); +#ifdef VERIFAST /*< void cast of unused return value */ + /*@close exists(pxQueue);@*/ + xTaskResumeAll(); +#else + ( void ) xTaskResumeAll(); +#endif + + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + } /*lint -restore */ +} diff --git a/FreeRTOS/Test/VeriFast/queue/xQueueGenericSendFromISR.c b/FreeRTOS/Test/VeriFast/queue/xQueueGenericSendFromISR.c new file mode 100644 index 0000000000..1c1d746a90 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/xQueueGenericSendFromISR.c @@ -0,0 +1,224 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" +#include "proof/queuecontracts.h" + +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) +/*@requires + [1/2]queuehandle(xQueue, ?N, ?M, ?is_isr) &*& is_isr == true &*& + chars(pvItemToQueue, M, ?x) &*& + integer(pxHigherPriorityTaskWoken, _) &*& + (xCopyPosition == queueSEND_TO_BACK || xCopyPosition == queueSEND_TO_FRONT || (xCopyPosition == queueOVERWRITE && N == 1));@*/ +/*@ensures + [1/2]queuehandle(xQueue, N, M, is_isr) &*& + chars(pvItemToQueue, M, x) &*& + integer(pxHigherPriorityTaskWoken, _);@*/ +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +#ifdef VERIFAST /*< const pointer declaration */ +Queue_t * pxQueue = xQueue; +#else +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); +#endif + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + /* Similar to xQueueGenericSend, except without blocking if there is no room + in the queue. Also don't directly wake a task that was blocked on a queue + read, instead return a flag to say whether a context switch is required or + not (i.e. has a task with a higher priority than us been woken by this + post). */ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + /*@assert queue(pxQueue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ + { + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + const int8_t cTxLock = pxQueue->cTxLock; + const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; + + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* Semaphores use xQueueGiveFromISR(), so pxQueue will not be a + semaphore or mutex. That means prvCopyDataToQueue() cannot result + in a task disinheriting a priority and prvCopyDataToQueue() can be + called here even though the disinherit function does not check if + the scheduler is suspended before accessing the ready lists. */ +#ifdef VERIFAST /*< void cast of unused return value */ + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); +#else + ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); +#endif + /*@open queue(pxQueue, _, N, M, _, _, _, _, _);@*/ + + /* The event list is not altered if the queue is locked. This will + be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + /* VeriFast: we do not verify this configuration option */ + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) + { + /* Do not notify the queue set as an existing item + was overwritten in the queue so the number of items + in the queue has not changed. */ + mtCOVERAGE_TEST_MARKER(); + } + else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + to the queue set caused a higher priority task to + unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Not used in this path. */ +#ifndef VERIFAST /*< void cast of unused var */ + ( void ) uxPreviousMessagesWaiting; +#endif + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was posted while it was locked. */ + configASSERT( cTxLock != queueINT8_MAX); + + pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + + xReturn = pdPASS; + /*@ + if (xCopyPosition == queueSEND_TO_BACK) { + close queue(pxQueue, Storage, N, M, (W+1)%N, R, (K+1), is_locked, append(abs, singleton(x))); + } else if (xCopyPosition == queueSEND_TO_FRONT) { + if (R == 0) { + close queue(pxQueue, Storage, N, M, W, (N-1), (K+1), is_locked, cons(x, abs)); + } else { + close queue(pxQueue, Storage, N, M, W, (R-1), (K+1), is_locked, cons(x, abs)); + } + } else if (xCopyPosition == queueOVERWRITE) { + close queue(pxQueue, Storage, N, M, W, R, 1, is_locked, singleton(x)); + } + @*/ + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} diff --git a/FreeRTOS/Test/VeriFast/queue/xQueueIsQueueEmptyFromISR.c b/FreeRTOS/Test/VeriFast/queue/xQueueIsQueueEmptyFromISR.c new file mode 100644 index 0000000000..e019332b9b --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/xQueueIsQueueEmptyFromISR.c @@ -0,0 +1,48 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" + +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) +/*@requires queue(xQueue, ?Storage, ?N, ?M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ +/*@ensures queue(xQueue, Storage, N, M, W, R, K, is_locked, abs) &*& + result == ((K == 0) ? pdTRUE : pdFALSE);@*/ +{ +BaseType_t xReturn; +#ifdef VERIFAST /*< const pointer declaration */ +Queue_t * pxQueue = xQueue; +#else +Queue_t * const pxQueue = xQueue; +#endif + + configASSERT( pxQueue ); + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ diff --git a/FreeRTOS/Test/VeriFast/queue/xQueueIsQueueFullFromISR.c b/FreeRTOS/Test/VeriFast/queue/xQueueIsQueueFullFromISR.c new file mode 100644 index 0000000000..f78b75b538 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/xQueueIsQueueFullFromISR.c @@ -0,0 +1,48 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" + +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) +/*@requires queue(xQueue, ?Storage, ?N, ?M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ +/*@ensures queue(xQueue, Storage, N, M, W, R, K, is_locked, abs) &*& + result == ((K == N) ? pdTRUE : pdFALSE);@*/ +{ +BaseType_t xReturn; +#ifdef VERIFAST /*< const pointer declaration */ +Queue_t * pxQueue = xQueue; +#else +Queue_t * const pxQueue = xQueue; +#endif + + configASSERT( pxQueue ); + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ diff --git a/FreeRTOS/Test/VeriFast/queue/xQueuePeek.c b/FreeRTOS/Test/VeriFast/queue/xQueuePeek.c new file mode 100644 index 0000000000..ddfda857ae --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/xQueuePeek.c @@ -0,0 +1,206 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" +#include "proof/queuecontracts.h" + +BaseType_t xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) +/*@requires [1/2]queuehandle(xQueue, ?N, ?M, ?is_isr) &*& is_isr == false &*& + [1/2]queuesuspend(xQueue) &*& + chars(pvBuffer, M, ?x);@*/ +/*@ensures [1/2]queuehandle(xQueue, N, M, is_isr) &*& + [1/2]queuesuspend(xQueue) &*& + (result == pdPASS ? chars(pvBuffer, M, _) : chars(pvBuffer, M, x));@*/ +{ +BaseType_t xEntryTimeSet = pdFALSE; +TimeOut_t xTimeOut; +int8_t *pcOriginalReadPosition; +#ifdef VERIFAST /*< const pointer declaration */ +Queue_t * pxQueue = xQueue; +#else +Queue_t * const pxQueue = xQueue; + + /* Check the pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* The buffer into which data is received can only be NULL if the data size + is zero (so no data is copied into the buffer. */ + configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + +#endif + + /*lint -save -e904 This function relaxes the coding standard somewhat to + allow return statements within the function itself. This is done in the + interest of execution time efficiency. */ + for( ;; ) + /*@invariant [1/2]queuehandle(xQueue, N, M, is_isr) &*& + [1/2]queuesuspend(xQueue) &*& + chars(pvBuffer, M, x) &*& + u_integer(&xTicksToWait, _) &*& + xTIME_OUT(&xTimeOut);@*/ + { + taskENTER_CRITICAL(); + /*@assert queue(pxQueue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Remember the read position so it can be reset after the data + is read from the queue as this function is only peeking the + data, not removing it. */ + pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; + + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + prvCopyDataFromQueue( pxQueue, pvBuffer ); + traceQUEUE_PEEK( pxQueue ); + + /* The data is not being removed, so reset the read pointer. */ + pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; + + /* The data is being left in the queue, so see if there are + any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was empty and no block time is specified (or + the block time has expired) so leave now. */ + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + taskEXIT_CRITICAL(); + traceQUEUE_PEEK_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + configure the timeout structure ready to enter the blocked + state. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + /*@close exists(pxQueue);@*/ + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* Timeout has not expired yet, check to see if there is data in the + queue now, and if not enter the Blocked state to wait for data. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_PEEK( pxQueue ); + /*@open queue_locked_invariant(xQueue)();@*/ + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + /*@close queue_locked_invariant(xQueue)();@*/ + prvUnlockQueue( pxQueue ); + /*@close exists(pxQueue);@*/ + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* There is data in the queue now, so don't enter the blocked + state, instead return to try and obtain the data. */ + prvUnlockQueue( pxQueue ); +#ifdef VERIFAST /*< void cast of unused return value */ + /*@close exists(pxQueue);@*/ + xTaskResumeAll(); +#else + ( void ) xTaskResumeAll(); +#endif + } + } + else + { + /* The timeout has expired. If there is still no data in the queue + exit, otherwise go back and try to read the data again. */ + prvUnlockQueue( pxQueue ); +#ifdef VERIFAST /*< void cast of unused return value */ + /*@close exists(pxQueue);@*/ + xTaskResumeAll(); +#else + ( void ) xTaskResumeAll(); +#endif + + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_PEEK_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ +} diff --git a/FreeRTOS/Test/VeriFast/queue/xQueuePeekFromISR.c b/FreeRTOS/Test/VeriFast/queue/xQueuePeekFromISR.c new file mode 100644 index 0000000000..2fd6972c84 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/xQueuePeekFromISR.c @@ -0,0 +1,89 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" +#include "proof/queuecontracts.h" + +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) +/*@requires [1/2]queuehandle(xQueue, ?N, ?M, ?is_isr) &*& is_isr == true &*& + chars(pvBuffer, M, ?x);@*/ +/*@ensures [1/2]queuehandle(xQueue, N, M, is_isr) &*& + (result == pdPASS ? chars(pvBuffer, M, _) : chars(pvBuffer, M, x));@*/ +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +int8_t *pcOriginalReadPosition; +#ifdef VERIFAST /*< const pointer declaration */ +Queue_t * pxQueue = xQueue; +#else +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */ +#endif + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + /*@assert queue(pxQueue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ + { + /* Cannot block in an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + traceQUEUE_PEEK_FROM_ISR( pxQueue ); + + /* Remember the read position so it can be reset as nothing is + actually being removed from the queue. */ + pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ); + } + } + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} diff --git a/FreeRTOS/Test/VeriFast/queue/xQueueReceive.c b/FreeRTOS/Test/VeriFast/queue/xQueueReceive.c new file mode 100644 index 0000000000..ee1dab4f8d --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/xQueueReceive.c @@ -0,0 +1,204 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" +#include "proof/queuecontracts.h" + +BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) +/*@requires [1/2]queuehandle(xQueue, ?N, ?M, ?is_isr) &*& is_isr == false &*& + [1/2]queuesuspend(xQueue) &*& + chars(pvBuffer, M, ?x);@*/ +/*@ensures [1/2]queuehandle(xQueue, N, M, is_isr) &*& + [1/2]queuesuspend(xQueue) &*& + (result == pdPASS ? chars(pvBuffer, M, _) : chars(pvBuffer, M, x));@*/ +{ +BaseType_t xEntryTimeSet = pdFALSE; +TimeOut_t xTimeOut; +#ifdef VERIFAST /*< const pointer declaration */ +Queue_t * pxQueue = xQueue; +#else +Queue_t * const pxQueue = xQueue; + + /* Check the pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* The buffer into which data is received can only be NULL if the data size + is zero (so no data is copied into the buffer). */ + configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + +#endif + + /*lint -save -e904 This function relaxes the coding standard somewhat to + allow return statements within the function itself. This is done in the + interest of execution time efficiency. */ + for( ;; ) + /*@invariant [1/2]queuehandle(xQueue, N, M, is_isr) &*& + [1/2]queuesuspend(xQueue) &*& + chars(pvBuffer, M, x) &*& + u_integer(&xTicksToWait, _) &*& + xTIME_OUT(&xTimeOut);@*/ + { + taskENTER_CRITICAL(); + /*@assert queue(pxQueue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + /* Data available, remove one item. */ + prvCopyDataFromQueue( pxQueue, pvBuffer ); + /*@open queue_after_prvCopyDataFromQueue(pxQueue, Storage, N, M, W, (R+1)%N, K, is_locked, abs);@*/ + traceQUEUE_RECEIVE( pxQueue ); + pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; + /*@assert + pxQueue->pcHead |-> ?buffer &*& + buffer(buffer, N, M, ?contents);@*/ + /*@deq_lemma(K, (R+1)%N, contents, abs, head(abs));@*/ + + /* There is now space in the queue, were any tasks waiting to + post to the queue? If so, unblock the highest priority waiting + task. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /*@close queue(pxQueue, Storage, N, M, W, (R+1)%N, K-1, is_locked, tail(abs));@*/ + /*@assert chars(pvBuffer, M, head(abs));@*/ + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + /* The queue was empty and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + configure the timeout structure. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + /*@close exists(pxQueue);@*/ + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* The timeout has not expired. If the queue is still empty place + the task on the list of tasks waiting to receive from the queue. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + /*@open queue_locked_invariant(xQueue)();@*/ + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + /*@close queue_locked_invariant(xQueue)();@*/ + prvUnlockQueue( pxQueue ); + /*@close exists(pxQueue);@*/ + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The queue contains data again. Loop back to try and read the + data. */ + prvUnlockQueue( pxQueue ); +#ifdef VERIFAST /*< void cast of unused return value */ + /*@close exists(pxQueue);@*/ + xTaskResumeAll(); +#else + ( void ) xTaskResumeAll(); +#endif + } + } + else + { + /* Timed out. If there is no data in the queue exit, otherwise loop + back and attempt to read the data. */ + prvUnlockQueue( pxQueue ); +#ifdef VERIFAST /*< void cast of unused return value */ + /*@close exists(pxQueue);@*/ + xTaskResumeAll(); +#else + ( void ) xTaskResumeAll(); +#endif + + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ +} diff --git a/FreeRTOS/Test/VeriFast/queue/xQueueReceiveFromISR.c b/FreeRTOS/Test/VeriFast/queue/xQueueReceiveFromISR.c new file mode 100644 index 0000000000..9401b394a9 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/queue/xQueueReceiveFromISR.c @@ -0,0 +1,134 @@ +/* + * FreeRTOS VeriFast Proofs + * Copyright (C) Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "proof/queue.h" +#include "proof/queuecontracts.h" + +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) +/*@requires [1/2]queuehandle(xQueue, ?N, ?M, ?is_isr) &*& is_isr == true &*& + chars(pvBuffer, M, ?x) &*& + pxHigherPriorityTaskWoken == NULL ? true : integer(pxHigherPriorityTaskWoken, _);@*/ +/*@ensures [1/2]queuehandle(xQueue, N, M, is_isr) &*& + (result == pdPASS ? chars(pvBuffer, M, _) : chars(pvBuffer, M, x)) &*& + (pxHigherPriorityTaskWoken == NULL ? true : integer(pxHigherPriorityTaskWoken, _));@*/ +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +#ifdef VERIFAST /*< const pointer declaration */ +Queue_t * pxQueue = xQueue; +#else +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); +#endif + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + /*@assert queue(pxQueue, ?Storage, N, M, ?W, ?R, ?K, ?is_locked, ?abs);@*/ + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Cannot block in an ISR, so check there is data available. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + const int8_t cRxLock = pxQueue->cRxLock; + + traceQUEUE_RECEIVE_FROM_ISR( pxQueue ); + + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + prvCopyDataFromQueue( pxQueue, pvBuffer ); + /*@open queue_after_prvCopyDataFromQueue(pxQueue, Storage, N, M, W, (R+1)%N, K, is_locked, abs);@*/ + pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; + /*@assert buffer(Storage, N, M, ?contents);@*/ + /*@deq_lemma(K, (R+1)%N, contents, abs, head(abs));@*/ + + /* If the queue is locked the event list will not be modified. + Instead update the lock count so the task that unlocks the queue + will know that an ISR has removed data while the queue was + locked. */ + if( cRxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than us so + force a context switch. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was removed while it was locked. */ + configASSERT( cRxLock != queueINT8_MAX); + + pxQueue->cRxLock = ( int8_t ) ( cRxLock + 1 ); + } + + /*@close queue(pxQueue, Storage, N, M, W, (R+1)%N, K-1, is_locked, tail(abs));@*/ + /*@assert chars(pvBuffer, M, head(abs));@*/ + xReturn = pdPASS; + } + else + { + /*@close queue(pxQueue, Storage, N, M, W, R, K, is_locked, abs);@*/ + xReturn = pdFAIL; + traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} diff --git a/FreeRTOS/Test/VeriFast/scripts/annotation_overhead.sh b/FreeRTOS/Test/VeriFast/scripts/annotation_overhead.sh new file mode 100755 index 0000000000..ec9a063e6b --- /dev/null +++ b/FreeRTOS/Test/VeriFast/scripts/annotation_overhead.sh @@ -0,0 +1,3 @@ +#!/bin/bash -eu + +NO_COVERAGE=1 EXTRA_VERIFAST_ARGS=-stats make list queue | grep overhead: | sort | uniq diff --git a/FreeRTOS/Test/VeriFast/scripts/callgraph.md b/FreeRTOS/Test/VeriFast/scripts/callgraph.md new file mode 100644 index 0000000000..5316a6121a --- /dev/null +++ b/FreeRTOS/Test/VeriFast/scripts/callgraph.md @@ -0,0 +1,20 @@ +# Generate callgraph + +## Requirements + + - python3 + - pycparser + - graphviz/dot + - [inconsolata](https://fonts.google.com/specimen/Inconsolata) + +## Instructions + +``` +cd scripts +git clone https://github.com/eliben/pycparser.git #< you need this for pycparser's libc headers even if pycparser is installed +mkdir fake_include +touch fake_include/threading.h +gcc -E -I pycparser/utils/fake_libc_include/ -I ../include/ -I fake_include/ ../queue/*.c > out.pp +./callgraph.py > out.dot +dot -Nfontname=inconsolata -Tpng -o callgraph.png out.dot +``` diff --git a/FreeRTOS/Test/VeriFast/scripts/callgraph.py b/FreeRTOS/Test/VeriFast/scripts/callgraph.py new file mode 100755 index 0000000000..ca6fa4ee8b --- /dev/null +++ b/FreeRTOS/Test/VeriFast/scripts/callgraph.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 + +from __future__ import print_function +from pycparser import c_parser, c_ast, parse_file +import sys + +ignore_callee = set(['mutex_acquire', 'mutex_release']) +ignore_caller = set(['caller_reinstates_queue_predicate']) +proven = [ + 'prvCopyDataFromQueue', + 'prvCopyDataToQueue', + 'prvInitialiseNewQueue', + 'prvIsQueueEmpty', + 'prvIsQueueFull', + 'prvLockQueue', + 'prvUnlockQueue', + 'uxQueueMessagesWaiting', + 'uxQueueSpacesAvailable', + 'vQueueDelete', + 'xQueueGenericCreate', + 'xQueueGenericReset', + 'xQueueGenericSend', + 'xQueueGenericSendFromISR', + 'xQueueIsQueueEmptyFromISR', + 'xQueueIsQueueFullFromISR', + 'xQueuePeek', + 'xQueuePeekFromISR', + 'xQueueReceive', + 'xQueueReceiveFromISR', +] + +modeled = [ + 'setInterruptMask', + 'clearInterruptMask', + 'setInterruptMaskFromISR', + 'clearInterruptMaskFromISR', + 'vTaskSuspendAll', + 'xTaskResumeAll', +] + +CALLMAP = set() + + +class FuncCallVisitor(c_ast.NodeVisitor): + def __init__(self, caller): + self.caller = caller + + def visit_FuncCall(self, node): + callee = node.name.name + if callee not in ignore_callee: + CALLMAP.add((node.name.name, self.caller)) + + +class FuncDefVisitor(c_ast.NodeVisitor): + def visit_FuncDef(self, node): + caller = node.decl.name + if caller in ignore_caller: + return + if caller.startswith('wrapper_'): + caller = caller[8:] + v = FuncCallVisitor(caller) + v.visit(node) + + +def show_func_calls(filename): + ast = parse_file(filename, use_cpp=False) + v = FuncDefVisitor() + v.visit(ast) + + +if __name__ == "__main__": + filename = 'out.pp' + show_func_calls(filename) + print('digraph G {') + print(' rankdir=LR;') + print(' node [style = filled, colorscheme = set13;];') + for f in proven: + print(' %s [fillcolor = 3];' % f) + for f in modeled: + print(' %s [fillcolor = 2];' % f) + for (callee, caller) in CALLMAP: + print(' %s -> %s;' % (callee, caller)) + print('}') diff --git a/FreeRTOS/Test/VeriFast/scripts/diff_files.md b/FreeRTOS/Test/VeriFast/scripts/diff_files.md new file mode 100644 index 0000000000..59f62d3640 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/scripts/diff_files.md @@ -0,0 +1,40 @@ +# Generate diffs between FreeRTOS source and proofs + +## Requirements + + - python3 + - ctags 5.8 + - diff 3.4+ + - [diff2html](https://diff2html.xyz/) + +## Instructions + +The following will extract per-function files from the original FreeRTOS source +implementation and the proof directory. + + +``` +cd scripts +./generate_diff_files.sh +# will extract to ./FreeRTOS-Kernel/generated and ./queue/generated +``` + +Then use `diff` for a side-by-side comparison. Note that the `--color=always` +flag needs v3.4+: + +``` +diff --color=always --width=$COLUMNS --suppress-common-lines --side-by-side FreeRTOS-Kernel/generated queue/generated | less -r +``` + +Or generate a html report using `diff2html`: + +``` +diff -u FreeRTOS-Kernel/generated queue/generated | diff2html -i stdin +``` + +The expectation is that the proofs make minimal changes to the original source +implementation in the form of: + + - VeriFast annotations `/*@...@*/` and `//*...` + - Additional comments explaining the proof `/*...*/` + - Flagged changes within `#if[n]def VERIFAST` diff --git a/FreeRTOS/Test/VeriFast/scripts/generate_diff_files.sh b/FreeRTOS/Test/VeriFast/scripts/generate_diff_files.sh new file mode 100755 index 0000000000..55f9cfbd24 --- /dev/null +++ b/FreeRTOS/Test/VeriFast/scripts/generate_diff_files.sh @@ -0,0 +1,47 @@ +#!/bin/bash -eu + +FUNCS=( + prvCopyDataFromQueue + prvCopyDataToQueue + prvInitialiseNewQueue + prvIsQueueEmpty + prvIsQueueFull + prvUnlockQueue + uxQueueMessagesWaiting + uxQueueSpacesAvailable + vQueueDelete + xQueueGenericCreate + xQueueGenericReset + xQueueGenericSend + xQueueGenericSendFromISR + xQueueIsQueueEmptyFromISR + xQueueIsQueueFullFromISR + xQueuePeek + xQueuePeekFromISR + xQueueReceive + xQueueReceiveFromISR +) + +if [ ! -d "FreeRTOS-Kernel" ]; then + git clone https://github.com/FreeRTOS/FreeRTOS-Kernel.git +fi +pushd FreeRTOS-Kernel > /dev/null +rm -rf tags generated +ctags --excmd=number queue.c +mkdir generated +for f in ${FUNCS[@]}; do + ../extract.py tags $f > generated/$f.c +done +popd > /dev/null +echo "created: FreeRTOS-Kernel/generated" + +ln -fs ../queue . +pushd queue > /dev/null +rm -rf tags generated +ctags --excmd=number *.c +mkdir generated +for f in ${FUNCS[@]}; do + ../scripts/extract.py tags $f > generated/$f.c +done +popd > /dev/null +echo "created: queue/generated"