flipper_application.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /**
  2. * @file flipper_application.h
  3. * Flipper application
  4. */
  5. #pragma once
  6. #include "application_manifest.h"
  7. #include "elf/elf_api_interface.h"
  8. #include <furi.h>
  9. #include <storage/storage.h>
  10. #include <stdbool.h>
  11. #ifdef __cplusplus
  12. extern "C" {
  13. #endif
  14. typedef enum {
  15. FlipperApplicationPreloadStatusSuccess = 0,
  16. FlipperApplicationPreloadStatusUnspecifiedError,
  17. FlipperApplicationPreloadStatusInvalidFile,
  18. FlipperApplicationPreloadStatusInvalidManifest,
  19. FlipperApplicationPreloadStatusApiMismatch,
  20. FlipperApplicationPreloadStatusTargetMismatch,
  21. } FlipperApplicationPreloadStatus;
  22. typedef enum {
  23. FlipperApplicationLoadStatusSuccess = 0,
  24. FlipperApplicationLoadStatusUnspecifiedError,
  25. FlipperApplicationLoadStatusNoFreeMemory,
  26. FlipperApplicationLoadStatusMissingImports,
  27. } FlipperApplicationLoadStatus;
  28. /**
  29. * @brief Get text description of preload status
  30. * @param status Status code
  31. * @return String pointer to description
  32. */
  33. const char* flipper_application_preload_status_to_string(FlipperApplicationPreloadStatus status);
  34. /**
  35. * @brief Get text description of load status
  36. * @param status Status code
  37. * @return String pointer to description
  38. */
  39. const char* flipper_application_load_status_to_string(FlipperApplicationLoadStatus status);
  40. typedef struct FlipperApplication FlipperApplication;
  41. typedef struct {
  42. const char* name;
  43. uint32_t address;
  44. } FlipperApplicationMemoryMapEntry;
  45. typedef struct {
  46. uint32_t mmap_entry_count;
  47. FlipperApplicationMemoryMapEntry* mmap_entries;
  48. uint32_t debug_link_size;
  49. uint8_t* debug_link;
  50. } FlipperApplicationState;
  51. /**
  52. * @brief Initialize FlipperApplication object
  53. * @param storage Storage instance
  54. * @param api_interface ELF API interface to use for pre-loading and symbol resolving
  55. * @return Application instance
  56. */
  57. FlipperApplication*
  58. flipper_application_alloc(Storage* storage, const ElfApiInterface* api_interface);
  59. /**
  60. * @brief Destroy FlipperApplication object
  61. * @param app Application pointer
  62. */
  63. void flipper_application_free(FlipperApplication* app);
  64. /**
  65. * @brief Validate elf file and load application metadata
  66. * @param app Application pointer
  67. * @return Preload result code
  68. */
  69. FlipperApplicationPreloadStatus
  70. flipper_application_preload(FlipperApplication* app, const char* path);
  71. /**
  72. * @brief Validate elf file and load application manifest
  73. * @param app Application pointer
  74. * @return Preload result code
  75. */
  76. FlipperApplicationPreloadStatus
  77. flipper_application_preload_manifest(FlipperApplication* app, const char* path);
  78. /**
  79. * @brief Get pointer to application manifest for preloaded application
  80. * @param app Application pointer
  81. * @return Pointer to application manifest
  82. */
  83. const FlipperApplicationManifest* flipper_application_get_manifest(FlipperApplication* app);
  84. /**
  85. * @brief Load sections and process relocations for already pre-loaded application
  86. * @param app Application pointer
  87. * @return Load result code
  88. */
  89. FlipperApplicationLoadStatus flipper_application_map_to_memory(FlipperApplication* app);
  90. /**
  91. * @brief Create application thread at entry point address, using app name and
  92. * stack size from metadata. Returned thread isn't started yet.
  93. * Can be only called once for application instance.
  94. * @param app Applicaiton pointer
  95. * @param args Object to pass to app's entry point
  96. * @return Created thread
  97. */
  98. FuriThread* flipper_application_spawn(FlipperApplication* app, void* args);
  99. #ifdef __cplusplus
  100. }
  101. #endif