for loops aren't working

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
User avatar
catOS
Member
Member
Posts: 28
Joined: Tue Mar 31, 2020 6:28 pm

for loops aren't working

Post 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]);
   }
}
Visit ackOS's GitHub page:
>> https://github.com/ackOS-project/ackOS <<
User avatar
iansjack
Member
Member
Posts: 4703
Joined: Sat Mar 31, 2012 3:07 am
Location: Chichester, UK

Re: for loops aren't working

Post 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?
User avatar
catOS
Member
Member
Posts: 28
Joined: Tue Mar 31, 2020 6:28 pm

Re: for loops aren't working

Post 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).
Visit ackOS's GitHub page:
>> https://github.com/ackOS-project/ackOS <<
8infy
Member
Member
Posts: 185
Joined: Sun Apr 05, 2020 1:01 pm

Re: for loops aren't working

Post by 8infy »

size_t is unsigned it cannot be less than 0 :D
PeterX
Member
Member
Posts: 590
Joined: Fri Nov 22, 2019 5:46 am

Re: for loops aren't working

Post 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
nullplan
Member
Member
Posts: 1790
Joined: Wed Aug 30, 2017 8:24 am

Re: for loops aren't working

Post by nullplan »

I'm getting major deja vu here. Problems with strings are typically caused by
  1. Not loading enough sectors, so the kernel image in memory is incomplete.
  2. Not linking in the .rodata section, so the string is not part of the kernel image.
Try these two hints first.
Carpe diem!
User avatar
Schol-R-LEA
Member
Member
Posts: 1925
Joined: Fri Oct 27, 2006 9:42 am
Location: Athens, GA, USA

Re: for loops aren't working

Post 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.
Rev. First Speaker Schol-R-LEA;2 LCF ELF JAM POEE KoR KCO PPWMTF
Ordo OS Project
Lisp programmers tend to seem very odd to outsiders, just like anyone else who has had a religious experience they can't quite explain to others.
Octocontrabass
Member
Member
Posts: 5568
Joined: Mon Mar 25, 2013 7:01 pm

Re: for loops aren't working

Post by Octocontrabass »

It's pretty interesting that you're able to get this far running 64-bit code in 32-bit mode.
PeterX
Member
Member
Posts: 590
Joined: Fri Nov 22, 2019 5:46 am

Re: for loops aren't working

Post 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
MichaelPetch
Member
Member
Posts: 797
Joined: Fri Aug 26, 2016 1:41 pm
Libera.chat IRC: mpetch

Re: for loops aren't working

Post 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.
PeterX
Member
Member
Posts: 590
Joined: Fri Nov 22, 2019 5:46 am

Re: for loops aren't working

Post 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
User avatar
catOS
Member
Member
Posts: 28
Joined: Tue Mar 31, 2020 6:28 pm

Re: for loops aren't working

Post 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?
Visit ackOS's GitHub page:
>> https://github.com/ackOS-project/ackOS <<
Octocontrabass
Member
Member
Posts: 5568
Joined: Mon Mar 25, 2013 7:01 pm

Re: for loops aren't working

Post 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.
Post Reply