Page 1 of 1
for loops aren't working
Posted: Wed Oct 28, 2020 3:12 am
by catOS
https://github.com/ackOS-project/dev
A recently ported my OS to x86_64. I added serial COM port logging. The problem is this code works and prints "Hello world" to the terminal
Code: Select all
serial_putc(COM1, 'H');
serial_putc(COM1, 'e');
serial_putc(COM1, 'l');
serial_putc(COM1, 'l');
serial_putc(COM1, 'o');
serial_putc(COM1, ' ');
serial_putc(COM1, 'w');
serial_putc(COM1, 'o');
serial_putc(COM1, 'r');
serial_putc(COM1, 'l');
serial_putc(COM1, 'd');
but this doesn't:
Code: Select all
serial_write(COM1, "Hello world!");
it compiles but doesn't print "Hello world!"
The source code for serial_write
Code: Select all
void serial_write(int port, const char* data, size_t size = -1)
{
if(size < 0)
{
size = strlen(data);
}
for(size_t i = 0; i < size; i++)
{
serial_putc(port, data[i]);
}
}
Re: for loops aren't working
Posted: Wed Oct 28, 2020 3:27 am
by iansjack
1. Just saying "it doesn't work" isn't very helpful. What happens; what output do you get?
2. Almost certainly the fault lies in your strlen() function, but you don't give us the code for it so who knows.
3. What happens if you do
Code: Select all
serial_write(COM1, "Hello world!", 12);
Does that print correctly?
Re: for loops aren't working
Posted: Wed Oct 28, 2020 3:31 am
by catOS
iansjack wrote:1. Just saying "it doesn't work" isn't very helpful. What happens; what output do you get?
2. Almost certainly the fault lies in your strlen() function, but you don't give us the code for it so who knows.
3. What happens if you do
Code: Select all
serial_write(COM1, "Hello world!", 12);
Does that print correctly?
it does not print anything at all even with serial_write(COM1, "Hello world!", 12).
Re: for loops aren't working
Posted: Wed Oct 28, 2020 4:00 am
by 8infy
size_t is unsigned it cannot be less than 0
Re: for loops aren't working
Posted: Wed Oct 28, 2020 4:21 am
by PeterX
Maybe something weird happens at the function call, maybe because of the flags used for the compilation or linking (telling the way how the function call ABI is done). Just a rough guess, because your code looks correct, at least to me.
And is the function in the same object or source-code file as the code calling it?
EDIT: I found the link to your OS and looked at the linker script: You don't link the data!!!
Greetings
Peter
Re: for loops aren't working
Posted: Wed Oct 28, 2020 9:41 am
by nullplan
I'm getting major deja vu here. Problems with strings are typically caused by
- Not loading enough sectors, so the kernel image in memory is incomplete.
- Not linking in the .rodata section, so the string is not part of the kernel image.
Try these two hints first.
Re: for loops aren't working
Posted: Wed Oct 28, 2020 10:55 am
by Schol-R-LEA
This is definitely a FAQ. I actually had to check the date to be sure that this was a new thread and not someone committing thread necromancy.
The Wiki does cover this, and even has a redirect of the phrase '
Strings do not work' which brings up the page on
Bran's Tutorial's known bugs. It seems that it isn't the easiest answer for newcomers to find despite this. This may need to be addressed, as it will keep happening otherwise, though I am not certain how we could go about it. Any thoughts?
In this case, the focus on the
for() loop rather than the string data seems to have been a stumbling block.
XY problems happen, I guess.
Re: for loops aren't working
Posted: Wed Oct 28, 2020 1:27 pm
by Octocontrabass
It's pretty interesting that you're able to get this far running 64-bit code in 32-bit mode.
Re: for loops aren't working
Posted: Wed Oct 28, 2020 1:56 pm
by PeterX
Schol-R-LEA wrote:This is definitely a FAQ. I actually had to check the date to be sure that this was a new thread and not someone committing thread necromancy.
The Wiki does cover this, and even has a redirect of the phrase '
Strings do not work' which brings up the page on
Bran's Tutorial's known bugs. It seems that it isn't the easiest answer for newcomers to find despite this. This may need to be addressed, as it will keep happening otherwise, though I am not certain how we could go about it. Any thoughts?
In this case, the focus on the
for() loop rather than the string data seems to have been a stumbling block.
XY problems happen, I guess.
1.) Sorry that I didn't point the asking person to the FAQ. In the future I'll try to (mentally and reading) check first if a question can be answered by the FAQ or maybe the Wiki in general or old forum threads.
2.) And yes, it was an XY problem, a linking problem "in disguise" as a loop problem.
3.) Someone already made a redirection for the string-page to the page with the tutorial-error-page. That looks good.
4.) I think the FAQ should be linked
in big, fat letters from the forum's top (like the Wiki in general is done). And I don't mean the forum FAQ but the Wiki FAQ!
Greetings
Peter
Re: for loops aren't working
Posted: Fri Oct 30, 2020 2:05 pm
by MichaelPetch
PeterX wrote:EDIT: I found the link to your OS and looked at the linker script: You don't link the data!!!
Unless the linker script explicitly DISCARDs the sections or he uses some tool like objcopy to remove sections then the `.rodata` section will be emitted but not necessarily in a place they might expect. In this case though the data is in the executable. The problem is as Octocontrabass points out - they are running 64-bit code in 32-bit protected mode and the instructions being run aren't producing the desired results for obvious reasons. Most people often see this issue when displaying to the console (often characters get displayed but not correctly) but this person is seeing it as a result of a function that displays a string to the serial port.
catOS needs to put the processor in 64-bit long mode for this code to work.
Re: for loops aren't working
Posted: Fri Oct 30, 2020 3:08 pm
by PeterX
MichaelPetch wrote:Unless the linker script explicitly DISCARDs the sections or he uses some tool like objcopy to remove sections then the `.rodata` section will be emitted but not necessarily in a place they might expect. In this case though the data is in the executable..
Thanks for the correction. Didn't know that.
Greetings
Peter
Re: for loops aren't working
Posted: Fri Oct 30, 2020 9:33 pm
by catOS
MichaelPetch wrote:
catOS needs to put the processor in 64-bit long mode for this code to work.
how do I setup long mode?
Re: for loops aren't working
Posted: Fri Oct 30, 2020 10:10 pm
by Octocontrabass
There is a decent overview for setting up long mode
on the wiki. (Don't forget to check the links at the bottom of the page.)
You should also check the
Intel and
AMD architecture manuals for details.