* [U-Boot] Question about relocation
@ 2011-04-17 1:19 Alessandro Rubini
2011-04-17 17:04 ` Albert ARIBAUD
0 siblings, 1 reply; 7+ messages in thread
From: Alessandro Rubini @ 2011-04-17 1:19 UTC (permalink / raw)
To: u-boot
Hello.
I'm trying to make at91sam9261ek working again, but relocation
overlaps the destinatin address.
In this board, u-boot runs already in RAM. This is exactly like the
nhk8815 that I ported a few hours ago, but while there the IPL
loaded our code at the beginning of RAM, in this case the IPL
loaded us already at end of RAM.
Now, this is the printout of the situation:
U-Boot code: 23F00000 -> 23F36EFC BSS: -> 23F78570
monitor len: 00078570
ramsize: 04000000
TLB table at: 23ff0000
Top of RAM usable for U-Boot at: 23ff0000
Reserving 481k for U-Boot at: 23f64000
Reserving 180k for malloc() at: 23f37000
Reserving 24 Bytes for Board Info at: 23f36fe8
Reserving 144 Bytes for Global Data at: 23f36f58
New Stack Pointer is: 23f36f50
RAM Configuration:
Bank #0: 20000000 64 MiB
relocation Offset is: 00064000
Since "tor len: 00078570" and "relocation Offset is: 00064000" the
system data-aborts during relocation, as code overwrites relocation
tables.
What is the suggested solution? Changing the IPL is not acceptable for
me, because it is an external tool used by everyone: everybody knows
it loads and runs code at 23f0.0000.
Thanks
/alessandro
^ permalink raw reply [flat|nested] 7+ messages in thread* [U-Boot] Question about relocation 2011-04-17 1:19 [U-Boot] Question about relocation Alessandro Rubini @ 2011-04-17 17:04 ` Albert ARIBAUD 2011-04-17 17:57 ` Alessandro Rubini 0 siblings, 1 reply; 7+ messages in thread From: Albert ARIBAUD @ 2011-04-17 17:04 UTC (permalink / raw) To: u-boot Hi Alessandro, Le 17/04/2011 03:19, Alessandro Rubini a ?crit : > Hello. > I'm trying to make at91sam9261ek working again, but relocation > overlaps the destinatin address. > > In this board, u-boot runs already in RAM. This is exactly like the > nhk8815 that I ported a few hours ago, but while there the IPL > loaded our code at the beginning of RAM, in this case the IPL > loaded us already at end of RAM. > > Now, this is the printout of the situation: > > U-Boot code: 23F00000 -> 23F36EFC BSS: -> 23F78570 > monitor len: 00078570 > ramsize: 04000000 > TLB table at: 23ff0000 > Top of RAM usable for U-Boot at: 23ff0000 > Reserving 481k for U-Boot at: 23f64000 > Reserving 180k for malloc() at: 23f37000 > Reserving 24 Bytes for Board Info at: 23f36fe8 > Reserving 144 Bytes for Global Data at: 23f36f58 > New Stack Pointer is: 23f36f50 > RAM Configuration: > Bank #0: 20000000 64 MiB > relocation Offset is: 00064000 > > Since "tor len: 00078570" and "relocation Offset is: 00064000" the > system data-aborts during relocation, as code overwrites relocation > tables. > > What is the suggested solution? Changing the IPL is not acceptable for > me, because it is an external tool used by everyone: everybody knows > it loads and runs code at 23f0.0000. > > Thanks > /alessandro IIUC, the issue is with the moving of the image. One solution I see, and which is not 100% perfect, would be that the copy code perform either a beginning-to-end copy or an end-to-beginning copy depending on the source and destination addresses and size. So, when copying say 256K from 0x01000000 to 0x03FC0000, the code could do the copy either way, beginning-to end (0x01000000 to 0x0103FFFF) or end-to-beginning (0x0103FFFF to 0x01000000); but when copying from 0x03FB0000 to 0x03FC0000, only the end-to-beginning copy would be possible. This still leaves holes in that copying U-Boot from RAM to RAM where the source is *really* near the end might actually trash the copy code itself. Maybe the instruction cache will help, but I won't bet on this without heavy testing. Amicalement, -- Albert. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [U-Boot] Question about relocation 2011-04-17 17:04 ` Albert ARIBAUD @ 2011-04-17 17:57 ` Alessandro Rubini 2011-04-17 18:23 ` Albert ARIBAUD 0 siblings, 1 reply; 7+ messages in thread From: Alessandro Rubini @ 2011-04-17 17:57 UTC (permalink / raw) To: u-boot > beginning-to-end copy or an end-to-beginning copy depending on the > source and destination addresses and size. Ori, simply, end-to-beginning when moving up. Or always end-to-beginning since we are expected to always move up (upper than the target address it can't run). It is safer, but not safe. Also, it's difficult to accomplish bcause copying and fixing addresses is done ina single run, so the relocation tables are read from the old area. Possibly relocatng first and copying then. Or, easier: if we are already high enough to overlap, don't relocate at all. If it's acceptable, I'll patch for taht. thanks /alessandro ^ permalink raw reply [flat|nested] 7+ messages in thread
* [U-Boot] Question about relocation 2011-04-17 17:57 ` Alessandro Rubini @ 2011-04-17 18:23 ` Albert ARIBAUD 2011-04-17 19:30 ` Alessandro Rubini 0 siblings, 1 reply; 7+ messages in thread From: Albert ARIBAUD @ 2011-04-17 18:23 UTC (permalink / raw) To: u-boot Le 17/04/2011 19:57, Alessandro Rubini a ?crit : >> beginning-to-end copy or an end-to-beginning copy depending on the >> source and destination addresses and size. > > Ori, simply, end-to-beginning when moving up. Or always > end-to-beginning since we are expected to always move up (upper than > the target address it can't run). Since the 'issue' is caused by the code assuming one direction, I'd prefer it not to assume the other now; I prefer choosing end-to-beginning if target is dest than source, beginning-to-end otherwise. > It is safer, but not safe. Also, it's difficult to accomplish bcause > copying and fixing addresses is done ina single run, so the relocation > tables are read from the old area. Possibly relocatng first and > copying then. Actually no, copying and fixing is not done in a single run. There is the copying of the text+data+const area, then the fixing which runs through the relocation table area; they are different. > Or, easier: if we are already high enough to overlap, don't relocate > at all. If it's acceptable, I'll patch for taht. But then comes the question of how enough is "high enough". :) > thanks > /alessandro Amicalement, -- Albert. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [U-Boot] Question about relocation 2011-04-17 18:23 ` Albert ARIBAUD @ 2011-04-17 19:30 ` Alessandro Rubini 2011-04-17 19:47 ` Albert ARIBAUD 0 siblings, 1 reply; 7+ messages in thread From: Alessandro Rubini @ 2011-04-17 19:30 UTC (permalink / raw) To: u-boot >> Ori, simply, end-to-beginning when moving up. Or always >> end-to-beginning since we are expected to always move up (upper than >> the target address it can't run). > Since the 'issue' is caused by the code assuming one direction, I'd > prefer it not to assume the other now; I prefer choosing > end-to-beginning if target is dest than source, beginning-to-end otherwise. but the calculation is done to move to end of ram, so dest is always higher than source. > Actually no, copying and fixing is not done in a single run. There is > the copying of the text+data+const area, then the fixing which runs > through the relocation table area; they are different. Yes, that's what I meant. It's not a memcpy, you also use the data after the copy so any overlap is an issue, indepentend of the order of copying. >> Or, easier: if we are already high enough to overlap, don't relocate >> at all. If it's acceptable, I'll patch for taht. > But then comes the question of how enough is "high enough". :) If there's no overlap, you can relocate. If the areas overal, you keep the current address which also is "high enough". If you ack (even offlist) I'll submit a patch tomorrow (monday) /alessandro ^ permalink raw reply [flat|nested] 7+ messages in thread
* [U-Boot] Question about relocation 2011-04-17 19:30 ` Alessandro Rubini @ 2011-04-17 19:47 ` Albert ARIBAUD 2011-04-18 9:16 ` Alessandro Rubini 0 siblings, 1 reply; 7+ messages in thread From: Albert ARIBAUD @ 2011-04-17 19:47 UTC (permalink / raw) To: u-boot Le 17/04/2011 21:30, Alessandro Rubini a ?crit : >>> Ori, simply, end-to-beginning when moving up. Or always >>> end-to-beginning since we are expected to always move up (upper than >>> the target address it can't run). > >> Since the 'issue' is caused by the code assuming one direction, I'd >> prefer it not to assume the other now; I prefer choosing >> end-to-beginning if target is dest than source, beginning-to-end otherwise. > > but the calculation is done to move to end of ram, so dest is always > higher than source. I guess I can live with this if you put a big fat comment in the code to explain *why* the copy is done end-to-beginning, so that if one day the assumption stops holding, readers of the code can tell if they should keep or change the direction. >> Actually no, copying and fixing is not done in a single run. There is >> the copying of the text+data+const area, then the fixing which runs >> through the relocation table area; they are different. > > Yes, that's what I meant. It's not a memcpy, you also use the data > after the copy so any overlap is an issue, indepentend of the order > of copying. Ok -- you're right, an end-to-beginning copy might trash the relocation info. The only solution, assuming we *know* when we are copying from RAM, would be to actually apply the relocation fixups to the origin location (but still compute them for the destination location!) then copy end-to-beginning. You can happily trash the relocation area now. The only risk left is if the relocation code is going to trash itself over, and that will only happen if the origin is so high in RAM already that the destination base is below the end of the relocation code --this can be tested programatically. To make things easier, this test should be done in board_init_f() so that relocate_code() always gets a safe destination address. If board_init_f() finds it cannot relocate higher, it should just pass the current base address to relocate_code(), in which case no copy should happen but relocation should be done for the current location. >>> Or, easier: if we are already high enough to overlap, don't relocate >>> at all. If it's acceptable, I'll patch for taht. > >> But then comes the question of how enough is "high enough". :) > > If there's no overlap, you can relocate. If the areas overal, you keep > the current address which also is "high enough". > > If you ack (even offlist) I'll submit a patch tomorrow (monday) > /alessandro Can you submit along the lines of what I described here? Amicalement, -- Albert. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [U-Boot] Question about relocation 2011-04-17 19:47 ` Albert ARIBAUD @ 2011-04-18 9:16 ` Alessandro Rubini 0 siblings, 0 replies; 7+ messages in thread From: Alessandro Rubini @ 2011-04-18 9:16 UTC (permalink / raw) To: u-boot Me: >> but the calculation is done to move to end of ram, so dest is always >> higher than source. Albert: > I guess I can live with this if you put a big fat comment in the code to > explain *why* the copy is done end-to-beginning, so that if one day the > assumption stops holding, readers of the code can tell if they should > keep or change the direction. Actually, I was wrong. Since the display buffer is allocated over u-boot, we may already be too high. This never happens for current boards, which lived before relocation was there (I rember having lowered the u-boot address to fit a bigger display buffer above it) but may happen in the future. So, with the comment the thing may work (like "please for new boards load it low now that it relocates high by itself"). However, the copy is made in 35 assembly files. Only ARM has 14 almost-identical copies of the code (some of them are really identical), so I won't dare touching it. The only thing I can do is not making the copy by forcing dest = source if we will overlap ourselves, because the assembly will detect this: adr r0, _start cmp r0, r6 beq clear_bss /* skip relocation */ [I don't understand why here is _start and in C is _TEXT_BASE, which are different by 0x40 bytes, but it unexpectedly works] For me it is working, but the code is not clean at all. I'm sending the patches anyways. I found the the overwrite was only for the stack, which is the lowest address in the relocated place, so I compared some space below the would-be stack with bss_start. /alessandro ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2011-04-18 9:16 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-04-17 1:19 [U-Boot] Question about relocation Alessandro Rubini 2011-04-17 17:04 ` Albert ARIBAUD 2011-04-17 17:57 ` Alessandro Rubini 2011-04-17 18:23 ` Albert ARIBAUD 2011-04-17 19:30 ` Alessandro Rubini 2011-04-17 19:47 ` Albert ARIBAUD 2011-04-18 9:16 ` Alessandro Rubini
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox