• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "aot_compiler_interface_stub.h"
17 #include "ecmascript/log_wrapper.h"
18 #include "hitrace_meter.h"
19 
20 namespace OHOS::ArkCompiler {
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)21 int32_t AotCompilerInterfaceStub::OnRemoteRequest(
22     uint32_t code,
23     MessageParcel& data,
24     MessageParcel& reply,
25     MessageOption& option)
26 {
27     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
28     std::u16string localDescriptor = GetDescriptor();
29     std::u16string remoteDescriptor = data.ReadInterfaceToken();
30     if (localDescriptor != remoteDescriptor) {
31         return ERR_TRANSACTION_FAILED;
32     }
33     switch (code) {
34         case COMMAND_AOT_COMPILER: {
35             return CommandAOTCompiler(data, reply);
36         }
37         case COMMAND_STOP_AOT_COMPILER: {
38             return CommandStopAOTCompiler(reply);
39         }
40         case COMMAND_GET_AOT_VERSION: {
41             return CommandGetAOTVersion(reply);
42         }
43         case COMMAND_NEED_RE_COMPILE: {
44             return CommandNeedReCompile(data, reply);
45         }
46         default:
47             return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
48     }
49     return ERR_TRANSACTION_FAILED;
50 }
51 
CommandAOTCompiler(MessageParcel & data,MessageParcel & reply)52 int32_t AotCompilerInterfaceStub::CommandAOTCompiler(MessageParcel &data,
53                                                      MessageParcel &reply)
54 {
55     std::unordered_map<std::string, std::string> argsMap;
56     int32_t argsMapSize = data.ReadInt32();
57     if (static_cast<unsigned long>(argsMapSize) > mapMaxSize) {
58         LOG_SA(ERROR) << "The map size exceeds ths security limit!";
59         return ERR_INVALID_DATA;
60     }
61     for (int32_t i = 0; i < argsMapSize; ++i) {
62         std::string key = Str16ToStr8(data.ReadString16());
63         std::string value = Str16ToStr8(data.ReadString16());
64         argsMap[key] = value;
65     }
66     std::vector<int16_t> sigData;
67     ErrCode errCode = AotCompiler(argsMap, sigData);
68     if (!reply.WriteInt32(errCode)) {
69         LOG_SA(ERROR) << "Write Int32 failed!";
70         return ERR_INVALID_VALUE;
71     }
72     if (SUCCEEDED(errCode)) {
73         if (sigData.size() > vectorMaxSize) {
74             LOG_SA(ERROR) << "The vector size exceeds the security limit!";
75             return ERR_INVALID_DATA;
76         }
77         reply.WriteInt32(sigData.size());
78         for (auto it = sigData.begin(); it != sigData.end(); ++it) {
79             if (!reply.WriteInt32(*it)) {
80                 LOG_SA(ERROR) << "Write sigData array failed!";
81                 return ERR_INVALID_DATA;
82             }
83         }
84     }
85     return ERR_NONE;
86 }
87 
CommandStopAOTCompiler(MessageParcel & reply)88 int32_t AotCompilerInterfaceStub::CommandStopAOTCompiler(MessageParcel& reply)
89 {
90     ErrCode errCode = StopAotCompiler();
91     if (!reply.WriteInt32(errCode)) {
92         LOG_SA(ERROR) << "Write Int32 failed!";
93         return ERR_INVALID_VALUE;
94     }
95     return ERR_NONE;
96 }
97 
CommandGetAOTVersion(MessageParcel & reply)98 int32_t AotCompilerInterfaceStub::CommandGetAOTVersion(MessageParcel& reply)
99 {
100     std::string sigData;
101     ErrCode errCode = GetAOTVersion(sigData);
102     if (!reply.WriteInt32(errCode)) {
103         LOG_SA(ERROR) << "Write Int32 failed!";
104         return ERR_INVALID_VALUE;
105     }
106     if (SUCCEEDED(errCode)) {
107         reply.WriteString16(Str8ToStr16(sigData));
108     }
109 
110     return ERR_NONE;
111 }
112 
CommandNeedReCompile(MessageParcel & data,MessageParcel & reply)113 int32_t AotCompilerInterfaceStub::CommandNeedReCompile(MessageParcel& data,
114                                                        MessageParcel& reply)
115 {
116     std::string regs = Str16ToStr8(data.ReadString16());
117     bool sigData;
118     ErrCode errCode = NeedReCompile(regs, sigData);
119     if (!reply.WriteInt32(errCode)) {
120         LOG_SA(ERROR) << "Write Int32 failed!";
121         return ERR_INVALID_VALUE;
122     }
123     if (SUCCEEDED(errCode)) {
124         reply.WriteBool(sigData);
125     }
126     return ERR_NONE;
127 }
128 
129 } // namespace OHOS::ArkCompiler
130