Hi,
Don't feel offended, the port to c is a very good thing and indeed better in
the most part than the previous asm implementation. I value your work very
much.
But there are some aspects badly implemented:
1) It is not possible to write a good stub in an inline function nor in a
regular macro due to c preprocessor limitations. Your implementation trust
the optimizer to remove constant conditionals, but it does not work as well
as you may think. Have you seen the generated code? It has a lot of
unnecessary branching. I have implemented it as an x-macro, where I can use
the preprocessor to select the options to be generated and it does not
generate any run time conditional branching.
2) You have added many inline assembly parts in several files that should be
kept as portable as possible. These things are better put together in
architecture dependent files/directories. Furthermore, most are unnecessary,
my single trap stub in a single x-macro replaces most of your inlines.
3) Since the pointer to the trap frame is passed to handlers, why do you
pass as extra parameters information that is already there? Access to
members of the KTRAP_FRAME is just as fast as access to local variables or
parameters, but saves on additional copies and allow more efficient register
usage. Furthermore using regparam(3) for functions called from inline
assembly, when actually only one param was needed, was really a very bad
idea. And you pass the same parameters to child handlers in cascade, again
and again. This is very unefficient. Today I simplified the syscall and
fastsyscall handlers removing a lot unnecessary parameter copying and
cascading, saving a lot of cycles and memory, while making it much easier to
read and understand.
4) Why did you resort to code patching to encode the PKINTERRUPT parameter,
instead of generating a static variable named together with the stub, for
example? Wasn't it hackish? I hope you understand that you won't save even a
cycle that way, so why to use such an unportable and complex method?
The worst thing is the indiscriminate and spread use of inline assembly and
compiler specific features. Please think in placing such things in platform
specific includes and try to make them as general and reusable as possible,
instead of making the code base very difficult to port and maintain.
Please take this as constructive criticism and not as any personal offense.
We all can always learn better if we can accept criticism.
Jose Catena
DIGIWAVES S.L.