It's basically returning to the code that called save() by jumping to the return address instead of using ret, which would affect the stack pointer.
EAX = old ESP, which has a full stack frame(as defined in kernel/type.h) at the top. The initial part of this save routine was building this saved stack frame.
P_STACKBASE and RETADR are defined in kernel/sconst.h, and are constants for accessing parts of that stack frame from assembler code.
If I calculated correctly, RETADR would have the value 0x22, but that's kind of irrelevant.
The JMP command uses the offset RETADR into EAX to point to the return address of the caller. This is close to the AT&T assembly syntax addressing scheme, in which(for example) mov 4(%esp), %eax means "move the dword at *(esp + 4) to eax".