51 lines
1.8 KiB
Markdown
51 lines
1.8 KiB
Markdown
● Widzę że log_manager jest używany, sprawdzę w misc.h:
|
|
|
|
● Searched for 5 patterns (ctrl+o to expand)
|
|
|
|
● Teraz mam pełny obraz. Oto analiza funkcji set_pointer_in_ptr:
|
|
|
|
Analiza funkcji set_pointer_in_ptr
|
|
|
|
Lokalizacja: helper_impl.c:58-75
|
|
|
|
Sygnatura
|
|
|
|
int set_pointer_in_ptr(u32 io, u32 *pointer_ptr)
|
|
|
|
Parametry
|
|
|
|
- io - adres w pamięci nets_data (przesunięcie w bitach)
|
|
- pointer_ptr - wskaźnik do zmiennej, która otrzyma wartość wskaźnika
|
|
|
|
Działanie
|
|
|
|
1. Obliczenie adresu:
|
|
f_ptr = (u32 *)(log_manager.nets_data + (io >> 3));
|
|
- io >> 3 konwertuje adres z bitów na bajty
|
|
- f_ptr wskazuje na miejsce w tablicy nets_data (u8 nets_data[LOGMAN_NETSDATA_SIZE])
|
|
2. Walidacja zakresu:
|
|
if((u8 *)f_ptr > (log_manager.nets_data + sizeof(log_manager.nets_data) - sizeof(void *)))
|
|
return -1;
|
|
- Sprawdza czy nie wychodzi poza granicę tablicy
|
|
3. Ustawienie wskaźnika - przypadek specjalny dla "net 0":
|
|
if((u32)f_ptr == (u32)&log_manager.nets_data[0])
|
|
*(u32 *)pointer_ptr = (u32)f_ptr; // bezpośredni adres
|
|
else
|
|
*(u32 *)pointer_ptr = (u32)*f_ptr; // wartość spod adresu
|
|
- Jeśli adres to początek tablicy (nets_data[0]) → używa bezpośredniego adresu
|
|
- W przeciwnym razie odczytuje wartość 32-bitową spod tego adresu i traktuje ją jako wskaźnik
|
|
4. Walidacja czy wskaźnik nie jest zerowy:
|
|
if(!*f_ptr)
|
|
return -1;
|
|
|
|
Cel funkcji
|
|
|
|
Funkcja służy do rozwiązywania pośrednich wskaźników w systemie dystrybucji sygnałów. System używa tablicy nets_data do przechowywania:
|
|
- Bezpośrednich danych (dla "net 0")
|
|
- Pośrednich referencji do innych lokacji w pamięci (wskaźników)
|
|
|
|
Gdy element logiki wymaga dostępu do sygnału z innego elementu, ta funkcja pobiera rzeczywisty adres danych poprzez jedną warstwę pośrednictwa ("pointer
|
|
indirection").
|
|
|
|
✻ Sautéed for 2m 43s
|