ron minnich wrote:
On Dec 12, 2007 6:00 PM, Marc Jones marc.jones@amd.com wrote:
There are a couple ways to address this.
- copy the stack to a new location.
- Set the tags dirty with by writing the way MSRs.
- enable the cache and copy the stack back on it's self to dirty the tags.
I am least sure about number three.
Here is one idea.
Copy the stack to "somewhere" in real memory, not "CAR memory". Disable CAR. Enable the cache. Copy the stack back.
in fact, we could define disable_car as follows: void disable_car(void *savestack) { memcpy(savestack, &savestack, 4096); /* copy stack to "savestack" in real memory */ /* turn off car */ /* enable cache */ /* problem: how do we invd without losing savestack variable? */ /* one option is to ALWAYS save the stack to page 0 */ memcopy(&savestack, savestack, 4096);
Something like this might work. We're saving the stack to memory, enabling cache, and copying it back. What do you think?
I don't think that moving the stack should be a problem. All access should be push/pop or ss/esp/ebp relative. I also don't think you need to copy the stack back (like K8) and I would only copy the amount of stack that is being used. Not the entire space.
The savestack variable won't be a problem. It will either be in a register or on the stack. Once the stack is move to real memory and the registers adjusted the invd won't change anything. The register adjustment will have to be inline asm with no push, pops, or stack accesses. For and example, look in cpu/amd/car/post_cache_as_ram.c for %esp.
Marc