Init basesystem source codes.
[staging/basesystem.git] / systemservice / rom_access_library / library / rom / src / ss_sm_boot_access.cpp
1 /*
2  * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "system_service/ss_sm_boot_access.h"
18 #include <stdio.h>
19 #include <native_service/cl_lock.h>
20 #include <native_service/cl_lockid.h>
21 #include "system_service/nor_backup.h"
22 #include "ss_rom_access_if_romaccesslibrarylog.h"
23 #include "ss_rom_access_define.h"
24
25 #define BAI_MTD_DEV_RO "/dev/mtd1ro"  // NOR device for RO
26 #define BAI_MTD_DEV_RW "/dev/mtd1"    // NOR device for RW
27
28 #define BAI_SERCTOR_OFFSET  0
29 #define BAI_DATA_OFFSET     0
30
31 void* BOOT_AccessIf::g_m_plock = NULL;
32
33 BOOT_AccessIf::BOOT_AccessIf(BAI_OPEN_t type)
34     : m_type(type) {
35   FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
36
37   if (!(m_type == BAI_OPEN_RO  // LCOV_EXCL_BR_LINE 6: double check
38       || m_type == BAI_OPEN_RW)) {  // LCOV_EXCL_BR_LINE 6: double check
39     AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
40     throw __LINE__;  // LCOV_EXCL_LINE 6: double check
41   }
42
43   if (g_m_plock == NULL) {
44     g_m_plock = CL_LockMap(LOCK_BOOT_ACCESS_IF);
45
46     if (g_m_plock == MAP_FAILED) {  // LCOV_EXCL_BR_LINE 6:impossible to confirm because g_m_plock can not be changed
47       ROM_ACCESS_ASERT(0);  // LCOV_EXCL_BR_LINE 6:impossible to confirm because g_m_plock can not be changed
48       // LCOV_EXCL_BR_START 6:impossible to confirm because g_m_plock can not be changed
49       FRAMEWORKUNIFIEDLOG(
50           ZONE_ERR, __FUNCTION__,
51           "CL_LockMap Error, please check whether you call CL_LockProcessInit");
52       // LCOV_EXCL_BR_STOP
53     }
54   }
55
56   if (g_m_plock) {  // LCOV_EXCL_BR_LINE 6:impossible to confirm because g_m_plock can not be changed
57     ROM_ACCESS_ASERT(0 == CL_LockGet(g_m_plock));  // LCOV_EXCL_BR_LINE 11:unexpected branch
58   }
59
60   FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
61 }
62
63 BOOT_AccessIf::~BOOT_AccessIf() {
64   FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
65
66   if (g_m_plock) {  // LCOV_EXCL_BR_LINE 6:impossible to confirm because g_m_plock can not be changed
67     ROM_ACCESS_ASERT(0 == CL_LockRelease(g_m_plock));  // LCOV_EXCL_BR_LINE 11:unexpected branch
68   }
69
70   FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
71 }
72
73 EFrameworkunifiedStatus BOOT_AccessIf::getBootInfo(LBM_NOR_t* p_bootInfo) {
74   FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
75   EFrameworkunifiedStatus eRet = eFrameworkunifiedStatusOK;
76   try {
77     int ret;
78     if (p_bootInfo == NULL) {
79       ROM_ACCESS_ASERT(0);  // LCOV_EXCL_BR_LINE 11:unexpected branch
80       throw __LINE__;
81     }
82     ret = mtdn_backup_Read((const char *) BAI_MTD_DEV_RO, BAI_SERCTOR_OFFSET,
83                            BAI_DATA_OFFSET, sizeof(LBM_NOR_t), p_bootInfo);  // LCOV_EXCL_BR_LINE 11:unexpected branch
84
85     if (ret != 0) {
86       ROM_ACCESS_ASERT(0);  // LCOV_EXCL_BR_LINE 11:unexpected branch
87       throw __LINE__;
88     }
89   } catch (...) {
90     eRet = eFrameworkunifiedStatusFail;
91   }
92   FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
93   return eRet;
94 }
95
96 EFrameworkunifiedStatus BOOT_AccessIf::setBootInfo(LBM_NOR_t* p_bootInfo) {
97   FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
98   EFrameworkunifiedStatus eRet = eFrameworkunifiedStatusOK;
99   try {
100     int ret;
101     if (p_bootInfo == NULL) {
102       ROM_ACCESS_ASERT(0);  // LCOV_EXCL_BR_LINE 11:unexpected branch
103       throw __LINE__;
104     }
105     if (m_type != BAI_OPEN_RW) {
106       ROM_ACCESS_ASERT(0);  // LCOV_EXCL_BR_LINE 11:unexpected branch
107       throw __LINE__;
108     }
109     ret = mtdn_backup_Write((const char *) BAI_MTD_DEV_RW, BAI_SERCTOR_OFFSET,
110                             BAI_DATA_OFFSET, sizeof(LBM_NOR_t), p_bootInfo);  // LCOV_EXCL_BR_LINE 11:unexpected branch
111     if (ret != 0) {  // LCOV_EXCL_BR_LINE 5:c API error case
112       AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
113       ROM_ACCESS_ASERT(0);  // LCOV_EXCL_LINE 5:c API error case
114       throw __LINE__;  // LCOV_EXCL_LINE 5:c API error case
115     }
116   } catch (...) {
117     eRet = eFrameworkunifiedStatusFail;
118   }
119   FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
120   return eRet;
121 }
122