Page 1 of 1

Crash in memmove function

Posted: Wed Sep 28, 2022 11:36 pm
by zungnguyen
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
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 = qsrc;
// printf(" %d ", i);
}
uint8 *bdes = (uint8*)(des + numq * 8);
uint8 *bsrc = (uint8*)(src + numq * 8);
for (size_t i = 0; i < numb; ++i)
{
bdes = bsrc;
}
}
return des;
}

Re: Crash in memmove function

Posted: Thu Sep 29, 2022 1:13 am
by kzinti
zungnguyen wrote:The context is saved correctly.
Is it restored correctly? Clearly both can't be true.

Re: Crash in memmove function

Posted: Thu Sep 29, 2022 1:44 am
by zungnguyen
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

Re: Crash in memmove function

Posted: Thu Sep 29, 2022 3:41 am
by Gigasoft
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.

Re: Crash in memmove function

Posted: Thu Sep 29, 2022 9:51 am
by zungnguyen
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!