245 std::string shared_mem_name_str =
"/shared_gem5_signal_mem_" +
246 std::to_string(getpid());
247 const char* shared_mem_name = shared_mem_name_str.c_str();
248 const std::size_t shared_mem_size = 4096;
250 int shm_fd = shm_open(shared_mem_name, O_RDWR, 0666);
252 DPRINTF(ExternalSignal,
"Error: Unable to open shared memory: %s\n",
253 std::strerror(errno));
257 void* shm_ptr = mmap(0, shared_mem_size, PROT_READ | PROT_WRITE,
258 MAP_SHARED, shm_fd, 0);
259 if (shm_ptr == MAP_FAILED) {
260 DPRINTF(ExternalSignal,
"Error: Unable to map shared memory: %s\n",
261 std::strerror(errno));
266 char full_payload[shared_mem_size];
267 std::memcpy(full_payload, shm_ptr, shared_mem_size);
268 full_payload[shared_mem_size - 1] =
'\0';
270 DPRINTF(ExternalSignal,
"Received signal from external "
271 "process with payload: '%s'\n", full_payload);
274 std::string full_payload_str = full_payload;
275 std::map<std::string, std::string> payload_map;
278 std::string id_field(
"\"id\":");
279 std::size_t id_pos = full_payload_str.find(id_field);
280 if (id_pos == std::string::npos) {
281 munmap(shm_ptr, shared_mem_size);
283 warn(
"Error: No message ID found in external processes payload\n");
288 id_pos += id_field.length();
291 while (id_pos < full_payload_str.length() && isspace(id_pos)) {
296 std::size_t id_end = full_payload_str.find_first_of(
",}", id_pos);
297 if (id_end == std::string::npos) {
298 munmap(shm_ptr, shared_mem_size);
300 warn(
"Error: Invalid ID format in external processes payload\n");
304 std::string message_id_str = full_payload_str.substr(id_pos,
307 while (!message_id_str.empty() && isspace(message_id_str.back())) {
308 message_id_str.pop_back();
311 long long id_value = std::stoll(message_id_str);
313 munmap(shm_ptr, shared_mem_size);
315 warn(
"External Process Handler Error: Invalid ID format "
316 "- must be a valid non-negative 64-bit integer\n");
319 uint64_t hypercall_id =
static_cast<uint64_t
>(id_value);
322 std::string payload_key =
"\"payload\":";
323 std::size_t payload_pos = full_payload_str.find(payload_key) +
324 payload_key.length();
327 payload_pos = full_payload_str.find(
'{', payload_pos) + 1;
329 while (payload_pos < full_payload_str.length() &&
330 full_payload_str[payload_pos] !=
'}') {
332 payload_pos = full_payload_str.find_first_not_of(
", \n\r\t",
334 if (payload_pos == std::string::npos ||
335 full_payload_str[payload_pos] ==
'}') {
344 payload_pos = full_payload_str.find(
":", payload_pos);
345 if (payload_pos == std::string::npos) {
351 payload_pos = full_payload_str.find_first_not_of(
" \n\r\t",
353 if (payload_pos == std::string::npos) {
359 if (full_payload_str[payload_pos] ==
'"') {
364 std::size_t value_end = full_payload_str.find_first_of(
",}",
366 if (value_end == std::string::npos) {
369 value = full_payload_str.substr(payload_pos,
370 value_end - payload_pos);
372 while (!value.empty() && isspace(value.back())) {
375 payload_pos = value_end;
378 if (!key.empty() && !value.empty()) {
379 payload_map[key] = value;
380 DPRINTF(ExternalSignal,
"Parsed key-value pair: %s: %s\n",
387 char done_msg[shared_mem_size] =
"done";
388 done_msg[shared_mem_size - 1] =
'\0';
389 std::memcpy(shm_ptr, done_msg,
sizeof(done_msg));
391 munmap(shm_ptr, shared_mem_size);
395 payload_map, hypercall_id,
false);
400 std::string end_str, std::size_t& search_start)
403 std::size_t start = full_str.find(start_str, search_start);
404 if (start == std::string::npos) {
407 start += start_str.size();
410 while (start < full_str.length() && isspace(full_str[start])) {
415 std::size_t end = full_str.find(end_str, start);
416 if (end == std::string::npos) {
421 while (end > start && isspace(full_str[end - 1])) {
426 search_start = end + end_str.size();
428 return full_str.substr(start, end - start);