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 std::cerr <<
"Error: Unable to open shared memory" << std::endl;
256 void* shm_ptr = mmap(0, shared_mem_size, PROT_READ | PROT_WRITE,
257 MAP_SHARED, shm_fd, 0);
258 if (shm_ptr == MAP_FAILED) {
259 std::cerr <<
"Error: Unable to map shared memory" << std::endl;
264 char full_payload[shared_mem_size];
265 std::memcpy(full_payload, shm_ptr, shared_mem_size);
266 full_payload[shared_mem_size - 1] =
'\0';
268 DPRINTF(ExternalSignal,
"Received signal from external "
269 "process with payload: '%s'\n", full_payload);
272 std::string full_payload_str = full_payload;
273 std::map<std::string, std::string> payload_map;
276 std::string id_field(
"\"id\":");
277 std::size_t id_pos = full_payload_str.find(id_field);
278 if (id_pos == std::string::npos) {
279 munmap(shm_ptr, shared_mem_size);
281 warn(
"Error: No message ID found in external processes payload\n");
286 id_pos += id_field.length();
289 while (id_pos < full_payload_str.length() && isspace(id_pos)) {
294 std::size_t id_end = full_payload_str.find_first_of(
",}", id_pos);
295 if (id_end == std::string::npos) {
296 munmap(shm_ptr, shared_mem_size);
298 warn(
"Error: Invalid ID format in external processes payload\n");
302 std::string message_id_str = full_payload_str.substr(id_pos,
305 while (!message_id_str.empty() && isspace(message_id_str.back())) {
306 message_id_str.pop_back();
309 long long id_value = std::stoll(message_id_str);
311 munmap(shm_ptr, shared_mem_size);
313 warn(
"External Process Handler Error: Invalid ID format "
314 "- must be a valid non-negative 64-bit integer\n");
317 uint64_t hypercall_id =
static_cast<uint64_t
>(id_value);
320 std::string payload_key =
"\"payload\":";
321 std::size_t payload_pos = full_payload_str.find(payload_key) +
322 payload_key.length();
325 payload_pos = full_payload_str.find(
'{', payload_pos) + 1;
327 while (payload_pos < full_payload_str.length() &&
328 full_payload_str[payload_pos] !=
'}') {
330 payload_pos = full_payload_str.find_first_not_of(
", \n\r\t",
332 if (payload_pos == std::string::npos ||
333 full_payload_str[payload_pos] ==
'}') {
342 payload_pos = full_payload_str.find(
":", payload_pos);
343 if (payload_pos == std::string::npos) {
349 payload_pos = full_payload_str.find_first_not_of(
" \n\r\t",
351 if (payload_pos == std::string::npos) {
357 if (full_payload_str[payload_pos] ==
'"') {
362 std::size_t value_end = full_payload_str.find_first_of(
",}",
364 if (value_end == std::string::npos) {
367 value = full_payload_str.substr(payload_pos,
368 value_end - payload_pos);
370 while (!value.empty() && isspace(value.back())) {
373 payload_pos = value_end;
376 if (!key.empty() && !value.empty()) {
377 payload_map[key] = value;
378 DPRINTF(ExternalSignal,
"Parsed key-value pair: %s: %s\n",
385 char done_msg[shared_mem_size] =
"done";
386 done_msg[shared_mem_size - 1] =
'\0';
387 std::memcpy(shm_ptr, done_msg,
sizeof(done_msg));
389 munmap(shm_ptr, shared_mem_size);
393 payload_map, hypercall_id,
false);
398 std::string end_str, std::size_t& search_start)
401 std::size_t start = full_str.find(start_str, search_start);
402 if (start == std::string::npos) {
405 start += start_str.size();
408 while (start < full_str.length() && isspace(full_str[start])) {
413 std::size_t end = full_str.find(end_str, start);
414 if (end == std::string::npos) {
419 while (end > start && isspace(full_str[end - 1])) {
424 search_start = end + end_str.size();
426 return full_str.substr(start, end - start);