OSDev.org
https://forum.osdev.org/

Crash in memmove function
https://forum.osdev.org/viewtopic.php?f=1&t=56505
Page 1 of 1

Author:  zungnguyen [ Wed Sep 28, 2022 11:36 pm ]
Post subject:  Crash in memmove function

Hi everyone,

It ís me again :(.

I have an issue with memmove function. When my OS run into memmove function. Everything works correctly if there is no interrupt happened. If there is interrupt happened, when the memmove's thread back, it raises exception General Protection. The context is saved correctly. Please help

Quote:
void* memmove(void* des, void* src, size_t size)
{
size_t numq = size >> 3;
size_t numb = size & 0b111;
if (des < src)
{
uint64 *qdes = (uint64*)des;
uint64 *qsrc = (uint64*)src;
for (size_t i = 0; i < numq; ++i)
{
qdes[i] = qsrc[i];
// printf(" %d ", i);
}
uint8 *bdes = (uint8*)(des + numq * 8);
uint8 *bsrc = (uint8*)(src + numq * 8);
for (size_t i = 0; i < numb; ++i)
{
bdes[i] = bsrc[i];
}
}
return des;
}

Author:  kzinti [ Thu Sep 29, 2022 1:13 am ]
Post subject:  Re: Crash in memmove function

zungnguyen wrote:
The context is saved correctly.

Is it restored correctly? Clearly both can't be true.

Author:  zungnguyen [ Thu Sep 29, 2022 1:44 am ]
Post subject:  Re: Crash in memmove function

kzinti wrote:
zungnguyen wrote:
The context is saved correctly.

Is it restored correctly? Clearly both can't be true.


Yep, but i handle interrupt in the same stack, can it change data in function stack? I see that the saved rbp is the same with saved rsp , so that when interruptHanler is call, it change the local in my function

Author:  Gigasoft [ Thu Sep 29, 2022 3:41 am ]
Post subject:  Re: Crash in memmove function

If you are using a compiler that uses the SystemV AMD64 ABI, such as GCC, you must remember to disable the red zone for code that runs in kernel mode (-mno-red-zone on GCC), because it will be overwritten on every interrupt.

Author:  zungnguyen [ Thu Sep 29, 2022 9:51 am ]
Post subject:  Re: Crash in memmove function

Gigasoft wrote:
If you are using a compiler that uses the SystemV AMD64 ABI, such as GCC, you must remember to disable the red zone for code that runs in kernel mode (-mno-red-zone on GCC), because it will be overwritten on every interrupt.


Thank you. It works!

Page 1 of 1 All times are UTC - 6 hours
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/