Changes in kernel/generic/include/context.h [b1c21c2:716fb9d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/context.h
rb1c21c2 r716fb9d 51 51 /** Save register context. 52 52 * 53 * Save the current register context (including stack pointer) to a context 54 * structure. A subsequent call to context_restore() will return to the same 53 * Save current register context (including stack pointers) 54 * to context structure. 55 * 56 * Note that call to context_restore() will return at the same 55 57 * address as the corresponding call to context_save(). 56 58 * 57 * Note that context_save_arch() must reuse the stack frame of the function 58 * which called context_save(). We guarantee this by: 59 * This MUST be a macro, gcc -O0 does not inline functions even 60 * if they are marked inline and context_save_arch must be called 61 * from level <= that when context_restore is called. 59 62 * 60 * a) implementing context_save_arch() in assembly so that it does not create 61 * its own stack frame, and by 62 * b) defining context_save() as a macro because the inline keyword is just a 63 * hint for the compiler, not a real constraint; the application of a macro 64 * will definitely not create a stack frame either. 63 * @param c Context structure. 65 64 * 66 * To imagine what could happen if there were some extra stack frames created 67 * either by context_save() or context_save_arch(), we need to realize that the 68 * sp saved in the contex_t structure points to the current stack frame as it 69 * existed when context_save_arch() was executing. After the return from 70 * context_save_arch() and context_save(), any extra stack frames created by 71 * these functions will be destroyed and their contents sooner or later 72 * overwritten by functions called next. Any attempt to restore to a context 73 * saved like that would therefore lead to a disaster. 74 * 75 * @param c Context structure. 76 * 77 * @return context_save() returns 1, context_restore() returns 0. 65 * @return context_save() returns 1, context_restore() returns 0. 78 66 */ 79 67 #define context_save(c) context_save_arch(c) … … 81 69 /** Restore register context. 82 70 * 83 * Restore a previously saved register context (including stack pointer) from84 * acontext structure.71 * Restore previously saved register context (including stack pointers) 72 * from context structure. 85 73 * 86 * Note that this function does not normally return. Instead, it returns to the 87 * same address as the corresponding call to context_save(), the only difference 88 * being return value. 74 * Note that this function does not normally return. 75 * Instead, it returns at the same address as the 76 * corresponding call to context_save(), the only 77 * difference being return value. 89 78 * 90 * @param c 79 * @param c Context structure. 91 80 */ 92 81 static inline void context_restore(context_t *c)
Note:
See TracChangeset
for help on using the changeset viewer.