Skip to content
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

smmuv2: Add ability to specify sid and cb numbers in a cdl file #34

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

Apave24
Copy link

@Apave24 Apave24 commented Feb 2, 2022

The main driver behind these changes are to allow the camkes tool to map specific stream id's to specific context banks for passthrough devices within a camkes vm application configuration. Related to seL4/camkes-vm#17

Copy link
Member

@lsf37 lsf37 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I understand this change correctly, it will need some further work for the front ends, otherwise it will break existing specs with SMMU.

Please also add an example .cdl file in capDL-tool that use the feature and add it to the test cases in the Makefile.

Comment on lines -654 to -655
sid_number++;
ZF_LOGF_IF(sid_number > MAX_STREAM_IDS, "Stream ID numbers exhausted");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a breaking change in behaviour to me. If sid numbers where previously allocated automatically and now always need to be specified, existing specs will break. I don't think that is a good option.

If we want to keep the loader simple, which I would prefer, the front-ends now need to provide this sid allocation when no sids are listed in the spec.
The change also removes a check for MAX_STREAM_IDS, which, granted, looks like a fairly arbitrary number, but provided some sanity check at least. That is probably also better done in the front end.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with the suggestion to have the allocation provided by the front-end when required. It should be relatively straightforward to do in either the Python or Haskell parts of the toolchain, although it might be a bit more complicated if we want to support a mix of manually specified sids and cbs with others that are automatically allocated.

Does anyone have a use-case that would be helped by a mix like that? If not, I think it would be simplest to not provide support for such specifications.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a breaking change in behaviour to me. If sid numbers where previously allocated automatically and now always need to be specified, existing specs will break. I don't think that is a good option.

It doesn't make sense not specifying a SID. It would be like creating an interrupt handler and not wanting to specify the interrupt ID.

@@ -58,6 +58,11 @@ data SCExtraParam =
scData :: Word }
deriving (Show, Eq, Ord, Typeable, Data)

data SIDExtraParam =
SIDNumber {
sidNumber :: Word }
Copy link
Member

@lsf37 lsf37 Feb 2, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: please indent + 2 (the sidNumber :: Word } line)

@lsf37 lsf37 requested a review from corlewis February 2, 2022 22:09
@lsf37
Copy link
Member

lsf37 commented Feb 2, 2022

The gitlint check is complaining about a too-long title (max 50 characters). Please shorten, but instead provide context and background/reasoning for the change in the body of the commit message instead.

Copy link
Member

@corlewis corlewis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for this work @Apave24, it definitely looks like it will result in an improvement to the SMMU support! I do agree with @lsf37 though, in that one of the other parts of the toolchain should be updated as well so that we do not break existing specifications.

Comment on lines -654 to -655
sid_number++;
ZF_LOGF_IF(sid_number > MAX_STREAM_IDS, "Stream ID numbers exhausted");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with the suggestion to have the allocation provided by the front-end when required. It should be relatively straightforward to do in either the Python or Haskell parts of the toolchain, although it might be a bit more complicated if we want to support a mix of manually specified sids and cbs with others that are automatically allocated.

Does anyone have a use-case that would be helped by a mix like that? If not, I think it would be simplest to not provide support for such specifications.

@@ -648,17 +645,14 @@ unsigned int create_object(CDL_Model *spec, CDL_Object *obj, CDL_ObjID id, seL4_
*/
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment on lines 641-644 needs to be slightly updated for this change. In particular, I think that the second half of the comment involving the order of stream ids and context banks in the specification is no longer relevant.

@@ -377,8 +377,24 @@ showObjectFields _ _ (SC info size_bits) _ _ _ =
sc_data = fromMaybe 0 (maybe Nothing scData info)
sizeBits = fromMaybe 0 size_bits
showObjectFields _ _ (RTReply {}) _ _ _ = ".type = CDL_RTReply,"
showObjectFields _ _ (ARMSID {}) _ _ _ = ".type = CDL_SID,"
showObjectFields _ _ (ARMCB {}) _ _ _ = ".type = CDL_CB,"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not relevant to this PR but I'm slightly confused about how this previously worked. It looks like the initialiser already required that context banks had a number specified, but nothing was being passed through by the CapDL-tool here.

Comment on lines +209 to 210
| ARMSID { sidNumber :: Maybe Word }
| ARMCB { bankNumber :: Maybe Word }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Depending on what the decision is about stream ids and context banks having their numbers manually specified or automatically generated, it might make sense for these fields to be Word instead of Maybe Word.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree it makes sense for a sidNumber to be a word. I guess the difference is not setting the argument would be interpreted as the same as setting it to 0?

Comment on lines +443 to +444
validObjPars (Obj ARMSID_T ps []) =
subsetConstrs ps (replicate (numConstrs (Addr undefined)) (SIDExtraParam undefined))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, it's pretty harmless but it looks like quite a few of the other cases in this function were incorrectly copied. I'll fix the existing ones, but this should actually be

Suggested change
validObjPars (Obj ARMSID_T ps []) =
subsetConstrs ps (replicate (numConstrs (Addr undefined)) (SIDExtraParam undefined))
validObjPars (Obj ARMSID_T ps []) =
subsetConstrs ps (replicate (numConstrs (SIDNumber undefined)) (SIDExtraParam undefined))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants