
This change lays the foundation for making the require_promise return an error hand handling the process abort outside of the syscall implementations, to avoid cases where we would leak resources. It also has the advantage that it makes removes a gs pointer read to look up the current thread, then process for every syscall. We can instead go through the Process this pointer in most cases.
81 lines
2 KiB
C++
81 lines
2 KiB
C++
/*
|
|
* Copyright (c) 2020, the SerenityOS developers.
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/String.h>
|
|
#include <AK/Types.h>
|
|
#include <LibC/sys/arch/i386/regs.h>
|
|
|
|
namespace ELF::Core {
|
|
|
|
struct [[gnu::packed]] NotesEntryHeader {
|
|
enum Type : u8 {
|
|
Null = 0, // Terminates segment
|
|
ProcessInfo,
|
|
ThreadInfo,
|
|
MemoryRegionInfo,
|
|
Metadata,
|
|
};
|
|
Type type;
|
|
};
|
|
|
|
struct [[gnu::packed]] NotesEntry {
|
|
NotesEntryHeader header;
|
|
char data[];
|
|
};
|
|
|
|
struct [[gnu::packed]] ProcessInfo {
|
|
NotesEntryHeader header;
|
|
// Information is stored as JSON blob to allow arbitrary
|
|
// number and length of strings/objects/arrays.
|
|
//
|
|
// Keys:
|
|
// - "pid" (int)
|
|
// - "termination_signal" (u8)
|
|
// - "executable_path" (String)
|
|
// - "arguments" (Vector<String>)
|
|
// - "environment" (Vector<String>)
|
|
char json_data[]; // Null terminated
|
|
};
|
|
|
|
struct [[gnu::packed]] ThreadInfo {
|
|
NotesEntryHeader header;
|
|
int tid;
|
|
PtraceRegisters regs;
|
|
};
|
|
|
|
struct [[gnu::packed]] MemoryRegionInfo {
|
|
NotesEntryHeader header;
|
|
uint64_t region_start;
|
|
uint64_t region_end;
|
|
uint16_t program_header_index;
|
|
char region_name[]; // Null terminated
|
|
|
|
String object_name() const
|
|
{
|
|
StringView memory_region_name { region_name };
|
|
if (memory_region_name.contains("Loader.so"))
|
|
return "Loader.so";
|
|
auto maybe_colon_index = memory_region_name.find(':');
|
|
if (!maybe_colon_index.has_value())
|
|
return {};
|
|
return memory_region_name.substring_view(0, *maybe_colon_index).to_string();
|
|
}
|
|
};
|
|
|
|
struct [[gnu::packed]] Metadata {
|
|
NotesEntryHeader header;
|
|
// Arbitrary metadata, set via SC_set_coredump_metadata.
|
|
// Limited to 16 entries and 16 KiB keys/values by the kernel.
|
|
//
|
|
// Well-known keys:
|
|
// - "assertion": Used by LibC's __assertion_failed() to store assertion info
|
|
// - "pledge_violation": Used by the Kernel's require_promise() to store pledge violation info
|
|
char json_data[]; // Null terminated
|
|
};
|
|
|
|
}
|