// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Cantrip OS ProcessManager services.

import <LoggerInterface.camkes>;
import <MemoryInterface.camkes>;
import <PackageManagementInterface.camkes>;
import <ProcessControlInterface.camkes>;
import <SecurityCoordinatorInterface.camkes>;
import <SDKManagerInterface.camkes>;

component ProcessManager {
  provides PackageManagementInterface pkg_mgmt;
  provides ProcessControlInterface proc_ctrl;

  maybe uses LoggerInterface logger;
  uses MemoryInterface memory;
  uses SecurityCoordinatorInterface security;
  uses SDKManagerInterface sdk_manager;

  // Enable CantripOS CAmkES support.
  attribute int cantripos = true;

  // Process creation requires enough slots to hold dynamically
  // allocated memory when constructing the application. This
  // can be multiple megabytes so size for 4MB / 4KB pages.
  attribute int cnode_headroom = 1024;

  // Arrange for global objects to be instantiated in our CSpace
  // (typically by moving them from the rootserver). Capabilities
  // are exposed with global static symbols.
  attribute int asid_pool = true;  // ASID_POOL
  attribute int sched_ctrl = true;  // SCHED_CTRL
  attribute int domain_ctrl = true;  // DOMANI_CTRL

  // Copyregions for loading bundle images and for loading an application.
  // These need to be separate because they are used concurrently.
  has copyregion BUNDLE_IMAGE;
  has copyregion LOAD_APPLICATION;
}
