2021-05-16 18:27:01 +08:00

89 lines
2.5 KiB
C

/*
* Copyright (c) 2020 Institute of Parallel And Distributed Systems (IPADS), Shanghai Jiao Tong University (SJTU)
* OS-Lab-2020 (i.e., ChCore) is licensed under the Mulan PSL v1.
* You can use this software according to the terms and conditions of the Mulan PSL v1.
* You may obtain a copy of Mulan PSL v1 at:
* http://license.coscl.org.cn/MulanPSL
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v1 for more details.
*/
#pragma once
#include <process/capability.h>
#include <common/list.h>
#include <common/types.h>
#include <common/bitops.h>
#include <common/kprint.h>
#include <common/macro.h>
#include <common/sync.h>
struct object_slot {
u64 slot_id;
struct process *process;
int isvalid;
u64 rights;
struct object *object;
/* link copied slots pointing to the same object */
struct list_head copies;
};
#define BASE_OBJECT_NUM BITS_PER_LONG
/* 1st cap is process. 2nd cap is vmspace */
#define PROCESS_OBJ_ID 0
#define VMSPACE_OBJ_ID 1
struct slot_table {
unsigned int slots_size;
struct object_slot **slots;
/*
* if a bit in full_slots_bmp is 1, corresponding
* sizeof(unsigned long) bits in slots_bmp are all set
*/
unsigned long *full_slots_bmp;
unsigned long *slots_bmp;
};
struct process {
struct slot_table slot_table;
struct list_head thread_list;
};
#define current_process (current_thread->process)
void process_create_root(char *bin_name);
/*
* ATTENTION: These interfaces are for capability internal use.
* As a cap user, check capability.h for interfaces for cap.
*/
int alloc_slot_id(struct process *process);
static inline void free_slot_id(struct process *process, int slot_id)
{
struct slot_table *slot_table = &process->slot_table;
clear_bit(slot_id, slot_table->slots_bmp);
clear_bit(slot_id / BITS_PER_LONG, slot_table->full_slots_bmp);
slot_table->slots[slot_id] = NULL;
}
static inline struct object_slot *get_slot(struct process *process, int slot_id)
{
if (slot_id < 0 || slot_id >= process->slot_table.slots_size)
return NULL;
return process->slot_table.slots[slot_id];
}
static inline void install_slot(struct process *process, int slot_id,
struct object_slot *slot)
{
BUG_ON(!get_bit(slot_id, process->slot_table.slots_bmp));
process->slot_table.slots[slot_id] = slot;
}
bool is_valid_slot_id(struct slot_table *slot_table, int slot_id);
void process_exit(struct process *process);