-
Notifications
You must be signed in to change notification settings - Fork 72
Handle armv8m unpriv_access with SAU #486
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
| if ((vmpu_unpriv_test_range(addr, UVISOR_UNPRIV_ACCESS_SIZE(size)) & (TT_RESP_NSRW_Msk | TT_RESP_SRVALID_Msk)) == (TT_RESP_NSRW_Msk | TT_RESP_SRVALID_Msk)) { | ||
| //if ((vmpu_unpriv_test_range(addr, UVISOR_UNPRIV_ACCESS_SIZE(size)) & (TT_RESP_NSRW_Msk | TT_RESP_SRVALID_Msk)) == (TT_RESP_NSRW_Msk | TT_RESP_SRVALID_Msk)) { | ||
| //this should be slower substantualy | ||
| if (vmpu_buffer_access_is_ok(g_active_box, addr, UVISOR_UNPRIV_ACCESS_SIZE(size))){ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We shouldn't need to use the loop anymore, nor try to recover.
a35d01b to
818ec82
Compare
|
works well on v8 |
f7a284b to
07febfa
Compare
alzix
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
squash the commits and write appropriate commit message describing the problem and the fix
| } | ||
| if (++tries > 1 || !vmpu_fault_recovery_mpu(0, 0, addr, 0)) { | ||
| break; | ||
| //if ((vmpu_unpriv_test_range(addr, UVISOR_UNPRIV_ACCESS_SIZE(size)) & (TT_RESP_NSRW_Msk | TT_RESP_SRVALID_Msk)) == (TT_RESP_NSRW_Msk | TT_RESP_SRVALID_Msk)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please remove legacy code
| if (++tries > 1 || !vmpu_fault_recovery_mpu(0, 0, addr, 0)) { | ||
| break; | ||
| //if ((vmpu_unpriv_test_range(addr, UVISOR_UNPRIV_ACCESS_SIZE(size)) & (TT_RESP_NSRW_Msk | TT_RESP_SRVALID_Msk)) == (TT_RESP_NSRW_Msk | TT_RESP_SRVALID_Msk)) { | ||
| //this should be slower substantualy |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please explain how and why this is slower in this comment.
| break; | ||
| } | ||
| } | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Make whitespace changes in a separate commit.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't add trailing whitespace.
| //if ((vmpu_unpriv_test_range(addr, UVISOR_UNPRIV_ACCESS_SIZE(size)) & (TT_RESP_NSRW_Msk | TT_RESP_SRVALID_Msk)) == (TT_RESP_NSRW_Msk | TT_RESP_SRVALID_Msk)) { | ||
| //this should be slower substantualy | ||
| if (vmpu_buffer_access_is_ok(g_active_box, (const void *) addr, UVISOR_UNPRIV_ACCESS_SIZE(size))){ | ||
| switch(size) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add a space after keywords like switch, before the (. It was wrong before. Please make style changes in a separate commit.
|
What testing has been done with v8-M? All v8-M tests pass? |
c9f3515 to
c0c6db1
Compare
|
@niklas-arm could you review the changes and compare it to your work? |
0f7c8ac to
df08917
Compare
|
Looks like this is suffering from the same problem on the |
|
This is pretty similar to what I implemented. The issue is related to the SAU not being updated with the region containing the accessed memory anymore. For some reason this now leads to a hardfault. |
02a49a0 to
5499cc7
Compare
| break; | ||
| } | ||
|
|
||
| if (++tries > 1 || !vmpu_fault_recovery_mpu(0, 0, addr, 0)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should have to recover. vmpu_buffer_access_is_ok should tell you what access you would have if you did recover. The access can happen from secure mode without the recovery happening.
| uint32_t vmpu_unpriv_access(uint32_t addr, uint32_t size, uint32_t data) | ||
| { | ||
| unsigned int tries = 0; | ||
| while(1) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We shouldn't have to loop here either.
98230cf to
980c649
Compare
| /* Upon execution return debug_handler will be executed. Upon return from | ||
| * debug_handler, return_handler will be executed. */ | ||
|
|
||
| //uint32_t caller = UVISOR_GET_NS_ALIAS(UVISOR_GET_NS_ADDRESS((uint32_t) debug_handler)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Patater @niklas-arm
my problem is how can i proceed from here
af7667e to
249bea0
Compare
Previously when we got to unpriv_access we verfied the operation with the TT assembly command, we now switch to using the SAU with uVisor vmpu functions. This could slow down the operation since we switch an assembly command with a C function which scans the virtual regions.
249bea0 to
eb32d63
Compare
|
This is waiting for #497 to merge first, so that the debug box has a good context in which to run. |
|
This needs to wait, as not all the v8-M tests are passing if I merge this. |
No description provided.