vova7890
-
Постов
42 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные vova7890
-
-
Всем привет. В общем, озадачился я реализацией сией фукнции на ARMv5. Функция, помимо зеркалирования памяти(ну тут понятно, можно через mmu), должна уметь зеракалировать файлы. Идея в реализации одна - обрабатывать датааборты на чтение виртуально "не существующей" памяти и там уже читать файл, предварительно вернувшись в usr режим и продолжая выполнять чтение уже в контексте программы. Но, чтобы определить, что, как, куда и откуда читает, нужно узнать тип инструкции и адрес чтения/ записи. Вот этот момент меня и интересует. Получается, нужно какбы "эмулировать" инструкцию, тоесть узнать какой тип данных она пишет/читает(byte, hword, word) и номера регистров с которых читают и куда пишут. Я правильно понимаю логику, или есть более простые пути нежели емулировать инструкции? Пытался найти ответ в исходниках линукса, ничего интересного так и не нашёл. Если тут и вправду нужна эмуляция, подскажите где можно посмотреть реализцию. А то в этих опкодах чёрт ногу сломит...
-
Ни та, ни другая инструкция не позволяет обратиться к произвольному адресу. Обе упомянутые Вами инструкции используют относительную адресацию. Команда ldr использует 12-битное смещение относительно содержимого базового регистра. Команда b использует 24-битное смещение относительно содержимого регистра pc.
ну правильно, а шоб оно создало верный относительный адрес нужна статическая релокация, которую gas не указывает, а матерится.
-
Кароче это баг gas`а, я нашёл то место где gas должен такому случаю присвоить релок BFD_RELOC_ARM_LDR_PC_G0, а не генерить ошибку, напишу разрабам...
-
Опубликовано · Изменено пользователем vova7890 · Пожаловаться
...Прикол в том что я не могу в секции где ldr pc ещё что нибудь обьявить, места нету.
Иар сгенерил такой вот опкод F4F01FE5
FSWI_PATCH2:A13A5328; =========================================================================== FSWI_PATCH2:A13A5328 FSWI_PATCH2:A13A5328; Segment type: Pure code FSWI_PATCH2:A13A5328 AREA FSWI_PATCH2, CODE, READWRITE, ALIGN=0 FSWI_PATCH2:A13A5328 ; ORG 0xA13A5328 FSWI_PATCH2:A13A5328 CODE32 FSWI_PATCH2:A13A5328 main_jumper DCD swi_handler ; DATA XREF: FSWI_PATCH1:A13A5414r FSWI_PATCH2:A13A5328; FSWI_PATCH2 ends FSWI_PATCH2:A13A5328 FSWI_PATCH1:A13A5414; --------------------------------------------------------------------------- FSWI_PATCH1:A13A5414; =========================================================================== FSWI_PATCH1:A13A5414 FSWI_PATCH1:A13A5414; Segment type: Pure code FSWI_PATCH1:A13A5414 AREA FSWI_PATCH1, CODE, READWRITE, ALIGN=0 FSWI_PATCH1:A13A5414 ; ORG 0xA13A5414 FSWI_PATCH1:A13A5414 CODE32 FSWI_PATCH1:A13A5414 LDR PC, =swi_handler FSWI_PATCH1:A13A5414; FSWI_PATCH1 ends FSWI_PATCH1:A13A5414
Если сделать тупо
.section FSWI_PATCH1, "ax", %progbits .int 0xE51FF0F4
То работает, но не вариант, там адреса могут быть разные :(
-
Невозможно уместить в 4 байта загрузку произвольно расположенной переменной, так как сам адрес переменной уже занимает 4 байта.
Если я правильно понял задачу...
> ldr pc, var
иар создаёт 4х байтовый опкод
> b myfunc
гцц создаёт 4х байтовый опкод
-
Что не работает? Не компилируется? или myfunction не работает?
Компилируется но не работает. Там у меня патчится свихендлер, и места под первую секцию ровно на одну комманду. b main вроде как раз и занимает 4 байта, но почему-то не работает свихендлер, из за чего аппарат уходит в аут, точнее даже возможно в вечный цикд или гдето повис, хз.
ReAl, ldr r0, =var не катит, она какого-то фига разворачивается на 8 байт. А именно гцц делает примерно так:
ldr r0, =var
offset: dcd var
чет типа такого.
-
Пробовал - не работает. Если это чтото меняет, на всякий случай скажу, что myfunction - свихендлер
-
.section section1, "ax", %progbits .arm ldr pc, var .section section2, "ax", %progbits var: .int myfunction
Error: internal_relocation (type: OFFSET_IMM) not fixed up
Собственно чяднт, и как это умудряется делать иар?
-
А ещё есть __attribute__((used)) для объектов, которые не нужно трогать
Во, спасибо, помогло :)
-
кароче поставил оптимизацию на 0 и все... А вот при сборке на g++ неиспользованные переменные улетели. Решил проблему сборкой одного файла на С и extern "С" .
-
я без скрипта собираю. Якобы дефолтный. По -verbose выводит какой-то скрипт, который заставляет падать лоадер... Загрузчик заточен под сборку без скрипта. Можно без него как-то обойтись?
-
Здраствуйте. В процессе познания мира натыкнулся на необходимость запихнуть все данные "как есть" в отдельную секцию, получить стартовый аддрес этой секции и размер. В общем с секциями я хотел решить проблему так
volatile int __section_begin; // Сдесь будут находится переменные, которые нужно собрать без оптимизации //Например volatile const int test = 12; volatile SomeStruct data = {2, 3, 4}; volatile int __section_end;
Код собирается, и даже размер секции правильно расчитывает, только фишка в том что нада вычитать не __section_end - __section_begin, а наоборот о_О. С нулевой оптимизацией все нормально, только хотелось бы решить эту проблему внутри файла, без задавания параметров компилятору. Пробовал прагмой задать оптимизацию, в варнинге увидел что она игнорирована, та же ситуация и с аттрибутом. Что посоветуете?
gcc 4.6.0
-
Ага, ну научите меня своим неумением :smile3046:
-
Опубликовано · Изменено пользователем vova7890 · Пожаловаться
нашел какую то старую либгсс, попробовал прилинковать - собралось. Но функция vsprintf(исходник нашел в гугле работоспособность проверена) не смогла побороть float и double. На флоате все зависло а дубль не правильно преобразовало :(
1. Как собрать гсс вместе с libgcc.a?
2. Как можно проверить работоспособность этих либ?
-
Опубликовано · Изменено пользователем vova7890 · Пожаловаться
Собирая констркции конвертации double в float и наоборот гсс попросил много функций для работы с такими операциями. Почти все функции я нашел гугле, но остались 2 функции которых нигде нету, в libgcc.a их нет. Где их взять?
__aeabi_dcmplt __aeabi_dcmpeq
зы. gcc 4.5.2 самозборный
собирал так
./configure --target=arm-eabi --prefix=/usr --enable-interwork --enable-languages="c,c++" --with-float=soft --with-libgcc
-
все, собрал свой гсс с таргетом arm-eabi все заработало. Всем спасибо!!!!
-
Опубликовано · Изменено пользователем vova7890 · Пожаловаться
Товарисч, arm-none-eabi-gcc-4.5.2.exe(т.е. то, чего советовали) это немного не arm-elf-gccа вы товарисч предлагает использовать arm-none-eabi-gcc-4.5.2.elf?(линукс) И че как бы гсс не по стандартам еаби собирает? Де скачать на линукс?
скачал первое что нашел гсс старый arm-unknown-linux-gnueabi-gcc-4.1.1
скомпилял и уррррраааа!!!! Почти :-D
Получил на выходе 55.20001, че 1 в конце? :-D
дайте ссылку пожалуйста, не могу найти (
Нашел arm-none-eabi последней версии, начал компилять, он ругнулся на конструкцию с asm("swi NUMBER"); В чем фишка?
static inline long do_SWI0(const int swi_num ) { long ret_val; asm volatile ( "swi %1 \n\t" \ "mov %0, r0 \n\t" \ : "=r" (ret_val) : "n" (swi_num) : "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc" ); return ret_val; }
include/swiadd.h: In function 'do_SWI0':
include/swiadd.h:35:2: warning: asm operand 1 probably doesn't match constraints
include/swiadd.h:35:2: error: impossible constraint in 'asm'
-
нет, гсс`ые инклуды я поудалял и не использую, у меня все функции в прошивке которые я вызываю по адресу. Так что у меня свои инклуды. От гсс я требую только компиляции, больше ничего
-
скорректируйте до полного разжевывания компилятору:
float a = 55.2; char s[50]; sprintf(&s[0], "%f", a);
и проверить, что возвращает sprintf.
А какая реализация sprintf поддерживается в вашей библиотеке?
гсс разжовывать безтолку, он такой же самый сгенерил код. Оптимизатор то работает :) Реализация спринтфа самая какая ни есть стандартная. Я ж говорю гсс не правильно передал параметры в функцию, поэтому такая лабуда... :crying:
-
Опубликовано · Изменено пользователем vova7890 · Пожаловаться
Для ARM существует стандарт на передачу параметров - EABIА ваш GCC поддерживает EABI? Возможно у вас старая версия, которая его не поддерживала? Какая версия компилятора, какая сборка? Компилятор какой командой вызывается - arm-elf-gcc / arm-none-eabi-gcc или еще какой?P.S. а на безграмотное первое сообщение с понтами могли бы и не дождаться ответа.
И шож там такого безграмотного? Если вы невнимательно читали, то я тут при чем?
Видимо никто не читал первый пост, я ж написал GCC 4.5.2!
компиляю так:
arm-elf-gcc -c -msoft-float -mlittle-endian -mcpu=arm926ej-s -Os -I include -nostdlib -fwide-exec-charset=cp1251 main.c
ну и там линкер ещё..
Это не имеет значения. Корректно написанный код на языке программирования должен давать верный результат при выполнении.ага, я догадывался
Можете привести исходный текст, который при компиляции IAR дает один результат, а при компиляции GCC - другой?приводил уже, первый пост - невидимка.
char s[56]={0};
sprintf(s, "%f", 55.2);
-
Забыл сказать, функция sprintf является прошивочной и от компилятора не зависит
да и не только спринф, многие функции работаеют не так, ибо число другое получается
в буфере(gcc): 2D302E303030303030 (-0.000000)
в буфере(iar): 35352E323030303030 (55.20000)
-
Пишу на гсс 4.5.2.Кароче заметил что спринтф не правильно схавал флоат, я отдизасмил и сравнил с дизасмом иара
char s[56]={0};
sprintf(s, "%f", 55.2);
дизасм гсс:
MOV R0, SP LDR R1, =unk_4A6 LDR R2, =0x404B9999 LDR R3, =0x9999999A
дизасм иара:
LDR R3, =0x404B9999 LDR R2, =0x9999999A MOV R0, SP ADR R1, dword_58
как видно регистры R2 R3 перепутаны.
LDR R2, =0x404B9999
LDR R3, =0x9999999A
LDR R3, =0x404B9999
LDR R2, =0x9999999A
Че делать?
-
Я пробовал уже наверно все что можно, спасибо конечно всем кто помогает, но ничего не выходит... :(
-
Опубликовано · Изменено пользователем vova7890 · Пожаловаться
.text:00000560 EXPORT start .text:00000560 start .text:00000560 .text:00000560 var_10 = -0x10 .text:00000560 .text:00000560 STMFD SP!, {R4,R5,LR} .text:00000564 MOV R5, #0x80; 'А' .text:00000568 SUB SP, SP, #4 .text:0000056C MOV R0, R5 .text:00000570 SWI 0x14 .text:00000574 MOV R4, R0 .text:00000578 MOV R0, R4 .text:0000057C MOV R1, R5 .text:00000580 SWI 0x11D .text:00000584 STR R4, [SP,#0x10+var_10] .text:00000588 SWI 0x16 .text:0000058C MOV R5, R0 .text:00000590 MOV R5, #1 .text:00000594 MOV R0, R5 .text:00000598 MOV R1, R4 .text:0000059C SWI 0x148 .text:000005A0 MOV R5, R0 .text:000005A4 MOV R0, R4 .text:000005A8 SWI 0x15 .text:000005AC BL sub_50C .text:000005B0 MOV R0, #0 .text:000005B4 ADD SP, SP, #4 .text:000005B8 LDMFD SP!, {R4,R5,PC}
static inline int sprintfa(char *dst, char *mft, ...) { int ret_val; static int const swi_num = 22; asm volatile ( "swi %1 \n\t" \ "mov %0, r0 \n\t" \ : "=r" (ret_val) : "n" (swi_num), "m" (dst) // ругалось на "memory" что нету "memory"(аргумент) : "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc" ); return ret_val; }
Реализация mmap на ARMv5
в ARM
Опубликовано · Пожаловаться
Отвечу сам себе - нужно использовать сопроцессор-mmu и смотреть в сторону FSR регистра, чтобы получить от mmu тип исключения и адрес.