Home | History | Annotate | Download | only in lib
      1 #pragma once
      2 /*
      3  * Copyright (C) 2016 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 #include <memory>
     19 #include <functional>
     20 
     21 #include "common/vsoc/lib/typed_region_view.h"
     22 #include "common/vsoc/shm/e2e_test_region_layout.h"
     23 
     24 namespace vsoc {
     25 template <typename Layout>
     26 class E2ERegionView : public vsoc::TypedRegionView<
     27                       E2ERegionView<Layout>,
     28                       Layout> {
     29  public:
     30 
     31   uint32_t read_guest_self_register() const {
     32     return this->data().guest_self_register;
     33   }
     34 
     35   void write_guest_self_register(uint32_t val) {
     36     this->data()->guest_self_register = val;
     37   }
     38 
     39   void signal_guest_self_register() {
     40     this->SendSignal(layout::Sides::OurSide,
     41                      &this->data()->guest_self_register);
     42   }
     43 
     44   int wait_guest_self_register(uint32_t expected_value) {
     45     return this->WaitForSignal(
     46         &this->data()->guest_self_register, expected_value);
     47   }
     48 
     49   void signal_guest_to_host_register() {
     50     this->SendSignal(layout::Sides::OurSide,
     51                      &this->data()->guest_to_host_signal);
     52   }
     53 
     54   uint32_t guest_to_host_signal_offset() const {
     55     return this->pointer_to_region_offset(&this->data().guest_to_host_signal);
     56   }
     57 
     58   uint32_t host_to_guest_signal_offset() const {
     59     return this->pointer_to_region_offset(&this->data().host_to_guest_signal);
     60   }
     61 
     62   const char* guest_string(size_t index) const {
     63     return const_cast<const char*>(this->data().data[index].guest_writable);
     64   }
     65 
     66   const char* host_string(size_t index) const {
     67     return const_cast<const char*>(this->data().data[index].host_writable);
     68   }
     69 
     70   bool set_guest_string(size_t index, const char* value) {
     71     strcpy(const_cast<char*>(this->data()->data[index].guest_writable),
     72            value);
     73     return true;
     74   }
     75 
     76   bool set_host_string(size_t index, const char* value) {
     77     strcpy(const_cast<char*>(this->data()->data[index].host_writable),
     78            value);
     79     return true;
     80   }
     81 
     82   size_t string_size() const {
     83     return Layout::NumFillRecords(this->control_->region_data_size());
     84   }
     85 
     86   void guest_status(vsoc::layout::e2e_test::E2ETestStage stage) {
     87     this->data()->guest_status.set_value(stage);
     88   }
     89 
     90   void host_status(vsoc::layout::e2e_test::E2ETestStage stage) {
     91     this->data()->host_status.set_value(stage);
     92   }
     93 };
     94 
     95 using E2EPrimaryRegionView =
     96   vsoc::E2ERegionView<layout::e2e_test::E2EPrimaryTestRegionLayout>;
     97 
     98 using E2ESecondaryRegionView =
     99   vsoc::E2ERegionView<layout::e2e_test::E2ESecondaryTestRegionLayout>;
    100 
    101 using E2EUnfindableRegionView =
    102   vsoc::E2ERegionView<layout::e2e_test::E2EUnfindableRegionLayout>;
    103 
    104 }  // namespace vsoc
    105