1 // Copyright 2017 The Fuchsia Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #pragma once 6 7 #include "generator.h" 8 9 // Generates wrappers in the vDSO that add behavior defined by the given 10 // CallWrapper list. 11 class VdsoWrapperGenerator : public Generator { 12 public: VdsoWrapperGenerator(std::string wrapper_prefix,std::string call_prefix,std::vector<CallWrapper * > call_wrappers)13 VdsoWrapperGenerator(std::string wrapper_prefix, 14 std::string call_prefix, 15 std::vector<CallWrapper*> call_wrappers) 16 : wrapper_prefix_(wrapper_prefix), 17 call_prefix_(call_prefix), wrappers_(call_wrappers) {} 18 19 bool syscall(std::ofstream& os, const Syscall& sc) override; 20 21 private: 22 void pre_call(std::ofstream& os, const Syscall& sc) const; 23 void post_call(std::ofstream& os, const Syscall& sc, std::string return_var) const; 24 25 std::string wrapper_prefix_; 26 std::string call_prefix_; 27 std::vector<CallWrapper*> wrappers_; 28 }; 29 30 // Wrapper for testing that wrappers work correctly. Applied only to syscall_test_wrapper. 31 class TestWrapper : public CallWrapper { 32 public: 33 bool applies(const Syscall& sc) const override; 34 // Adds a precondition that all args are > 0; 35 void preCall(std::ofstream& os, const Syscall& sc) const override; 36 // Adds a postcondition that the result is < 50; 37 void postCall(std::ofstream& os, const Syscall& sc, std::string return_var) const override; 38 }; 39 40 // Wraps a syscall with the "blocking" attribute with code that will 41 // automatically retry if interrupted. 42 class BlockingRetryWrapper : public CallWrapper { 43 public: 44 bool applies(const Syscall& sc) const override; 45 void preCall(std::ofstream& os, const Syscall& sc) const override; 46 void postCall(std::ofstream& os, const Syscall& sc, std::string return_var) const override; 47 }; 48