Compare commits

...

116 Commits

Author SHA1 Message Date
openharmony_ci
a7080aaa85 !889 FatFs升级r0.14a版本同步3.0分支
Merge pull request !889 from wangchen/05_31_up_a
2022-06-02 07:43:01 +00:00
wangchen
1f7e6fa76f fix: FatFs升级r0.14a版本同步3.0分支
【背景】FatFs升级r0.14a版本同步3.0分支

【修改方案】
将三方库FatFs升级至r0.14a版本
主要修改点为:
适配_mkfs、find_volume接口更新
【影响】
对现有的产品编译不会有影响。
re #I5A7AS
Signed-off-by: wangchen <wangchen64@huawei.com>

Change-Id: I428fcb930fa0ead43ea033d14898fc0a00445933
2022-05-31 08:57:16 +00:00
openharmony_ci
efd00c1e0d !872 内核codex清零
Merge pull request !872 from Kiita/0421_codex
2022-04-25 02:25:39 +00:00
zhangyan
ffe7462c7f 内核codex告警清零
Signed-off-by: Kiita <zhanyan@huawei.com>
Change-Id: I6b0bc9ba638f7aa73be754d5c92561fc372de1c6
2022-04-24 03:13:12 +00:00
openharmony_ci
6d7641af53 !812 3.0 LTS 告警清零
Merge pull request !812 from yinjiaming/OpenHarmony-3.0-LTS
2022-03-09 03:54:00 +00:00
yinjiaming
143309945a fix: 3.0 lts 告警清零
【背景】
3.0 lts 告警清零

【修改方案】
添加了强制类型转换

【影响】
对现有的产品编译不会有影响。

Signed-off-by: yinjiaming <yinjiaming@huawei.com>
Change-Id: I6faba4fe43ec127ad2a75b7123d0365b9903045b
2022-03-03 09:15:59 +00:00
openharmony_ci
9c1e902b55 !809 3.0 LTS 告警清零
Merge pull request !809 from yinjiaming/OpenHarmony-3.0-LTS
2022-03-02 03:14:43 +00:00
yinjiaming
84011c89a5 fix: 3.0 LTS 告警清零
【背景】
3.0 LTS 经过扫描有一些告警需要清理

【修改方案】
在需要的地方添加了强制类型转换

【影响】
对现有的产品编译不会有影响。

re #I4UZW3

Signed-off-by: yinjiaming <yinjiaming@huawei.com>
Change-Id: I1f9cd16293b649ea9f9b3c4d3d02b1bfe95114e2
2022-02-23 11:02:55 +00:00
openharmony_ci
89154a3765 !777 [LTS-3.0]修复toybox mv指令能够移动成功,但提示错误22的BUG
Merge pull request !777 from Far/cherry-pick-1641884328
2022-01-12 02:21:53 +00:00
Far
8e6f3f1bfb fix: 修复futime提示错误22的BUG
调用futime时,系统调用接口函数直接使用了file结构体的f_path字段,该字段在退出前被错误地释放了。
避免该问题需要拷贝一份路径

Signed-off-by: Far <yesiyuan2@huawei.com>
Change-Id: Ic0f8e608363da3ed15e252a3f91c46e8397c245e
2022-01-11 16:03:17 +08:00
openharmony_ci
d5c8341bb0 !775 【轻量级 PR】:reduce print log if hilog ringbuffer is full
Merge pull request !775 from shenchenkai/N/A
2022-01-11 06:29:33 +00:00
shenchenkai
157fb8b212 reduce print log if hilog ringbuffer is full
Signed-off-by: shenchenkai <shenchenkai@huawei.com>
2022-01-11 04:14:49 +00:00
openharmony_ci
95f7cf16d0 !770 LOS_PaddrToKVaddr函数的实现存在冗余修改
Merge pull request !770 from 闻飞/OpenHarmony-3.0-LTS
2022-01-10 13:19:32 +00:00
wenfei6316
790573d018 fix LOS_PaddrToKVaddr function logical redundancy
Signed-off-by: wenfei6316 <wenfei6316@163.com>
2022-01-07 16:18:14 +08:00
openharmony_ci
246bdd11d8 !760 fix: shell支持exit退出,完善帮助信息,特殊处理不可见字符
Merge pull request !760 from huangshan/cherry-pick-1640932477
2022-01-07 03:20:56 +00:00
huangshan
017d8163ea fixed cc6e112 from https://gitee.com/uhamc/kernel_liteos_a/pulls/702
fix: shell支持exit退出,完善帮助信息,特殊处理不可见字符

Change-Id: Ia6dbff0faed4ec73fcf35691676f1acb2b8df78d
Signed-off-by: huangshan <huangshan9@huawei.com>
2021-12-31 06:34:40 +00:00
openharmony_ci
f6d727fed8 !753 fix: implicit declaration of function 'syscall' in apps/shell
Merge pull request !753 from huangshan/673
2021-12-31 06:16:07 +00:00
openharmony_ci
a771e39988 !754 fix: 修复Ctrl+C会终止所有进程的问题
Merge pull request !754 from huangshan/cherry-pick-1640571697
2021-12-31 06:16:01 +00:00
openharmony_ci
594f50733e !742 添加bundle.json
Merge pull request !742 from pjscc/OpenHarmony-3.0-LTS
2021-12-31 03:13:18 +00:00
openharmony_ci
10bf30f91f !758 【轻量级 PR】:fix: 修复重复执行内存用例导致系统卡死问题同步
Merge pull request !758 from Harylee/N/A
2021-12-30 08:20:49 +00:00
Harylee
60e77d0ea7 fix: 修复重复执行内存用例导致系统卡死问题同步
Signed-off-by: Haryslee <lihao189@huawei.com>
2021-12-29 11:55:31 +00:00
openharmony_ci
68b477588f !741 [LTS-3.0]修复los_disk_cache_clear有条件编译错误
Merge pull request !741 from Far/cherry-pick-1640053131
2021-12-29 03:43:29 +00:00
pjscc
2f8d12ece1 feat: 添加bundle.json作为hpm包管理描述文件
Signed-off-by: pjscc <pangjiashuai@huawei.com>
2021-12-29 10:41:28 +08:00
huangshan
12d4bc05f4 fixed cdc0877 from https://gitee.com/uhamc/kernel_liteos_a/pulls/693
修复Ctrl+C会终止所有进程的问题

Signed-off-by: huangshan <huangshan9@huawei.com>
Change-Id: I5861569c63fd6c1adf8c702797e4d79eba76211f
2021-12-27 02:21:37 +00:00
uhamc
b9d012b026 fix: implicit declaration of function 'syscall' in apps/shell
Change-Id: Id3f56ac53ec5a3c86b04bcb7a4611f2eb77f4b80
Signed-off-by: uhamc <uhamc@foxmail.com>
2021-12-27 10:07:03 +08:00
openharmony_ci
b0f642b493 !748 fix: 临终遗言重定向内容缺失task相关信息,对应的shell命令中申请的内存需要cacheline对齐
Merge pull request !748 from zhushengle/OpenHarmony-3.0-LTS
2021-12-25 02:55:52 +00:00
openharmony_ci
6c36623ac7 !746 fix: 修复xts权限用例压测异常问题
Merge pull request !746 from Harylee/cherry-pick-1640220757
2021-12-25 02:10:44 +00:00
zhushengle
9078efccd1 fix: 临终遗言重定向内容缺失task相关信息,对应的shell命令中申请的内存需要cacheline对齐
1.内核打印的地方支持异常时重定向打印信息
2.excinfo 命令中申请的内存64对齐

Signed-off-by: zhushengle <zhushengle@huawei.com>
Change-Id: I6ccd57b93b4a6e2eeabe5b366e9c0eb262dcad8e
2021-12-24 12:17:41 +08:00
openharmony_ci
b7c4acfb78 !745 fix: 非当前进程退出时,销毁liteipc时错误的销毁了当前进程的
Merge pull request !745 from zhushengle/OpenHarmony-3.0-LTS
2021-12-24 03:57:14 +00:00
Haryslee
aaa3cc9d7b fixed b0d31cb from https://gitee.com/harylee/kernel_liteos_a/pulls/738
fix: 修复xts权限用例压测异常问题

用例异常时出现Domain fault或者unknown fault,经分析发现是TLB缓存一致性问题,
在缺页异常入口,对上述两种异常类型做异常地址TLB缓存清理即可。

close #I3ZJ1D

Signed-off-by: Haryslee <lihao189@huawei.com>
Change-Id: Ib84e3e87047fcac392b83a4cf6cca0d91754e66f
2021-12-23 00:52:37 +00:00
openharmony_ci
dc8853bb78 !743 fix: 优化trace buffer初始化,删除swtmr 桩中的无效参数
Merge pull request !743 from Zhaotianyu/cherry-pick-1640160115
2021-12-22 09:30:55 +00:00
zhushengle
892201f67b fix: 非当前进程退出时,销毁liteipc时错误的销毁了当前进程的
Signed-off-by: zhushengle <zhushengle@huawei.com>
Change-Id: Icf6688cf0d15efd0c6ef278f3fce37bf3849b03a
2021-12-22 17:24:08 +08:00
LiteOS2021
91709a3599 fixed b551270 from https://gitee.com/arvinzzz/kernel_liteos_a/pulls/660
fix: 优化trace buffer初始化,删除swtmr 桩中的无效参数
    close #I4DQ1X
Signed-off-by: LiteOS2021 <dinglu@huawei.com>

Change-Id: I79b416720f5327749a5884a65a5e61db07f2a17c
2021-12-22 08:02:09 +00:00
Far
332ba8fd65 fixed 63e71fe from https://gitee.com/yesiyuanjim/kernel_liteos_a/pulls/731
fix: 修复LOSCFG_FS_FAT_CACHE宏关闭后编译失败的BUG

1. 在必要处增加宏开关关闭部分代码的编译;
2. 由于驱动是一个独立的内核线程,在一些场景下文件系统会将用户态地址透传给驱动,这会导致内核崩溃。
因此在需要透传用户态地址时增加了一个内核buffer作为中转。

Close #I3T3N0

Signed-off-by: Far <yesiyuan2@huawei.com>
2021-12-21 02:18:52 +00:00
openharmony_ci
d9752abcb4 !736 支持产品定制化hilog内核缓存大小
Merge pull request !736 from shenchenkai/OpenHarmony-3.0-LTS
2021-12-18 06:53:05 +00:00
shenchenkai
12cc392f46 Description:[feature] support customized hilog ring buffer size
Change-Id: I5d23deaada5939bbb6fb57505f72c2348bd6afe9
Signed-off-by: shenchenkai <shenchenkai@huawei.com>
2021-12-17 15:56:15 +08:00
openharmony_ci
62aa4aa0b1 !725 Codex警告清零
Merge pull request !725 from yinjiaming/yjm-kernel-fs-20211203
2021-12-03 07:08:29 +00:00
yinjiaming
929a282bad 【背景】
codex 告警清零
【修改方案】
修改和添加了procfs的默认文件模式的宏定义,对进行位操作运算的有符号数进行强制类型转换

【影响】
对现有的产品编译不会有影响。

re #I4KVS7

Signed-off-by: yinjiaming <yinjiaming@huawei.com>
2021-12-03 01:41:48 +00:00
openharmony_ci
8bb15bf8e7 !720 当hilog/hievent驱动缓存出问题时,进行恢复处理
Merge pull request !720 from shenchenkai/cherry-pick-1637986052
2021-11-29 03:55:39 +00:00
openharmony_ci
aec7840626 !718 [LTS-3.0]修复jffs2适配层错误释放锁的BUG
Merge pull request !718 from Far/cherry-pick-1637906208
2021-11-27 07:48:22 +00:00
shenchenkai
e43e252e14 fixed c121d0e from https://gitee.com/shenchenkai/kernel_liteos_a/pulls/670
Description:[fix] clean hilog/hievent ring buffer after memory verification failed

Change-Id: I9310fe807ec95721be78deb60ed9728ef9b56e48
Signed-off-by: shenchenkai <shenchenkai@huawei.com>
2021-11-27 04:07:32 +00:00
Far
ba4ed5a599 fixed 011a55f from https://gitee.com/yesiyuanjim/kernel_liteos_a/pulls/712
fix: 修复jffs2适配层错误释放锁的BUG

修复重复释放jffs2全局锁的BUG

Close #I4FH9M

Signed-off-by: Far <yesiyuan2@huawei.com>
2021-11-26 05:56:54 +00:00
openharmony_ci
55bdf174b8 !700 修改blackbox生成的文件和文件夹权限
Merge pull request !700 from mgceshuang/cherry-pick-1636013017
2021-11-08 02:26:54 +00:00
openharmony_ci
c8c3034709 !688 PR665 misc09用例修改挑单到3.0LTS
Merge pull request !688 from pef/OpenHarmony-3.0-LTS
2021-11-04 11:45:23 +00:00
YOUR_NAME
f32154f9cb fixed f360b21 from https://gitee.com/mgce/kernel_liteos_a/pulls/698
add blackbox to 2.3

Signed-off-by: YOUR_NAME <mashuang9@huawei.com>
2021-11-04 08:03:37 +00:00
openharmony_ci
60d3f6d5da !689 PR666 关于sys用例修复挑单到3.0TLS
Merge pull request !689 from pef/OpenHarmony-3.0-LTS_sys_test
2021-11-04 02:08:43 +00:00
openharmony_ci
44279b256a !694 PR676 关于ppoll修改挑单到3.0TLS
Merge pull request !694 from pef/OpenHarmony-3.0-1102
2021-11-04 02:08:40 +00:00
lnlan
951d233676 修复ppoll接口"[ERR]OsMemFree check error!"报错
【背景】
1.内核中释放用户空间指针报错:"[ERR]OsMemFree check error!"
2.现有ppoll实现存在问题
3.相关用例需要整理
【修改方案】
1.去掉释放用户空间指针操作
2.更正逻辑错误
3.更正掩码设置与恢复不起作用
4.修复补充现有用例
【影响】
对现有的产品编译不会有影响。

re #I47YWZ

Change-Id: Ib2f60986e9cafb2ea5ef1097ab8552cbb1ede5b4
Signed-off-by: lnlan <lanleinan@163.com>
2021-11-02 11:41:07 +00:00
pef
ca70dc4dd1 修复ppoll接口"[ERR]OsMemFree check error!"报错
【背景】
内核中释放用户空间指针报错:"[ERR]OsMemFree check error!"

【修改方案】
修改SysPpoll函数。

【影响】
对现有的产品编译不会有影响。

re #I47YWZ

Change-Id: Id7f86036870d4f32be8fc438b9aad85cdda59546
Signed-off-by: pef <cyd1997@126.com>
2021-11-02 11:40:55 +00:00
teamol
a693cd4198 fix: fix ppoll
1.modifications:
modified:   syscall/fs_syscall.c
2.modify 2 testcases:
IO/full/IO_test_ppoll_001.cpp
IO/full/IO_test_ppoll_002.cpp
3.influence:
none

Signed-off-by: pef <cyd1997@126.com>
Change-Id: I85fc091098a6dfef1a4694a3bbc489640ee6dda2
2021-11-02 11:40:25 +00:00
lnlan
f249db759d fix(test): 修复sys部分用例因依赖passwd、group文件而失败
【背景】
1.sys部分用例因依赖passwd、group文件而失败

【修改方案】
1.用例执行前检查是否存在这些配置文件,不存在就跳过该用例

re#I48IUC

Change-Id: I787ce4b200f2a7546e57290b7dd073127caa07bb
Signed-off-by: lnlan <lanleinan@163.com>
2021-11-01 01:27:22 +00:00
lnlan
6f0c5d10e2 fix(test): misc09用例因依赖hosts文件而失败
【背景】
1.etc/hosts文件不存在,misc09依赖hosts文件而失败

【修改方案】
1.用例执行前检查是否存在这些配置文件,不存在就跳过该用例

re#I48IZ0

Change-Id: I193cb03770932c1f681cd726ceb383816aa2257a

Signed-off-by: lnlan <lanleinan@163.com>
Change-Id: I3fb7ca1ed5f8cc79a56cd1872f3b303ab325a7a9
2021-11-01 01:21:34 +00:00
openharmony_ci
ca8909b8e3 !677 a核ioctl支持SIOCGIFBRDADDR选项
Merge pull request !677 from 刘建东/cherry-pick-1635300058
2021-10-27 08:47:35 +00:00
openharmony_ci
431c9e9d61 !678 signal内存泄露修复挑单到3.0tls
Merge pull request !678 from lnlan/tlsSignalFixed
2021-10-27 06:30:54 +00:00
lnlan
d71db99932 fix: 修复PR520缺陷
【背景】
https://gitee.com/openharmony/kernel_liteos_a/pulls/520
上面修改,信号处理时才会释放申请的内存,当信号被屏蔽,且一直发送该信号时,
内存占用会不断变大
【修改方案】
1.
信号发送时已经有该信号的siginfo在链表中时,不再重新申请,重复使用之前的siginfo.

【影响】
对现有的产品编译不会有影响。

re#I4DEG5

Signed-off-by: lanleinan <lanleinan@163.com>

Change-Id: I74b3b7ff0b9efb0179313af9a0c8d1e12d1db5bb
2021-10-27 03:52:39 +00:00
YOUR_NAME
6b54224726 fixed 4ecc473 from https://gitee.com/life-liu/kernel_liteos_a/pulls/659
feat: add option SIOCGIFBRDADDR for ioctl

add option SIOCGIFBRDADDR for ioctl

close: #I4DNRF

Signed-off-by: liujiandong <liujiandong1@huawei.com>
2021-10-27 02:01:00 +00:00
openharmony_ci
9ac04e886a !653 fix: 进程在退出前回收vmspace中的所有Region
Merge pull request !653 from zhushengle/cherry-pick-1633924550
2021-10-14 02:59:28 +00:00
zhushengle
06b0396945 fixed 298ccea from https://gitee.com/zhushengle/kernel_liteos_a/pulls/631
fix: 进程退出前自己回收vmspace中的所有region

背景:
父进程fork一个子进程,调用waitpid等待子进程结束。
子进程dlopen一个文件a.so,并退出。当守护进程正在
1核回收子进程资源时,父进程在0核运行从waitpid返
回后,同时remove a.so概率失败。

Close #I4CKQC

Signed-off-by: zhushengle <zhushengle@huawei.com>
Change-Id: Ie7940e7c931ced10ee357cf9aa7c64355effed49
2021-10-11 03:55:51 +00:00
openharmony_ci
bb3590a448 !648 pagecache优化需求回合到LTS 3.0分支
Merge pull request !648 from LeonChan/pg3
2021-10-08 07:38:41 +00:00
Leon Chan
027fa6136a feat: page cache backed by vnode instead of filep
1, change the owner of page to vnode
2, save the file path in vnode

close: #I4AGBR
Signed-off-by: Leon Chan <chenwei26@huawei.com>
Change-Id: I04f93e344c7231d1731746456babc419a6139e52
Signed-off-by: Leon Chan <chenwei26@huawei.com>
2021-09-30 16:21:03 +08:00
openharmony_ci
532f96d746 !647 将menuconfig 与 update_config功能做成一样
Merge pull request !647 from Caoruihong/cherry-pick-1632974889
2021-09-30 07:19:10 +00:00
Caoruihong
d2bc8f2f1b fixed 3dd952b from https://gitee.com/caoruihong/kernel_liteos_a/pulls/646
chore(make): make menuconfig same as update_config

Signed-off-by: Caoruihong <crh.cao@huawei.com>
Change-Id: I5c4a1a0601865c1c7d6ae40b829abdb53f13ccd3
2021-09-30 04:08:10 +00:00
Guangyao Ma
e5c7549bc2 fix: dyload open close failed
本次提交修复内核加载器,异常情况分支的一个bug:mksh通过exec命令(mksh内置命令
,正常情况下,该命令成功执行会复用mksh进程空间,拉起新的指定进程)。但是如果
进程没有成功加载的情况下,内核加载器的异常分支会错误释放mksh的fd句柄。最终导致
下次拉起其他进程时(fork + exec方式),新的进程会继承fd,映射了早就释放的sysfd
,此时的sysfd可能已经被复用,issue场景下这个sysfd被加载过程中打开的libc.so占用
,exec时会释放procfd->sysfd(错误的映射关系),最终新进程libc.so被关闭。
导致内核崩溃。

close #I452Z7

Signed-off-by: Guangyao Ma <guangyao.ma@outlook.com>
Change-Id: Ifca809f88b5ffcfb879dc5520d1f6adf5cf92bcd
2021-09-30 10:56:11 +08:00
openharmony_ci
832001a6af !645 去除mtd对hisilicon驱动的依赖
Merge pull request !645 from SimonLi/OpenHarmony-3.0-LTS
2021-09-30 02:43:38 +00:00
SimonLi
7d7188c737 fix(mtd): 去除mtd对hisilicon驱动的依赖
【背景】
1. liteos-a内核drivers/mtd/multi_partition/用到了device/hisilicon下的驱动函数实
现,这样导致三方芯片适配时,会依赖hisilicon的驱动。
2. HDF的mtd驱动提供了这几个函数的实现,但是未暴露头文件出来。

【修改方案】
1. 修改BUILD.gn去除/device/hisilicon的依赖。
2. 修改mtd_partition.c,将hisilicon的头文件改为hdf的头文件依赖。

【遗留问题】
liteos-a内核与HDF mtd驱动的分界线还不明确,导致依赖关系不清楚

close: #I49FKL

Signed-off-by: SimonLi <likailong@huawei.com>
2021-09-29 20:51:11 +08:00
openharmony_ci
88a0caae24 !632 fix: 共享内存问题修复
Merge pull request !632 from Harylee/cherry-pick-1632710893
2021-09-27 06:54:52 +00:00
openharmony_ci
99824916dd !630 master分支关于sigwait的修改挑单到TLS
Merge pull request !630 from lnlan/to_LTS
2021-09-27 02:53:36 +00:00
Haryslee
42fdaffe76 fixed 9fdb80f from https://gitee.com/harylee/kernel_liteos_a/pulls/628
fix: 共享内存问题修复

Signed-off-by: Haryslee <lihao189@huawei.com>
背景:父进程移除共享内存并标记SHM_SEG_REMOVE,当子进程资源回收时在
ShmFindSeg接口中判断该共享内存具有SHM_SEG_REMOVE时返回空,但是此时
seg->ds.shm_nattch不为0,不应返回空。
方案:ShmFindSeg接口中增加seg->ds.shm_nattch为0的判断。

close #I47X2Z

Change-Id: I8735cd11ac237b17fa745c50313da0fd0649bb9f
2021-09-27 02:48:14 +00:00
lnlan
ed7defbd43 fix: 修复sigwait等待到的信号值与获取的siginfo中的值不一致
【背景】
集成测试发送两个不同的信号,sigwait第二次等到的仍是第一个信号
经定位,信号在kill时会将相关的siginfo信息拷贝到taskcb的unbinfo中,sigwait
处理时从unbinfo拷贝给用户。若此信号发送时处于屏蔽状态,再有其他信号发送会覆盖
掉unbinfo,此时sigwait等待这个信号获取到的info已经被覆盖
【修改方案】
1. 每个任务添加一个siginfo缓存链表,在处理信号前夕从缓存链表取出info到unbinfo中

【影响】
对现有的产品编译不会有影响。

re #I3M12H

Signed-off-by: lanleinan <lanleinan@163.com>

Change-Id: If4b064c18773f8eca7419c665977260167b09810
2021-09-26 09:57:32 +00:00
openharmony_ci
de8257bc82 !551 TODOList通过issue跟踪,不在代码仓中添加
Merge pull request !551 from Denny/remove_todolist
2021-09-03 01:01:06 +00:00
openharmony_ci
19b39b1bff !600 参数化liteos_config_file配置项
Merge pull request !600 from Caoruihong/opt_20210902
2021-09-02 10:54:09 +00:00
openharmony_ci
5e07663374 !598 优化trace device初始化,不在system_init.c中调用,改为LOS_MODULE_INIT
Merge pull request !598 from LiteOS/master
2021-09-02 04:06:41 +00:00
Caoruihong
f9a907772f feat(build): make liteos_config_file available as gn argument
You can specify another config file in hb build like this:
  hb build --gn-args liteos_config_file=myconfig.config
file specified in liteos_config_file argument is relative
to "$product_path/kernel_configs" directory, or is an
absolute file path, for example:
  hb build --gn-args liteos_config_file=//path/to/myconfig.config
or
  hb build --gn-args liteos_config_file=/another/path/to/myconfig.config

Signed-off-by: Caoruihong <crh.cao@huawei.com>
Change-Id: I7e98604006feff9c2487e06a8f3f2a11e5de746b
2021-09-02 10:54:15 +08:00
openharmony_ci
007f385396 !596 优化编译脚本,DEVICE_PATH下的drivers/Kconfig由可选改为必选
Merge pull request !596 from Caoruihong/opt_20210901
2021-09-01 11:07:20 +00:00
Caoruihong
463bc0546f chore(build): optimize build scripts, make Kconfig in DEVICE_PATH mandatory
$(DEVICE_PATH)/drivers/Kconfig is mandatory now.

Signed-off-by: Caoruihong <crh.cao@huawei.com>
Change-Id: Ie9484229e2dc6e6babe0cf2daf8e4f6693163052
2021-09-01 18:45:44 +08:00
openharmony_ci
0c93a9b4f8 !597 删除tools/build/config下的配置文件,更新编译脚本
Merge pull request !597 from Caoruihong/opt_kconfig
2021-09-01 08:45:23 +00:00
LiteOS2021
d30a009ba5 move trace device init from system_init.c to drivers/char/trace.c
Signed-off-by: LiteOS2021 <dinglu@huawei.com>
Change-Id: Ie4555c57f56c82f74b5e29f0e58aec97dc6cc32d
2021-09-01 12:49:37 +08:00
Caoruihong
4bee53a610 chore(build): optimize build scripts, remove unused config files
config files under tools/build/config directory are no maintained any more,
so we delete all of them.

Signed-off-by: Caoruihong <crh.cao@huawei.com>
Change-Id: Idf51d55caa3c820617b7c90affda0186718632e5
2021-09-01 12:39:55 +08:00
openharmony_ci
81b474813b !565 feat: L0~L1 支持Trace
Merge pull request !565 from LiteOS/master
2021-08-31 13:32:20 +00:00
LiteOS2021
dc9ec6856f feat: L0-L1 支持Trace
1.【需求描述】
            L0~L1 支持Trace,提供两种工作模式:在线模式、离线缓存模式, 用于按时间线追踪系统事件,如任务切换、中断、ipc等。
        2.【方案描述】
            L0:
            (1).在内核模块预置静态代码桩
            (2).触发桩后,收集系统上下文信息
            (3).离线模式则写入内存,用户可通过dump导出;
            (4).在线模式通过pipeline对接IDE进行可视化解析和展示;
            L1:
            新增trace字符设备,位于"/dev/trace",通过对设备节点的read\write\ioctl,实现用户态trace;

        BREAKING CHANGE:
        1.新增一系列trace的对外API,位于los_trace.h中.
        LOS_TRACE_EASY简易插桩
        LOS_TRACE标准插桩
        LOS_TraceInit配置Trace缓冲区的地址和大小
        LOS_TraceStart开启事件记录
        LOS_TraceStop停止事件记录
        LOS_TraceRecordDump输出Trace缓冲区数据
        LOS_TraceRecordGet获取Trace缓冲区的首地址
        LOS_TraceReset清除Trace缓冲区中的事件
        LOS_TraceEventMaskSet设置事件掩码,仅记录某些模块的事件
        LOS_TraceHwiFilterHookReg注册过滤特定中断号事件的钩子函数

        Close #I46WA0

    Signed-off-by: LiteOS2021 <dinglu@huawei.com>

Change-Id: I6a8e64794c4852f2c2980993a06180e09ec6ee0d
2021-08-31 20:29:45 +08:00
openharmony_ci
658fafe83b !586 liteos补丁能力支持
Merge pull request !586 from jason_gitee/master
2021-08-31 08:16:31 +00:00
openharmony_ci
f3562e490c !588 删除zpfs冗余代码
Merge pull request !588 from 马帅/master
2021-08-31 07:40:38 +00:00
openharmony_ci
9888185fcb !590 优化编译脚本,将LTO选项做成可配置
Merge pull request !590 from Caoruihong/lto
2021-08-31 07:11:37 +00:00
Caoruihong
055295b6d1 chore: optimize build scripts and add lto config entry
Signed-off-by: Caoruihong <crh.cao@huawei.com>
Change-Id: Ibf8df58696b7f1ccb3b5b21154c3b94dda1e8ad2
2021-08-31 12:04:34 +08:00
openharmony_ci
c26ca519f7 !579 优化构建脚本
Merge pull request !579 from Caoruihong/optimize_build_scripts
2021-08-30 11:06:25 +00:00
Caoruihong
df35eb513d chore(make): optimize build scripts
Signed-off-by: Caoruihong <crh.cao@huawei.com>
Change-Id: Ibb4223ef2d032a03950263b766414ca1c021e69a
2021-08-30 17:18:21 +08:00
openharmony_ci
7cb2ad67bf !570 fix ppoll & add 2 testcases
Merge pull request !570 from guweijie/gwj-kernel-ppoll-20210825
2021-08-30 02:06:24 +00:00
jason_gitee
98ca8441fe feat: add liteos patch ability
Signed-off-by: jason_gitee <yangjie140@huawei.com>
2021-08-28 08:02:50 +00:00
maltose214
3393479c52 feat: 删除zpfs冗余代码
Signed-off-by: maltose214 <mashuai3@huawei.com>
2021-08-28 15:17:40 +08:00
openharmony_ci
aa5b2c7641 !573 适配升级optimized-routines到v21.02
Merge pull request !573 from Caoruihong/v21.02
2021-08-28 01:06:09 +00:00
openharmony_ci
7661aedcc9 !571 支持sys模块api接口:ftok、nice、getlogin、getgrgid、getgrnam等
Merge pull request !571 from wangjianjun/sys
2021-08-27 07:51:08 +00:00
openharmony_ci
c97178f2f6 !561 fix SYSCALL faccessat,fstatfs,fstatat & add 6 testcases
Merge pull request !561 from guweijie/gwj-kernel-20210819
2021-08-27 07:49:20 +00:00
openharmony_ci
8839fdd399 !544 fix killpg and waitid
Merge pull request !544 from wangjianjun/waitid
2021-08-27 07:48:25 +00:00
openharmony_ci
a3b480b18e !543 fix:fchdir
Merge pull request !543 from wcc/fs
2021-08-27 07:47:34 +00:00
teamol
defedb6fdf fix: add syscall for ppoll & add 2 testcases
1.modifications:
modified:   syscall/los_syscall.h
modified:   syscall/misc_syscall.c
modified:   syscall/syscall_lookup.h
2.add 3 testcases:
testsuites/unittest/IO/full/IO_test_ppoll_001.cpp
testsuites/unittest/IO/full/IO_test_ppoll_002.cpp
3.influence:
none

Signed-off-by: teamol <28105285@qq.com>
2021-08-27 15:37:42 +08:00
Caoruihong
1ec8d5a454 feat(libc): upgrade optimized-routines to v21.02
Signed-off-by: Caoruihong <crh.cao@huawei.com>
Change-Id: I5cdca0ee82d3e8a164120fe3ecb6e94f2f89d600
2021-08-26 12:42:47 +08:00
wjj
7c577d8963 test: 添加sys模块接口的测试用例
把测试用例放在full中,需要依赖文件group和passwd,放在/etc下

Change-Id: Ie038b64db96180b52ee10d70d494da42207d3b92
Signed-off-by: wjj <502004968@qq.com>
2021-08-25 15:48:54 +08:00
openharmony_ci
6e2a4be155 !569 启用mksh和toybox的make编译
Merge pull request !569 from Caoruihong/mksh_toybox
2021-08-25 01:07:30 +00:00
Caoruihong
682ae82158 chore: enable make of mksh and toybox
Signed-off-by: Caoruihong <crh.cao@huawei.com>
Change-Id: Ie152b0ad21af5dc8e8c31c71f236500e5726e1c4
2021-08-25 01:46:41 +08:00
wcc0
e828cbdeac fix: add fchdir api
add fchdir and testcases

Change-Id: Iad724944e727c4a08b8801f109acbbe48f55c283
Signed-off-by: wcc0 <917033401@qq.com>
2021-08-24 17:02:40 +08:00
openharmony_ci
45a128a4f0 !504 clock模块内核unittest用例调整
Merge pull request !504 from phchang/updateclock
2021-08-24 02:33:32 +00:00
openharmony_ci
83bff88f7f !567 优化编译脚本删除冗余选项
Merge pull request !567 from Caoruihong/opt_make
2021-08-24 01:31:19 +00:00
Caoruihong
181322a3c1 chore(make): fix and optimize some build scripts
Signed-off-by: Caoruihong <crh.cao@huawei.com>
Change-Id: I2e61b7ea231be78423dc10412e0ab9a710cad8ef
2021-08-23 20:47:18 +08:00
openharmony_ci
5369b6aa23 !564 优化make编译脚本
Merge pull request !564 from Caoruihong/update_makefile
2021-08-23 05:55:39 +00:00
Caoruihong
0e260949c9 feat(make): optimize makefiles and remove some unused files
Signed-off-by: Caoruihong <crh.cao@huawei.com>
Change-Id: Ie2dfa7334417ccd55bd56a19a7882a982ce49cab
2021-08-22 04:23:40 +08:00
openharmony_ci
8b267dc690 !563 A核 告警清零
Merge pull request !563 from wangchen/a_codex
2021-08-21 09:31:56 +00:00
wangchen
d16bfd005a fix: A核告警消除
【背景】定期A核代码消除。

【修改方案】
1,根据工具扫描结果,对代码告警进行更改

【影响】
对现有的产品编译不会有影响。

re #I46KF6
Signed-off-by: wangchen <253227059@qq.com>
2021-08-20 18:09:04 +08:00
openharmony_ci
40297a6dbc !487 多核启动及内存映射解耦
Merge pull request !487 from JerryH/smp-xxx
2021-08-20 03:54:23 +00:00
openharmony_ci
752aa49018 !558 减少对musl代码的侵入式修改
Merge pull request !558 from Caoruihong/update_musl
2021-08-19 11:47:37 +00:00
openharmony_ci
5569b1d1ec !558 减少对musl代码的侵入式修改
Merge pull request !558 from Caoruihong/update_musl
2021-08-19 11:47:37 +00:00
Caoruihong
9549f5ebd0 chore(musl): reduce the modifications of musl
Signed-off-by: Caoruihong <crh.cao@huawei.com>
Change-Id: I32b820bc0eb7465bf54d506e7f5e759ef64101e2
2021-08-19 16:07:12 +08:00
teamol
aa1cd245a5 fix: fix syscall faccessat,fstatfs,fstatat & add 6 testcases
1.modifications:
modified:   testsuites/unittest/fs/BUILD.gn
modified:   testsuites/unittest/fs/jffs/It_vfs_jffs.h
renamed:    testsuites/unittest/fs/jffs/smoke/It_test_faccessat_001.cpp -> testsuites/unittest/fs/jffs/full/It_test_faccessat_001.cpp
renamed:    testsuites/unittest/fs/jffs/smoke/It_test_faccessat_002.cpp -> testsuites/unittest/fs/jffs/full/It_test_faccessat_002.cpp
renamed:    testsuites/unittest/fs/jffs/smoke/It_test_fstatat_001.cpp -> testsuites/unittest/fs/jffs/full/It_test_fstatat_001.cpp
renamed:    testsuites/unittest/fs/jffs/smoke/It_test_fstatat_002.cpp -> testsuites/unittest/fs/jffs/full/It_test_fstatat_002.cpp
renamed:    testsuites/unittest/fs/jffs/smoke/It_test_fstatfs_001.cpp -> testsuites/unittest/fs/jffs/full/It_test_fstatfs_001.cpp
renamed:    testsuites/unittest/fs/jffs/smoke/It_test_fstatfs_002.cpp -> testsuites/unittest/fs/jffs/full/It_test_fstatfs_002.cpp
modified:   testsuites/unittest/fs/jffs/vfs_jffs_test.cpp
2.add 6 testcases:
It_test_faccessat_001.cpp
It_test_faccessat_002.cpp
It_test_fstatat_001.cpp
It_test_fstatat_002.cpp
It_test_fstatfs_001.cpp
It_test_fstatfs_002.cpp
3.influence:
none

Signed-off-by: teamol <28105285@qq.com>
2021-08-19 15:46:04 +08:00
denny
ec366df863 chore: TODOList通过issue跟踪,不在代码仓中添加
Signed-off-by: denny <denny.shenwei@huawei.com>
2021-08-16 20:42:12 +08:00
vcbchang
555e0681be test: clock用例结构调整
【背景】当前kernel的unittest下的用例全量与门禁用例结构不合理,当前上传clock修改后版本

【修改方案】
1 原来没有测试clock模块的基本场景,这里补上基本场景作为smoke用例,并命名为clock_test_smoke.cpp
2 将原来smoke用例移到full中
3 删除与xts测试重复的用例和标记宏TEST_ON_LINUX的用例(即原来版本的clock_test_002,003,004用例)
4 原来clock_test_012用例用于测试进程的运行时间,里面存在正常场景和异常场景,现在将其分成两个用例
5 对所有用例重新排序,使得结构完整

re #I44170

Signed-off-by: vcbchang <vcbchang@qq.com>

Change-Id: I30852a5f9c414668c00eddbcc9631d70818514a1
2021-08-13 16:29:38 +08:00
wjj
dc3cc094a7 feat: 支持killpg和waitid
killpg:给进程组发信号
waitid:等待进程结束
修改测试用例到full里面

Change-Id: Ice058ab4a6eede8ecbaacea0894c2161e3b9dce2
Signed-off-by: wjj <502004968@qq.com>
2021-08-12 18:06:55 +08:00
JerryH
3bb3173604 fix: smp启动代码解耦及内存映射关系解耦
close #I41P8Y

Signed-off-by: JerryH <huangjieliang@huawei.com>
Change-Id: I01833cf617bbc695543a865dbb994c6c22d4a0a8
2021-08-05 16:03:43 +08:00
306 changed files with 8741 additions and 6744 deletions

1
.gitignore vendored
View File

@@ -17,7 +17,6 @@ tags
# Menuconfig temp files
/config.h
/defconfig
/.config
/.config.old

389
BUILD.gn
View File

@@ -32,6 +32,7 @@ import("//build/lite/config/component/lite_component.gni")
declare_args() {
tee_enable = false
liteos_name = "OHOS_Image"
liteos_skip_make = false
}
cmd = "if [ -f $device_path/BUILD.gn ]; then echo true; else echo false; fi"
@@ -44,30 +45,11 @@ if (tee_enable) {
tee = "_tee"
}
productName = get_path_info(product_path, "file")
config_file = "${productName}_release.config"
if (ohos_build_compiler == "clang") {
if (ohos_build_type == "debug") {
config_file = "debug/${productName}_${ohos_build_compiler}${tee}.config"
} else {
config_file = "${productName}_${ohos_build_compiler}_release${tee}.config"
}
} else if (ohos_build_compiler == "gcc") {
if (ohos_build_type == "debug") {
config_file = "${productName}_debug_shell${tee}.config"
} else {
config_file = "${productName}_release${tee}.config"
}
}
liteos_config_file = rebase_path("tools/build/config/$config_file")
# we prefer use product specified config file
f = "$product_path/kernel_configs/${ohos_build_type}${tee}.config"
if (exec_script("//build/lite/run_shell_cmd.py", [ "if [ -f $f ]; then echo true; else echo false; fi" ], "value")) {
liteos_config_file = f
declare_args() {
liteos_config_file = "${ohos_build_type}${tee}.config"
}
liteos_config_file = rebase_path(liteos_config_file, "", "$product_path/kernel_configs")
print("liteos_config_file:", liteos_config_file)
exec_script("//build/lite/run_shell_cmd.py",
@@ -83,10 +65,14 @@ exec_script("//build/lite/run_shell_cmd.py",
" --file-list kconfig_files.txt" +
" --env-list kconfig_env.txt" +
" --config-out config.gni",
])
], "", [ liteos_config_file ])
import("liteos.gni")
assert(ARCH != "", "ARCH not set!")
assert(ARCH == arch, "ARCH not match! details: $ARCH != $arch")
assert(tee_enable == defined(LOSCFG_TEE_ENABLE), "TEE switch not match!")
generate_notice_file("kernel_notice_file") {
module_name = "kernel"
module_source_dir_list = [
@@ -125,30 +111,197 @@ config("arch_config") {
cflags = liteos_arch_cflags
asmflags = cflags
ldflags = cflags
}
config("as_objs_libc_flags") {
defines = [ "__ASSEMBLY__" ]
# linux style macros
if (defined(LOSCFG_ARCH_ARM_V7A) || defined(LOSCFG_ARCH_ARM_V7R) ||
defined(LOSCFG_ARCH_ARM_V7M)) {
defines += [ "__LINUX_ARM_ARCH__=7" ]
} else if (defined(LOSCFG_ARCH_ARM_V8A) || defined(LOSCFG_ARCH_ARM_V8R) ||
defined(LOSCFG_ARCH_ARM_V8M)) {
defines += [ "__LINUX_ARM_ARCH__=8" ]
if (defined(LOSCFG_ARCH_ARM_AARCH32)) {
if (!defined(LOSCFG_COMPILER_CLANG_LLVM)) {
cflags += ["-mthumb-interwork"]
}
}
if (defined(LOSCFG_THUMB)) {
cflags += [ "-mthumb" ]
if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
cflags += [ "-mimplicit-it=thumb" ]
} else {
cflags += [ "-Wa,-mimplicit-it=thumb" ]
}
}
}
config("std_include") {
config("stdinc_config") {
std_include = exec_script("//build/lite/run_shell_cmd.py", [ "$cc -print-file-name=include" ], "trim string")
cflags = [
"-isystem",
std_include,
]
cflags += [ "-nostdinc" ]
asmflags = cflags
}
config("ssp_config") {
cflags = []
if (defined(LOSCFG_CC_STACKPROTECTOR_ALL)) {
cflags += [ "-fstack-protector-all" ]
} else if (defined(LOSCFG_CC_STACKPROTECTOR_STRONG)) {
cflags += [ "-fstack-protector-strong" ]
} else if (defined(LOSCFG_CC_STACKPROTECTOR)) {
cflags += [
"-fstack-protector",
"--param",
"ssp-buffer-size=4",
]
} else {
cflags += [ "-fno-stack-protector" ]
}
asmflags = cflags
}
config("optimize_config") {
cflags = []
if (defined(LOSCFG_COMPILE_DEBUG)) {
cflags += [
"-g",
"-gdwarf-2",
]
optimization_cflag = "-O0"
}
if (defined(LOSCFG_COMPILE_OPTIMIZE)) {
optimization_cflag = "-O2"
}
if (defined(LOSCFG_COMPILE_OPTIMIZE_SIZE)) {
if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
optimization_cflag = "-Oz"
} else {
optimization_cflag = "-Os"
}
}
if (defined(LOSCFG_COMPILE_LTO)) {
if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
cflags += [ "-flto=thin" ]
} else {
cflags += [ "-flto" ]
}
}
cflags += [ optimization_cflag ]
asmflags = cflags
}
config("kconfig_config") {
cflags = [
"-imacros",
"$LITEOS_MENUCONFIG_H",
]
asmflags = cflags
}
config("warn_config") {
cflags = [
"-Wall",
"-Werror",
"-Wpointer-arith",
"-Wstrict-prototypes",
"-Winvalid-pch",
"-Wno-address-of-packed-member",
]
asmflags = cflags
}
config("dialect_config") {
cflags_c = [ "-std=c99" ]
cflags_cc = [ "-std=c++11" ]
}
config("misc_config") {
defines = [ "__LITEOS__" ]
if (!defined(LOSCFG_DEBUG_VERSION)) {
defines += [ "NDEBUG" ]
}
cflags = [
"-fno-pic",
"-fno-builtin",
"-fms-extensions",
"-fno-strict-aliasing",
"-fno-common",
"-fsigned-char",
"-ffunction-sections",
"-fdata-sections",
"-fno-exceptions",
"-fno-omit-frame-pointer",
"-fno-short-enums",
"-mno-unaligned-access",
]
if (!defined(LOSCFG_COMPILER_CLANG_LLVM)) {
cflags += [ "-fno-aggressive-loop-optimizations" ]
}
asmflags = cflags
}
config("los_config") {
configs = [
":arch_config",
":kconfig_config",
":stdinc_config",
":dialect_config",
":optimize_config",
":ssp_config",
":warn_config",
":misc_config",
]
}
executable("liteos") {
configs = [] # clear default configs
configs += [ ":arch_config" ]
configs += [ ":public" ]
ldflags = [
"-static",
"-nostdlib",
"-Wl,--gc-sections",
"-Wl,-Map=$liteos_name.map",
"-Wl,--no-eh-frame-hdr",
]
libgcc = exec_script("//build/lite/run_shell_cmd.py", [ "$cc -print-libgcc-file-name" ], "trim string")
libs = [ libgcc ]
if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
ldflags += [ "-Wl,-T" + rebase_path("tools/build/liteos_llvm.ld", root_build_dir) ]
inputs = [ "tools/build/liteos_llvm.ld" ]
} else {
ldflags += [ "-Wl,-T" + rebase_path("tools/build/liteos.ld", root_build_dir) ]
ldflags += [ "-Wl,-nostartfiles" ]
inputs = [ "tools/build/liteos.ld" ]
}
inputs += [ "$root_out_dir/board.ld" ]
output_dir = target_out_dir
deps = [
"platform:copy_board.ld",
":modules",
]
}
copy("copy_liteos") {
deps = [ ":liteos" ]
sources = [ "$target_out_dir/unstripped/bin/liteos" ]
outputs = [ "$root_out_dir/$liteos_name" ]
}
build_ext_component("build_kernel_image") {
deps = [ ":copy_liteos" ]
exec_path = rebase_path(root_out_dir)
objcopy = "${compile_prefix}objcopy$toolchain_cmd_suffix"
objdump = "${compile_prefix}objdump$toolchain_cmd_suffix"
command = "$objcopy -O binary $liteos_name $liteos_name.bin"
command += " && sh -c '$objdump -t $liteos_name | sort >$liteos_name.sym.sorted'"
command += " && sh -c '$objdump -d $liteos_name >$liteos_name.asm'"
}
config("public") {
configs = [
"arch:public",
@@ -174,156 +327,6 @@ config("public") {
}
}
config("los_nostdinc") {
cflags = [ "-nostdinc" ]
}
config("los_nostdlib") {
ldflags = [ "-nostdlib" ]
}
config("los_common") {
cflags = [
"-imacros",
"$LITEOS_MENUCONFIG_H",
]
defines = [ "__LITEOS__" ]
cflags_c = [ "-std=c99" ]
cflags += [
"-fno-pic",
"-fno-builtin",
"-Wall",
"-Werror",
"-fms-extensions",
"-Wno-address-of-packed-member",
"-fno-strict-aliasing",
"-fno-common",
"-fsigned-char",
"-Wpointer-arith",
"-Wstrict-prototypes",
"-Winvalid-pch",
"-ffunction-sections",
"-fdata-sections",
"-fno-exceptions",
"-fno-omit-frame-pointer",
"-fno-short-enums",
]
if (defined(LOSCFG_QUICK_START)) {
cflags -= [ "-Werror" ]
}
if (defined(LOSCFG_COMPILE_DEBUG)) {
cflags += [
"-O0",
"-g",
"-gdwarf-2",
]
} else {
if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
cflags += [
"-Oz",
"-flto",
]
} else {
cflags += [ "-O2" ]
}
}
if (defined(LOSCFG_CC_STACKPROTECTOR_ALL)) {
cflags += [ "-fstack-protector-all" ]
} else if (defined(LOSCFG_CC_STACKPROTECTOR_STRONG)) {
cflags += [ "-fstack-protector-strong" ]
} else if (defined(LOSCFG_CC_STACKPROTECTOR)) {
cflags += [
"-fstack-protector",
"--param",
"ssp-buffer-size=4",
]
} else {
cflags += [ "-fno-stack-protector" ]
}
if (!defined(LOSCFG_COMPILER_CLANG_LLVM)) {
cflags += [ "-fno-aggressive-loop-optimizations" ]
if (!defined(LOSCFG_ARCH_ARM_AARCH64)) {
cflags += [
"-mno-unaligned-access",
"-mthumb-interwork",
]
}
}
if (defined(LOSCFG_THUMB)) {
cflags += [
"-mthumb",
"-Wa,-mimplicit-it=thumb",
]
}
asmflags = cflags
}
config("los_config") {
configs = [
":los_common",
":arch_config",
":los_nostdinc",
":los_nostdlib",
":std_include",
]
}
executable("liteos") {
configs = [] # clear default configs
configs += [ ":los_config" ]
configs += [ ":public" ]
ldflags = [
"-static",
"-Wl,--gc-sections",
"-Wl,-Map=$liteos_name.map",
"-Wl,--no-eh-frame-hdr",
]
libgcc = exec_script("//build/lite/run_shell_cmd.py", [ "$cc -print-libgcc-file-name" ], "trim string")
libs = [ libgcc ]
if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
ldflags += [ "-Wl,-T" + rebase_path("tools/build/liteos_llvm.ld", root_build_dir) ]
} else {
ldflags += [ "-Wl,-T" + rebase_path("tools/build/liteos.ld", root_build_dir) ]
ldflags += [ "-Wl,-nostartfiles" ]
}
output_dir = target_out_dir
output_name = liteos_name
deps = [
":modules",
]
}
copy("copy_liteos") {
deps = [ ":liteos" ]
sources = [ "$target_out_dir/unstripped/bin/$liteos_name" ]
outputs = [ "$root_out_dir/{{source_file_part}}" ]
}
build_ext_component("build_kernel_image") {
deps = [ ":copy_liteos" ]
exec_path = rebase_path(root_out_dir)
objcopy = "${compile_prefix}objcopy$toolchain_cmd_suffix"
objdump = "${compile_prefix}objdump$toolchain_cmd_suffix"
command = "$objcopy -O binary $liteos_name $liteos_name.bin"
command += " && sh -c '$objdump -t $liteos_name | sort >$liteos_name.sym.sorted'"
command += " && sh -c '$objdump -d $liteos_name >$liteos_name.asm'"
}
group("modules") {
deps = [
"arch",
@@ -341,7 +344,7 @@ group("modules") {
]
deps += [
"$HDFTOPDIR",
HDFTOPDIR,
"//drivers/liteos",
]
@@ -372,10 +375,14 @@ group("liteos_a") {
build_ext_component("make") {
exec_path = rebase_path(".", root_build_dir)
outdir = rebase_path(get_path_info(".", "out_dir"))
outdir = rebase_path("$target_out_dir/${target_name}_out")
sysroot_path = rebase_path(ohos_current_sysroot)
arch_cflags = string_join(" ", target_arch_cflags)
command = "./build.sh ${board_name} ${ohos_build_compiler} ${root_build_dir} ${ohos_build_type} \"${tee_enable}\""
command += " \"${device_company}\" \"${product_path}\" $outdir \"${ohos_version}\" ${sysroot_path} \"${arch_cflags}\""
command += " \"${device_path}\""
command = "./build.sh \"$board_name\" \"$ohos_build_compiler\" \"$root_build_dir\" \"$ohos_build_type\" \"$tee_enable\""
command += " \"$device_company\" \"$product_path\" \"$outdir\" \"$ohos_version\" \"$sysroot_path\" \"$arch_cflags\""
command += " \"$device_path\" \"$compile_prefix\" \"$liteos_config_file\""
if (liteos_skip_make) {
print("build_ext_component \"$target_name\" skipped:", command)
command = "true"
}
}

78
Kconfig
View File

@@ -26,27 +26,64 @@
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#
# For a description of the syntax of this configuration file,
# see extra/config/Kconfig-language.txt
#
mainmenu "Huawei LiteOS Configuration"
menu "Compiler"
choice
prompt "LiteOS_Compiler_Type"
prompt "Compiler type"
default COMPILER_CLANG_LLVM
help
Enable arm-himix100 or aarch64-himix100 or compiler.
Choose compiler type.
config COMPILER_HIMIX_32
bool "arm-linux-ohoseabi"
config COMPILER_GCC
bool "GCC"
config CROSS_COMPILE
string "GCC cross-compile toolchain prefix"
depends on COMPILER_GCC
default "arm-linux-ohoseabi-" if ARCH_ARM_AARCH32
config COMPILER_CLANG_LLVM
bool "clang-llvm"
bool "Clang"
config LLVM_TARGET
string "Clang LLVM target"
depends on COMPILER_CLANG_LLVM
default "arm-liteos" if ARCH_ARM_AARCH32
endchoice
config COMPILE_DEBUG
bool "Enable debug options"
default n
help
Answer Y to add -g option in compile command.
config COMPILE_OPTIMIZE
bool "Enable code optimization options"
default y
help
Answer Y to add optimization options for efficient code.
The final binary size will be smaller and execute faster.
But the debugging experience may be worst somehow.
config COMPILE_OPTIMIZE_SIZE
bool "Enable code size optimization options" if COMPILE_OPTIMIZE
default y
help
Answer Y to add optimization options for small code size.
The final binary size will be smaller.
But the compile time may be a bit longer.
config COMPILE_LTO
bool "Enable link time optimization (LTO)" if COMPILE_OPTIMIZE_SIZE
default y
help
Answer Y to add lto options for more smaller code size.
The final binary size will be smaller.
But the compile time may be much longer.
endmenu
menu "Platform"
@@ -123,11 +160,11 @@ source "net/Kconfig"
######################## config options of debug ########################
menu "Debug"
config COMPILE_DEBUG
bool "Enable GCC -g Option"
config GDB
bool "Enable gdb functions"
default n
help
Answer Y to add -g option in gcc command. But the LiteOS size will be much larger.
Answer Y to enable gdb functions.
config PLATFORM_ADAPT
bool "Enable Os_adapt"
@@ -164,16 +201,10 @@ config ENABLE_MAGICKEY
config THUMB
bool "Enable Thumb"
default n
select INTERWORK_THUMB
depends on ARCH_ARM
help
Answer Y to build thumb version. This will make LiteOS smaller.
config INTERWORK_THUMB
bool "Enable interwork Thumb" if THUMB
default n
help
Answer Y to enable interwork thumb.
config PLATFORM_DVFS
bool "Enable Dvfs"
default n
@@ -193,8 +224,8 @@ config DEBUG_VERSION
default n
help
If you do not select this option that means you enable a release version for LiteOS.
It also means you do not want to use debug modules, like shell,telnet,tftp,
,nfs,ramfs proc and memory check.
It also means you do not want to use debug modules, like shell,telnet,tftp,nfs and
memory check, etc.
If you select this option that means you enable a debug version for LiteOS.
That means you want a opposite behaviour compared to release version.
@@ -303,12 +334,13 @@ source "bsd/dev/usb/Kconfig"
source "../../drivers/adapter/khdf/liteos/Kconfig"
# Device driver Kconfig import
osource "$(DEVICE_PATH)/drivers/Kconfig"
source "$(DEVICE_PATH)/drivers/Kconfig"
source "drivers/char/mem/Kconfig"
source "drivers/char/quickstart/Kconfig"
source "drivers/char/random/Kconfig"
source "drivers/char/video/Kconfig"
source "drivers/char/trace/Kconfig"
source "../../drivers/liteos/tzdriver/Kconfig"
source "../../drivers/liteos/hievent/Kconfig"

125
Makefile
View File

@@ -27,52 +27,28 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
LITEOSTOPDIR := $(realpath $(dir $(firstword $(MAKEFILE_LIST))))
LITEOSTHIRDPARTY := $(LITEOSTOPDIR)/../../third_party
LITEOSTOPDIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
export LITEOSTOPDIR
export LITEOSTHIRDPARTY
APPS = apps
ROOTFS = rootfs
LITEOS_TARGET = liteos
LITEOS_LIBS_TARGET = libs
KCONFIG_CMDS := $(notdir $(wildcard $(dir $(shell which menuconfig))*config))
# by the following eval, we would got some variables like these:
# ohos_root_path=/xx
# ohos_board=hispark_taurus
# ohos_kernel=liteos_a
# ohos_product=ipcamera_hispark_taurus
# ohos_product_path=/xx/vendor/hisilicon/hispark_taurus
# ohos_device_path=/xx/device/hisilicon/hispark_taurus/sdk_liteos
ohos_kernel ?= liteos_a
$(foreach line,$(shell hb env | sed 's/\[OHOS INFO\]/ohos/g;s/ /_/g;s/:_/=/g' || true),$(eval $(line)))
ifneq ($(ohos_kernel),liteos_a)
$(error The selected product ($(ohos_product)) is not a liteos_a kernel type product)
endif
export CONFIG_=LOSCFG_
export srctree=$(LITEOSTOPDIR)
SYSROOT_PATH ?= $(LITEOSTOPDIR)/../../prebuilts/lite/sysroot
export SYSROOT_PATH
LITEOS_MENUCONFIG_H ?= $(LITEOSTOPDIR)/config.h
export LITEOS_MENUCONFIG_H
CONFIG_FILE ?= $(LITEOSTOPDIR)/.config
export CONFIG_FILE
ifeq ($(PRODUCT_PATH),)
PRODUCT_PATH:=$(ohos_product_path)
endif
export PRODUCT_PATH
ifeq ($(DEVICE_PATH),)
DEVICE_PATH:=$(ohos_device_path)
endif
export DEVICE_PATH
ifeq ($(TEE:1=y),y)
tee = _tee
@@ -84,9 +60,24 @@ CONFIG ?= $(PRODUCT_PATH)/kernel_configs/debug$(tee).config
endif
KCONFIG_CONFIG ?= $(CONFIG)
export KCONFIG_CONFIG
SYSROOT_PATH ?= $(OUT)/sysroot
LITEOS_MENUCONFIG_H ?= $(LITEOSTOPDIR)/config.h
LITEOS_CONFIG_FILE ?= $(LITEOSTOPDIR)/.config
-include $(LITEOSTOPDIR)/tools/build/config.mk
# export los_config.mk related environment variables
export LITEOS_MENUCONFIG_H
export LITEOS_CONFIG_FILE
# export subdir Makefile related environment variables
export SYSROOT_PATH
export PRODUCT_PATH
export DEVICE_PATH
# export kconfig related environment variables
export CONFIG_=LOSCFG_
export srctree=$(LITEOSTOPDIR)
include $(LITEOSTOPDIR)/config.mk
ifeq ($(LOSCFG_STORAGE_SPINOR), y)
FSTYPE = jffs2
@@ -102,10 +93,8 @@ FSTYPE = jffs2
endif
ROOTFS_DIR = $(OUT)/rootfs
ROOTFS_ZIP = $(OUT)/rootfs.zip
VERSION =
define HELP =
-------------------------------------------------------
Usage: make [TARGET]... [PARAMETER=VALUE]...
Targets:
@@ -113,19 +102,19 @@ Targets:
clean: clean compiled objects
cleanall: clean all build outputs
all: make liteos kernel image and rootfs image (Default target)
rootfs: make a original rootfs image
$(APPS): build all apps
$(ROOTFS): make a original rootfs image
$(LITEOS_LIBS_TARGET): compile all kernel modules (libraries)
$(LITEOS_TARGET): make liteos kernel image
update_config: update product kernel config (use menuconfig)
test: make the testsuits_app and put it into the rootfs dir
test_apps: make a rootfs img with the testsuits_app in it
xxconfig: invoke xxconfig command of kconfiglib (xxconfig is one of $(KCONFIG_CMDS))
Parameters:
FSTYPE: value should be one of (jffs2 vfat yaffs2)
TEE: boolean value(1 or y for true), enable tee
RELEASE: boolean value(1 or y for true), build release version
CONFIG: kernel config file to be use
-------------------------------------------------------
args: arguments for xxconfig command
endef
export HELP
@@ -135,34 +124,39 @@ help:
$(HIDE)echo "$$HELP"
sysroot:
ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
ifeq ($(wildcard $(SYSROOT_PATH)/usr/include/$(LLVM_TARGET)/),)
$(HIDE)$(MAKE) -C $(SYSROOT_PATH)/build TARGETS=liteos_a_user
endif
$(HIDE)echo "sysroot:" $(abspath $(SYSROOT_PATH))
ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
ifeq ($(origin SYSROOT_PATH),file)
$(HIDE)mkdir -p $(SYSROOT_PATH)/build && cd $(SYSROOT_PATH)/build && \
ln -snf $(LITEOSTOPDIR)/../../prebuilts/lite/sysroot/build/Makefile && \
$(MAKE) TARGETS=liteos_a_user \
ARCH=$(ARCH) \
TARGET=$(LOSCFG_LLVM_TARGET) \
ARCH_CFLAGS="$(LITEOS_CORE_COPTS) -w" \
TOPDIR="$(LITEOSTOPDIR)/../.." \
SYSROOTDIR="$(SYSROOT_PATH)" \
CLANG="$(LITEOS_COMPILER_PATH)clang" \
BUILD_ALL_MULTILIB=false \
BUILD_DEBUG=$(if $(patsubst y,,$(or $(RELEASE:1=y),n)),true,false)
endif
endif
KCONFIG_CMDS := $(notdir $(wildcard $(dir $(shell which menuconfig))*config))
$(KCONFIG_CMDS):
$(filter-out menuconfig,$(KCONFIG_CMDS)):
$(HIDE)$@ $(args)
$(LITEOS_MENUCONFIG_H) $(CONFIG_FILE): $(KCONFIG_CONFIG)
$(HIDE)genconfig --config-out $(CONFIG_FILE) --header-path $(LITEOS_MENUCONFIG_H) $(args)
$(LITEOS_CONFIG_FILE): $(KCONFIG_CONFIG)
$(HIDE)env KCONFIG_CONFIG=$< genconfig --config-out $@ --header-path $(LITEOS_MENUCONFIG_H)
update_config:
$(HIDE)test -f "$(CONFIG)" && cp -v "$(CONFIG)" .config && menuconfig && savedefconfig --out "$(CONFIG)"
update_config menuconfig:
$(HIDE)test -f "$(CONFIG)" && cp -v "$(CONFIG)" .config && menuconfig $(args) && savedefconfig --out "$(CONFIG)"
prepare: $(LITEOS_MENUCONFIG_H)
$(HIDE)mkdir -p $(OUT)/musl $(OUT)/lib $(BUILD)
$(LITEOS_LIBS_TARGET): prepare
$(HIDE)touch $(LOSCFG_ENTRY_SRC)
$(HIDE)for dir in $(LITEOS_SUBDIRS); do $(MAKE) -C $$dir all || exit 1; done
$(LITEOS_LIBS_TARGET): sysroot
$(HIDE)for dir in $(LIB_SUBDIRS); do $(MAKE) -C $$dir all || exit 1; done
$(LITEOS_TARGET): $(OUT)/$(LITEOS_TARGET)
$(LITEOS_TARGET): $(OUT)/$(LITEOS_TARGET).map
#$(LITEOS_TARGET): $(OUT)/$(LITEOS_TARGET).objsize
$(LITEOS_TARGET): $(LITEOS_TARGET_DIR)/$(LITEOS_TARGET).bin
$(LITEOS_TARGET): $(OUT)/$(LITEOS_TARGET).bin
$(LITEOS_TARGET): $(OUT)/$(LITEOS_TARGET).sym.sorted
$(LITEOS_TARGET): $(OUT)/$(LITEOS_TARGET).asm
#$(LITEOS_TARGET): $(OUT)/$(LITEOS_TARGET).size
@@ -172,7 +166,7 @@ $(OUT)/$(LITEOS_TARGET): $(LITEOS_LIBS_TARGET)
$(OUT)/$(LITEOS_TARGET).map: $(OUT)/$(LITEOS_TARGET)
$(OUT)/$(LITEOS_TARGET).objsize: $(LITEOS_LIBS_TARGET)
$(SIZE) -t --common $(OUT)/lib/*.a >$@
$(LITEOS_TARGET_DIR)/$(LITEOS_TARGET).bin: $(OUT)/$(LITEOS_TARGET)
$(OUT)/$(LITEOS_TARGET).bin: $(OUT)/$(LITEOS_TARGET)
$(OBJCOPY) -O binary $< $@
$(OUT)/$(LITEOS_TARGET).sym.sorted: $(OUT)/$(LITEOS_TARGET)
$(OBJDUMP) -t $< |sort >$@
@@ -181,35 +175,36 @@ $(OUT)/$(LITEOS_TARGET).asm: $(OUT)/$(LITEOS_TARGET)
$(OUT)/$(LITEOS_TARGET).size: $(OUT)/$(LITEOS_TARGET)
$(NM) -S --size-sort $< >$@
$(APPS): prepare
$(APPS): sysroot
$(HIDE)$(MAKE) -C apps all
$(ROOTFS): $(APPS)
$(HIDE)mkdir -p $(OUT)/musl
ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
$(HIDE)cp -fp $$($(CC) --target=$(LLVM_TARGET) --sysroot=$(SYSROOT_PATH) $(LITEOS_CFLAGS) -print-file-name=libc.so) $(OUT)/musl
$(HIDE)cp -fp $$($(GPP) --target=$(LLVM_TARGET) --sysroot=$(SYSROOT_PATH) $(LITEOS_CXXFLAGS) -print-file-name=libc++.so) $(OUT)/musl
$(HIDE)cp -fp $$($(CC) $(LITEOS_CFLAGS) -print-file-name=libc.so) $(OUT)/musl
$(HIDE)cp -fp $$($(GPP) $(LITEOS_CXXFLAGS) -print-file-name=libc++.so) $(OUT)/musl
else
$(HIDE)cp -fp $$($(CC) $(LITEOS_CFLAGS) -print-file-name=libc.so) $(OUT)/musl
$(HIDE)cp -fp $$($(CC) $(LITEOS_CFLAGS) -print-file-name=libgcc_s.so.1) $(OUT)/musl
$(HIDE)cp -fp $$($(GPP) $(LITEOS_CXXFLAGS) -print-file-name=libstdc++.so.6) $(OUT)/musl
endif
$(STRIP) $(OUT)/musl/*
$(HIDE)$(LITEOSTOPDIR)/tools/scripts/make_rootfs/rootfsdir.sh $(OUT) $(ROOTFS_DIR) $(LITEOS_TARGET_DIR)
$(HIDE)$(LITEOS_SCRIPTPATH)/make_rootfs/rootfsdir.sh $(OUT) $(ROOTFS_DIR)
$(HIDE)shopt -s nullglob && $(STRIP) $(ROOTFS_DIR)/bin/* $(ROOTFS_DIR)/lib/*
ifneq ($(VERSION),)
$(HIDE)$(LITEOSTOPDIR)/tools/scripts/make_rootfs/releaseinfo.sh "$(VERSION)" $(ROOTFS_DIR) $(LITEOS_TARGET_DIR)
$(HIDE)$(LITEOS_SCRIPTPATH)/make_rootfs/releaseinfo.sh "$(VERSION)" $(ROOTFS_DIR)
endif
$(HIDE)$(LITEOSTOPDIR)/tools/scripts/make_rootfs/rootfsimg.sh $(ROOTFS_DIR) $(FSTYPE)
$(HIDE)$(LITEOS_SCRIPTPATH)/make_rootfs/rootfsimg.sh $(ROOTFS_DIR) $(FSTYPE)
$(HIDE)cd $(ROOTFS_DIR)/.. && zip -r $(ROOTFS_ZIP) $(ROOTFS)
clean:
$(HIDE)for dir in $(LITEOS_SUBDIRS); do $(MAKE) -C $$dir clean || exit 1; done
$(HIDE)$(MAKE) -C apps clean
$(HIDE)$(RM) $(LITEOS_MENUCONFIG_H) $(CONFIG_FILE)
$(HIDE)if [ -d $(SYSROOT_PATH)/build ]; then $(MAKE) -C $(SYSROOT_PATH)/build clean; fi
$(HIDE)for dir in $(LIB_SUBDIRS) apps; do $(MAKE) -C $$dir clean || exit 1; done
$(HIDE)$(RM) $(LITEOS_MENUCONFIG_H)
$(HIDE)echo "clean $(LOSCFG_PLATFORM) finish"
cleanall: clean
$(HIDE)$(RM) $(LITEOSTOPDIR)/out
$(HIDE)$(RM) $(LITEOSTOPDIR)/out $(LITEOS_CONFIG_FILE)
$(HIDE)echo "clean all done"
.PHONY: all clean cleanall prepare sysroot help update_config
.PHONY: $(LITEOS_TARGET) $(ROOTFS) $(APPS) $(KCONFIG_CMDS) $(LITEOS_LIBS_TARGET)
.PHONY: all clean cleanall sysroot help update_config
.PHONY: $(LITEOS_TARGET) $(ROOTFS) $(APPS) $(KCONFIG_CMDS) $(LITEOS_LIBS_TARGET) $(KCONFIG_CONFIG)

View File

@@ -1,61 +0,0 @@
- liteos_m易用性
- [ ] liteos_m开发者手册
- [ ] 低功耗框架及实现(含投票机制)
- [ ] dump增强配套解析工具
- [ ] 全内存dump配套解析工具
- [ ] 实现完整L0 OHOS的qemu仿真
- [ ] Shell + AT
- liteos_m能力增强
- [ ] liteos_m支持elf动态加载
- [ ] 基于MPU/PMP的多任务简化隔离
- [ ] 基于MPU/PMP的多BIN隔离及灌段隔离
- [ ] 扩展支持中断嵌套
- [ ] 支持arm9架构
- [ ] 支持xtensa架构
- 文件系统增强
- [ ] 提供一种好用且开源的NandFlash文件系统
- [ ] 面向fat32、jffs2持续性能优化做到极致
- [ ] fat32支持fast seek现有fast seek限制文件扩展需要改造
- [ ] 支持软链接
- [ ] 头文件引用关系整理
- [ ] 接口层去nuttx
- [ ] 文件系统去大锁
- liteos_a支持三方芯片易移植性
- [ ] 启动框架重构
- [ ] musl库归一化
- [ ] 去C库预编译
- [ ] 宏配置依赖关系整理
- [ ] 典型商用配置场景整理并导入门禁1V1映射去缺页去隔离单进程等等
- [ ] 编译框架整合到gn
- [ ] 实现基于python的kconfig可视化配置
- liteos_a易用性
- [ ] 实现L1 LiteOS-A及上层鸿蒙组件的qemu仿真
- [ ] liteos_a开发者手册
- [ ] mksh移植
- [ ] toybox命令集
- [ ] trace、backtrace、dump解析工具等
- procfs适配
- [ ] ifconfig、fd、free等
- liteos_a能力增强
- [ ] 单链表整改SMP多核性能
- [ ] 快启
- [ ] 典型高频函数C库性能优化
- [ ] rwlock
- liteos_a三方库移植
- [ ] libuv、dlna、benchmark、iperf、perf、tcpdump 等等
- C库能力补全
- [ ] epoll实现
- 测试验证
- [ ] syzkaller、difuze等
- 探索性课题
- [ ] 基于rust重写liteos_m基础内核
- [ ] 用户态驱动(对比业界并增强)
- [ ] 用户态文件系统

View File

@@ -47,4 +47,8 @@ group("apps") {
if (defined(LOSCFG_NET_LWIP_SACK_TFTP)) {
deps += [ "tftp" ]
}
if (defined(LOSCFG_DRIVERS_TRACE)) {
deps += [ "trace" ]
}
}

View File

@@ -27,26 +27,21 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
LITEOSTOPDIR := $(shell pwd)/../
APPSTOPDIR := $(shell pwd)
LITEOSTOPDIR ?= $(APPSTOPDIR)/..
export LITEOSTOPDIR
export APPSTOPDIR
include $(LITEOSTOPDIR)/.config
include ./config.mk
include ./module.mk
include $(APPSTOPDIR)/config.mk
HIDE := @
APPS := app
all: $(APPS)
# Make
$(APPS):
all:
ifneq ($(APP_SUBDIRS), )
$(HIDE) for dir in $(APP_SUBDIRS); do $(MAKE) -C $$dir || exit 1; done
$(HIDE) for dir in $(APP_SUBDIRS); do $(MAKE) -C $$dir all || exit 1; done
endif
clean:
ifneq ($(APP_SUBDIRS), )
$(HIDE) for dir in $(APP_SUBDIRS); do $(MAKE) -C $$dir clean; done
$(HIDE) for dir in $(APP_SUBDIRS); do $(MAKE) -C $$dir clean || exit 1; done
endif
.PHONY: all $(APPS) clean
.PHONY: all clean

114
apps/app.mk Normal file
View File

@@ -0,0 +1,114 @@
# Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
# Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of
# conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
# of conditions and the following disclaimer in the documentation and/or other materials
# provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be used
# to endorse or promote products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
OBJOUT := $(BUILD)$(dir $(subst $(LITEOSTOPDIR),,$(shell pwd)))$(APP_NAME)
APP := $(OUT)/bin/$(APP_NAME)
# create a separate list of objects per source type
LOCAL_CSRCS := $(filter %.c,$(LOCAL_SRCS))
LOCAL_CPPSRCS := $(filter %.cpp,$(LOCAL_SRCS))
LOCAL_ASMSRCS := $(filter %.S,$(LOCAL_SRCS))
LOCAL_ASMSRCS2 := $(filter %.s,$(LOCAL_SRCS))
LOCAL_CCSRCS := $(filter %.cc,$(LOCAL_SRCS))
LOCAL_COBJS := $(patsubst %.c,$(OBJOUT)/%.o,$(LOCAL_CSRCS))
LOCAL_CPPOBJS := $(patsubst %.cpp,$(OBJOUT)/%.o,$(LOCAL_CPPSRCS))
LOCAL_ASMOBJS := $(patsubst %.S,$(OBJOUT)/%.o,$(LOCAL_ASMSRCS))
LOCAL_ASMOBJS2 := $(patsubst %.s,$(OBJOUT)/%.o,$(LOCAL_ASMSRCS2))
LOCAL_CCOBJS := $(patsubst %.cc,$(OBJOUT)/%.o,$(LOCAL_CCSRCS))
LOCAL_OBJS := $(LOCAL_COBJS) $(LOCAL_CPPOBJS) $(LOCAL_ASMOBJS) $(LOCAL_ASMOBJS2) $(LOCAL_CCOBJS)
LOCAL_CGCH := $(patsubst %.h,%.h.gch,$(LOCAL_CHS))
LOCAL_CPPGCH := $(patsubst %.h,%.h.gch,$(LOCAL_CPPHS))
all : $(APP)
define ECHO =
ifeq ($$(HIDE),@)
_$(1) := $($(1))
$(1) = echo " $(1)" $$(patsubst $$(OUT)/%,%,$$@) && $$(_$(1))
endif
endef
$(foreach cmd,CC GPP AS,$(eval $(call ECHO,$(cmd))))
LOCAL_FLAGS += -MD -MP
-include $(LOCAL_OBJS:%.o=%.d)
$(LOCAL_COBJS): $(OBJOUT)/%.o: %.c
$(HIDE)$(OBJ_MKDIR)
$(HIDE)$(CC) $(CFLAGS) $(LOCAL_FLAGS) $(LOCAL_CFLAGS) -c $< -o $@
$(LOCAL_CPPOBJS): $(OBJOUT)/%.o: %.cpp
$(HIDE)$(OBJ_MKDIR)
$(HIDE)$(GPP) $(CXXFLAGS) $(LOCAL_FLAGS) $(LOCAL_CPPFLAGS) -c $< -o $@
$(LOCAL_ASMOBJS): $(OBJOUT)/%.o: %.S
$(HIDE)$(OBJ_MKDIR)
$(HIDE)$(CC) $(CFLAGS) $(LOCAL_FLAGS) $(LOCAL_ASFLAGS) -c $< -o $@
$(LOCAL_ASMOBJS2): $(OBJOUT)/%.o: %.s
$(HIDE)$(OBJ_MKDIR)
$(HIDE)$(AS) $(ASFLAGS) $(LOCAL_FLAGS) $(LOCAL_ASFLAGS) -c $< -o $@
$(LOCAL_CCOBJS): $(OBJOUT)/%.o: %.cc
$(HIDE)$(OBJ_MKDIR)
$(HIDE)$(GPP) $(CXXFLAGS) $(LOCAL_FLAGS) $(LOCAL_CPPFLAGS) -c $< -o $@
$(LOCAL_CGCH): %.h.gch : %.h
$(HIDE)$(CC) $(CFLAGS) $(LOCAL_FLAGS) $(LOCAL_CFLAGS) $> $^
$(LOCAL_CPPGCH): %.h.gch : %.h
$(HIDE)$(GPP) $(CXXFLAGS) $(LOCAL_FLAGS) $(LOCAL_CPPFLAGS) -x c++-header $> $^
LOCAL_GCH := $(LOCAL_CGCH) $(LOCAL_CPPGCH)
$(LOCAL_OBJS): $(LOCAL_GCH)
$(APP): $(LOCAL_OBJS)
$(HIDE)$(OBJ_MKDIR)
$(HIDE)$(GPP) $(LDFLAGS) -o $@ $^
clean:
$(HIDE)$(RM) $(APP) $(OBJOUT) $(LOCAL_GCH) *.bak *~
.PHONY: all clean
# clear some variables we set here
LOCAL_CSRCS :=
LOCAL_CPPSRCS :=
LOCAL_ASMSRCS :=
LOCAL_COBJS :=
LOCAL_CPPOBJS :=
LOCAL_ASMOBJS :=
LOCAL_ASMOBJS2 :=
# LOCAL_OBJS is passed back
#LOCAL_OBJS :=

View File

@@ -27,30 +27,18 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# common dir config
include $(LITEOSTOPDIR)/config.mk
# output dir config
OBJOUT := $(APPSTOPDIR)/out
APPSOUT := $(OBJOUT)/apps
LIBSOUT := $(OBJOUT)/libs
IMGOUT := $(OUT)
# common flags config
BASE_OPTS := -ffunction-sections -fdata-sections -fno-omit-frame-pointer -fno-common -fno-strict-aliasing -D_GNU_SOURCE \
$(LITEOS_SSP) $(LITEOS_CORE_COPTS) $(WARNING_AS_ERROR) $(LLVM_EXTRA_OPTS) $(LITEOS_GCOV_OPTS)
BASE_OPTS := -D_FORTIFY_SOURCE=2 -D_XOPEN_SOURCE=700 $(LITEOS_GCOV_OPTS)
CFLAGS := -std=c99 -fno-exceptions $(BASE_OPTS) $(LITEOS_COPTS_OPTMIZE)
CXXFLAGS := -std=c++11 -fexceptions -fpermissive -frtti $(BASE_OPTS) $(LITEOS_COPTS_OPTMIZE)
LDCFLAGS := -lc
ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
LLVM_SYSROOT := --sysroot=$(SYSROOT_PATH) $(ARCH_CFLAGS)
LDCXXFLGS := -lc++ -lc++abi -lc
else
BASE_OPTS += -Wl,-z,relro,-z,now
LDCXXFLGS := -lstdc++ -lsupc++ -lc
endif
COMMON_INCLUDE := -I $(LITEOSTHIRDPARTY)/bounds_checking_function/include
ASFLAGS :=
CFLAGS := $(LITEOS_COPTS) $(BASE_OPTS) -fPIE
CXXFLAGS := $(LITEOS_CXXOPTS) $(BASE_OPTS) -fPIE
LDFLAGS := $(LITEOS_CORE_COPTS) -pie -Wl,-z,relro,-z,now -O2
CFLAGS := $(filter-out -fno-pic -fno-builtin -nostdinc -nostdlib,$(CFLAGS))
CXXFLAGS := $(filter-out -fno-pic -fno-builtin -nostdinc -nostdlib -nostdinc++,$(CXXFLAGS))
# alias variable config
HIDE := @
@@ -58,3 +46,35 @@ MAKE := make
RM := rm -rf
CP := cp -rf
MV := mv -f
APP := $(APPSTOPDIR)/app.mk
##build modules config##
APP_SUBDIRS :=
ifeq ($(LOSCFG_SHELL), y)
APP_SUBDIRS += shell
APP_SUBDIRS += mksh
APP_SUBDIRS += toybox
endif
ifeq ($(LOSCFG_USER_INIT_DEBUG), y)
APP_SUBDIRS += init
endif
ifeq ($(LOSCFG_NET_LWIP_SACK_TFTP), y)
APP_SUBDIRS += tftp
endif
ifeq ($(LOSCFG_DRIVERS_TRACE), y)
APP_SUBDIRS += trace
endif
# clear all local variables
LOCAL_FLAGS :=
LOCAL_CFLAGS :=
LOCAL_CPPFLAGS :=
LOCAL_ASFLAGS :=
LOCAL_SRCS :=
LOCAL_CHS :=
LOCAL_CPPHS :=

View File

@@ -32,22 +32,8 @@ import("//kernel/liteos_a/liteos.gni")
executable("init") {
sources = [ "src/init.c" ]
cflags = [ "-fPIE" ]
if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
cflags += [
"-Wno-shift-op-parentheses",
"-Wno-bitwise-op-parentheses",
"-Wnonnull",
]
}
ldflags = [
"-pie",
"-s",
]
if (defined(LOSCFG_QUICK_START)) {
ldflags += [ "--static" ]
ldflags = [ "--static" ]
defines = [ "LOSCFG_QUICK_START" ]
}
}

View File

@@ -27,43 +27,15 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
INIT_DIR := $(dir $(shell pwd))/init/
include $(APPSTOPDIR)/config.mk
ifeq ($(APPSTOPDIR), )
APPSTOPDIR := $(shell pwd)/../
LITEOSTOPDIR = $(APPSTOPDIR)/../
endif
include $(INIT_DIR)/../config.mk
APP_NAME := $(notdir $(shell pwd))
APPS_OUT := $(OUT)/bin
LOCAL_SRCS := src/init.c
LOCAL_OBJ := src/init.o
ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
LOCAL_FLAGS += -Wno-shift-op-parentheses -Wno-bitwise-op-parentheses -Wnonnull $(LLVM_SYSROOT)
LDCFLAGS += $(LLVM_EXTRA_LD_OPTS) $(LLVM_SYSROOT)
endif
ifeq ($(LOSCFG_QUICK_START), y)
LDCFLAGS += --static
LDFLAGS += --static
CFLAGS += -DLOSCFG_QUICK_START
endif
INITNAME := init
all: $(INITNAME)
$(LOCAL_OBJ): %.o : %.c
$(HIDE) $(CC) $(CFLAGS) $(LOCAL_FLAGS) -fPIE $(LOCAL_INCLUDE) -c $< -o $@
$(INITNAME):$(LOCAL_OBJ)
$(HIDE) $(CC) -pie -s $(LDPATH) $(BASE_OPTS) -o $(INITNAME) $^ $(LDCFLAGS)
$(HIDE) mkdir -p $(APPS_OUT)
$(HIDE) $(MV) $(INITNAME) $(APPS_OUT)
$(HIDE) $(RM) $(LOCAL_OBJ)
clean:
$(HIDE) $(RM) $(LOCAL_OBJ)
$(HIDE) $(RM) $(INITNAME)
.PHONY: all $(INITNAME) clean
include $(APP)

View File

@@ -48,7 +48,6 @@ build_ext_component("build_mksh") {
"-flto",
"-fdata-sections",
"-ffunction-sections",
"-Oz",
"-fstack-protector-strong",
"-D_FORTIFY_SOURCE=2",
"-DMKSH_DISABLE_TTY_WARNING",
@@ -62,6 +61,11 @@ build_ext_component("build_mksh") {
"-DMKSH_NO_INITCOMS",
"-DADAPT_FOR_LITEOS_A",
]
if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
cflags += [ "-Oz" ]
} else {
cflags += [ "-O2" ]
}
cflags = string_join(" ", cflags)
extra_flags = string_join(" ", target_arch_cflags)

View File

@@ -27,52 +27,30 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
MKSH := mksh
include $(APPSTOPDIR)/config.mk
MKSH_DIR := $(shell pwd)/
LITEOSTOPDIR = $(MKSH_DIR)/../../
include $(MKSH_DIR)/../config.mk
BUILD_DIR := $(OUT)/mksh_build
BUILD_LOG := $(BUILD_DIR)/build.log
APPS_OUT := $(OUT)/bin
ETC_OUT := $(OUT)/etc
BUILD_DIR := $(MKSH_DIR)/build
BUILD_LOG := $(MKSH_DIR)/build.log
TARGET_OS := OpenHarmony
CFLAGS += -DMKSH_DISABLE_TTY_WARNING -DMKSH_SMALL=1 -DMKSH_ASSUME_UTF8=1 -DMKSH_SMALL_BUT_FAST=0 -DMKSH_S_NOVI=1 -DHAVE_CAN_FSTACKPROTECTORSTRONG=1
CFLAGS += -DMKSH_LESS_CMDLINE_EDITING -DMKSH_LESS_BUILDINS -DMKSH_NO_INITCOMS -DADAPT_FOR_LITEOS_A
CFLAGS += -Wno-error
LDFLAGS += -Wl,--gc-sections
LOCAL_CFLAGS := -flto -fdata-sections -ffunction-sections -fstack-protector-strong -D_FORTIFY_SOURCE=2
LOCAL_CFLAGS += -DMKSH_DISABLE_TTY_WARNING -DMKSH_SMALL=1 -DMKSH_ASSUME_UTF8=1 -DMKSH_SMALL_BUT_FAST=0 -DMKSH_S_NOVI=1 -DHAVE_CAN_FSTACKPROTECTORSTRONG=1
LOCAL_CFLAGS += -DMKSH_LESS_CMDLINE_EDITING -DMKSH_LESS_BUILDINS -DMKSH_NO_INITCOMS -DADAPT_FOR_LITEOS_A
LOCAL_LDFLAGS := -Wl,--gc-sections -flto -O2
ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
LOCAL_CFLAGS += -Oz --target=$(LLVM_TARGET) $(LLVM_SYSROOT)
else
LOCAL_CFLAGS += -O2
endif
all:$(MKSH)
$(MKSH):
all:
ifneq ($(wildcard $(BUILD_DIR)/Rebuild.sh),)
$(HIDE)echo "not clean, rebuilding now"
$(HIDE)chmod +x $(BUILD_DIR)/Rebuild.sh
$(HIDE)cd $(BUILD_DIR) && ./Rebuild.sh > $(BUILD_LOG) 2>&1
$(HIDE)cd $(BUILD_DIR) && sh ./Rebuild.sh > $(BUILD_LOG) 2>&1
else
$(HIDE)mkdir -p $(BUILD_DIR)
$(HIDE)$(CP) $(LITEOSTHIRDPARTY)/$(MKSH)/. $(BUILD_DIR)
$(HIDE)chmod +x $(BUILD_DIR)/Build.sh
$(HIDE)cd $(BUILD_DIR) && CC=$(CC) TARGET_OS=$(TARGET_OS) CFLAGS="$(LOCAL_CFLAGS)" LDFLAGS="$(LOCAL_LDFLAGS)" ./Build.sh -r > $(BUILD_LOG) 2>&1
$(HIDE)$(CP) $(LITEOSTHIRDPARTY)/mksh/. $(BUILD_DIR)
$(HIDE)cd $(BUILD_DIR) && CC="$(CC)" TARGET_OS=OpenHarmony CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" sh ./Build.sh -r > $(BUILD_LOG) 2>&1
endif
$(HIDE)$(CP) -rf $(BUILD_DIR)/$(MKSH) .
$(HIDE)$(STRIP) $(MKSH)
$(HIDE)mkdir -p $(APPS_OUT)
$(HIDE)$(CP) $(MKSH) $(APPS_OUT)
$(HIDE)mkdir -p $(ETC_OUT)
$(HIDE)$(CP) -rf $(BUILD_DIR)/.mkshrc $(ETC_OUT)/
$(HIDE)$(RM) $(BUILD_DIR) $(BUILD_LOG)
$(HIDE)mkdir -p $(OUT)/bin/ $(OUT)/etc/
$(HIDE)$(STRIP) $(BUILD_DIR)/mksh -o $(OUT)/bin/mksh
$(HIDE)$(CP) $(BUILD_DIR)/.mkshrc $(OUT)/etc/
clean:
$(HIDE)$(RM) $(MKSH) $(BUILD_DIR) $(BUILD_LOG)
$(HIDE)$(RM) $(BUILD_DIR)
.PHONY: all $(MKSH) clean
.PHONY: all clean

View File

@@ -41,18 +41,4 @@ executable("shell") {
deps = [ "$LITEOSTHIRDPARTY/bounds_checking_function:libsec_static" ]
include_dirs = [ "include" ]
cflags = [ "-fPIE" ]
if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
cflags += [
"-Wno-shift-op-parentheses",
"-Wno-bitwise-op-parentheses",
]
}
ldflags = [
"-pie",
"-s",
]
}

View File

@@ -27,52 +27,19 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
SHELL_DIR := $(dir $(shell pwd))/shell/
include $(APPSTOPDIR)/config.mk
ifeq ($(APPSTOPDIR), )
APPSTOPDIR := $(shell pwd)/../
LITEOSTOPDIR = $(APPSTOPDIR)/../
endif
include $(SHELL_DIR)/../config.mk
APPS_OUT := $(OUT)/bin
APP_NAME := $(notdir $(shell pwd))
SECUREC_INCLUDE := $(LITEOSTHIRDPARTY)/bounds_checking_function/include
SECUREC_DIR := $(LITEOSTHIRDPARTY)/bounds_checking_function
LOCAL_SRCS = $(wildcard src/main.c)\
$(wildcard src/shcmd.c)\
$(wildcard src/shmsg.c)\
$(wildcard src/shcmdparse.c)\
$(wildcard builtin/cd.c)
LOCAL_SRCS += $(wildcard $(LITEOSTHIRDPARTY)/bounds_checking_function/src/*.c)
LOCAL_OBJ := $(LOCAL_SRCS:.c=.o)
LOCAL_SRCS = $(wildcard src/*.c builtin/*.c)
LOCAL_SRCS += $(wildcard $(SECUREC_DIR)/src/*.c)
LOCAL_INCLUDE := \
-I $(SHELL_DIR)/include/ \
-I $(SECUREC_INCLUDE)\
-I include \
-I $(SECUREC_DIR)/include
LOCAL_FLAGS += $(CFLAGS)
LOCAL_FLAGS += $(LOCAL_INCLUDE)
LDPATH := -L$(SHELL_DIR)/
ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
LOCAL_FLAGS += -Wno-shift-op-parentheses -Wno-bitwise-op-parentheses $(LLVM_SYSROOT)
LDCFLAGS += $(LLVM_EXTRA_LD_OPTS) $(LLVM_SYSROOT)
endif
SHELLNAME := shell
all: $(SHELLNAME)
$(LOCAL_OBJ): %.o : %.c
$(HIDE) $(CC) $(LOCAL_FLAGS) -fPIE $(LOCAL_INCLUDE) -c $< -o $@
$(SHELLNAME): $(LOCAL_OBJ)
$(HIDE) $(CC) -pie -s $(LDPATH) $(BASE_OPTS) -o $(SHELLNAME) $^ $(LDCFLAGS)
$(HIDE) mkdir -p $(APPS_OUT)
$(HIDE) $(MV) $(SHELLNAME) $(APPS_OUT)
$(HIDE) $(RM) $(LOCAL_OBJ)
clean:
$(HIDE) $(RM) $(LOCAL_OBJ)
$(HIDE) $(RM) $(SHELLNAME)
.PHONY: all $(SHELLNAME) clean
include $(APP)

View File

@@ -29,9 +29,7 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include "unistd.h"
#include "shcmd.h"

View File

@@ -43,8 +43,13 @@ extern "C" {
#define SHELL_ENTRY_STACKSIZE 0x1000
#define SHELL_TASK_STACKSIZE 0x3000
#define SHELL_EXEC_COMMAND "exec "
#define SHELL_EXEC_COMMAND_BYTES 5
#define SHELL_EXEC_COMMAND "exec"
#define SHELL_EXEC_COMMAND_BYTES 4
#define CMD_EXEC_COMMAND SHELL_EXEC_COMMAND" "
#define CMD_EXEC_COMMAND_BYTES (SHELL_EXEC_COMMAND_BYTES+1)
#define CMD_EXIT_COMMAND "exit"
#define CMD_EXIT_COMMAND_BYTES 4
#define CMD_EXIT_CODE_BASE_DEC 10
#define CONSOLE_IOC_MAGIC 'c'
#define CONSOLE_CONTROL_REG_USERTASK _IO(CONSOLE_IOC_MAGIC, 7)
@@ -57,6 +62,7 @@ extern "C" {
typedef void (*OutputFunc)(const char *fmt, ...);
extern int ShellTaskInit(ShellCB *shellCB);
extern int ShellEntryInit(ShellCB *shellCB);
extern void ChildExec(const char *cmdName, char *const paramArray[]);
extern void ShellCmdLineParse(char c, OutputFunc outputFunc, ShellCB *shellCB);
extern int ShellNotify(ShellCB *shellCB);

View File

@@ -42,10 +42,10 @@ extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
extern char *OsShellGetWorkingDirtectory();
extern unsigned int OsShellInit();
extern char *OsShellGetWorkingDirtectory(void);
extern unsigned int OsShellInit(void);
extern int OsShellDeinit(ShellCB *shellCB);
extern ShellCB *OsGetShellCb();
extern ShellCB *OsGetShellCb(void);
#ifdef __cplusplus
#if __cplusplus

View File

@@ -29,6 +29,8 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#define _GNU_SOURCE
#include "show.h"
#include "shmsg.h"
#include "shcmd.h"
@@ -95,6 +97,9 @@ static int DoShellExec(char **argv)
int ret = SH_NOK;
char *cmdLine = NULL;
if (strncmp(argv[0], SHELL_EXEC_COMMAND, SHELL_EXEC_COMMAND_BYTES) == 0) {
ChildExec(argv[1], argv + 1);
}
for (i = 0; argv[i]; i++) {
len += strlen(argv[i]);
}
@@ -121,7 +126,7 @@ int main(int argc, char **argv)
int ret = SH_NOK;
ShellCB *shellCB = NULL;
if (!strcmp(argv[0], "shell") && argv[1]) {
if (argc > 1) {
ret = DoShellExec(argv + 1);
return ret;
}

View File

@@ -29,6 +29,8 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#define _GNU_SOURCE
#include "stdlib.h"
#include "stdio.h"
#include "unistd.h"
@@ -42,7 +44,10 @@
#include "shell_pri.h"
#include "shcmd.h"
#define CHAR_CTRL_C '\x03'
#define CHAR_CTRL_DEL '\x7F'
#define VISIABLE_CHAR(ch) ((ch) > 0x1F && (ch) < 0x7F)
char *GetCmdline(ShellCB *shellCB)
{
@@ -200,7 +205,21 @@ void ParseEnterKey(OutputFunc outputFunc, ShellCB *shellCB)
shellCB->shellBuf[shellCB->shellBufOffset] = '\0';
}
NOTIFY:
outputFunc("\n");
shellCB->shellBufOffset = 0;
ShellTaskNotify(shellCB);
}
void ParseCancelKey(OutputFunc outputFunc, ShellCB *shellCB)
{
if ((shellCB == NULL) || (outputFunc == NULL)) {
return;
}
if (shellCB->shellBufOffset <= (SHOW_MAX_LEN - 1)) {
shellCB->shellBuf[0] = CHAR_CTRL_C;
shellCB->shellBuf[1] = '\0';
}
shellCB->shellBufOffset = 0;
ShellTaskNotify(shellCB);
}
@@ -236,7 +255,7 @@ void ParseTabKey(OutputFunc outputFunc, ShellCB *shellCB)
void ParseNormalChar(char ch, OutputFunc outputFunc, ShellCB *shellCB)
{
if ((shellCB == NULL) || (outputFunc == NULL)) {
if ((shellCB == NULL) || (outputFunc == NULL) || !VISIABLE_CHAR(ch)) {
return;
}
@@ -254,7 +273,7 @@ void ShellCmdLineParse(char c, OutputFunc outputFunc, ShellCB *shellCB)
const char ch = c;
int ret;
if ((shellCB->shellBufOffset == 0) && (ch != '\n') && (ch != '\0')) {
if ((shellCB->shellBufOffset == 0) && (ch != '\n') && (ch != CHAR_CTRL_C) && (ch != '\0')) {
(void)memset_s(shellCB->shellBuf, SHOW_MAX_LEN, 0, SHOW_MAX_LEN);
}
@@ -263,8 +282,11 @@ void ShellCmdLineParse(char c, OutputFunc outputFunc, ShellCB *shellCB)
case '\n': /* enter */
ParseEnterKey(outputFunc, shellCB);
break;
case CHAR_CTRL_C: /* ctrl + c */
ParseCancelKey(outputFunc, shellCB);
break;
case '\b': /* backspace */
case 0x7F: /* delete(0x7F) */
case CHAR_CTRL_DEL: /* delete(0x7F) */
ParseDeleteKey(outputFunc, shellCB);
break;
case '\t': /* tab */
@@ -329,40 +351,80 @@ char *GetCmdName(const char *cmdline, unsigned int len)
return cmdName;
}
void ChildExec(const char *cmdName, char *const paramArray[])
{
int ret;
pid_t gid;
ret = setpgrp();
if (ret == -1) {
exit(1);
}
gid = getpgrp();
if (gid < 0) {
printf("get group id failed, pgrpid %d, errno %d\n", gid, errno);
}
ret = tcsetpgrp(STDIN_FILENO, gid);
if (ret != 0) {
printf("tcsetpgrp failed, errno %d\n", errno);
}
ret = execve(cmdName, paramArray, NULL);
if (ret == -1) {
perror("execve");
exit(-1);
}
}
int CheckExit(const char *cmdName, const CmdParsed *cmdParsed)
{
int ret = 0;
if (strlen(cmdName) != CMD_EXIT_COMMAND_BYTES || strncmp(cmdName, CMD_EXIT_COMMAND, CMD_EXIT_COMMAND_BYTES) != 0) {
return 0;
}
if (cmdParsed->paramCnt > 1) {
printf("exit: too many arguments\n");
return -1;
}
if (cmdParsed->paramCnt == 1) {
char *p;
ret = strtol(cmdParsed->paramArray[0], &p, CMD_EXIT_CODE_BASE_DEC);
if (*p != '\0') {
printf("exit: bad number: %s\n", cmdParsed->paramArray[0]);
return -1;
}
}
exit(ret);
}
static void DoCmdExec(const char *cmdName, const char *cmdline, unsigned int len, const CmdParsed *cmdParsed)
{
int ret;
pid_t forkPid;
pid_t gid;
if (strncmp(cmdline, SHELL_EXEC_COMMAND, SHELL_EXEC_COMMAND_BYTES) == 0) {
if (strncmp(cmdline, CMD_EXEC_COMMAND, CMD_EXEC_COMMAND_BYTES) == 0) {
forkPid = fork();
if (forkPid < 0) {
printf("Faild to fork from shell\n");
return;
} else if (forkPid == 0) {
ret = setpgrp();
if (ret == -1) {
exit(1);
}
gid = getpgrp();
if (gid < 0) {
printf("get group id failed, pgrpid %d, errno %d\n", gid, errno);
}
ret = tcsetpgrp(STDIN_FILENO, gid);
ChildExec(cmdParsed->paramArray[0], cmdParsed->paramArray);
} else {
waitpid(forkPid, 0, 0);
ret = tcsetpgrp(STDIN_FILENO, getpid());
if (ret != 0) {
printf("tcsetpgrp failed, errno %d\n", errno);
}
ret = execve((const char *)cmdParsed->paramArray[0], (char * const *)cmdParsed->paramArray, NULL);
if (ret == -1) {
perror("execve");
exit(-1);
}
}
} else {
if (CheckExit(cmdName, cmdParsed) < 0) {
return;
}
(void)syscall(__NR_shellexec, cmdName, cmdline);
}
}
@@ -417,7 +479,7 @@ unsigned int PreHandleCmdline(const char *input, char **output, unsigned int *ou
unsigned int removeLen = strlen("./"); /* "./" needs to be removed if it exists */
unsigned int ret;
char *newCmd = NULL;
char *execCmd = SHELL_EXEC_COMMAND;
char *execCmd = CMD_EXEC_COMMAND;
const char *cmdBuf = input;
unsigned int cmdBufLen = strlen(cmdBuf);
char *shiftStr = (char *)malloc(cmdBufLen + 1);
@@ -520,7 +582,11 @@ static void ShellCmdProcess(ShellCB *shellCB)
if (buf == NULL) {
break;
}
if (buf[0] == CHAR_CTRL_C) {
printf("^C");
buf[0] = '\n';
}
printf("\n");
ExecCmdline(buf);
ShellSaveHistoryCmd(buf, shellCB);
shellCB->cmdMaskKeyLink = shellCB->cmdHistoryKeyLink;

View File

@@ -38,18 +38,4 @@ executable("tftp") {
deps = [ "$LITEOSTHIRDPARTY/bounds_checking_function:libsec_static" ]
include_dirs = [ "include" ]
cflags = [ "-fPIE" ]
if (defined(LOSCFG_COMPILER_CLANG_LLVM)) {
cflags += [
"-Wno-shift-op-parentheses",
"-Wno-bitwise-op-parentheses",
]
}
ldflags = [
"-pie",
"-s",
]
}

View File

@@ -27,51 +27,19 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ROOT_DIR := $(dir $(shell pwd))/tftp/
include $(APPSTOPDIR)/config.mk
ifeq ($(APPSTOPDIR), )
APPSTOPDIR := $(shell pwd)/../
LITEOSTOPDIR = $(APPSTOPDIR)/../
endif
include $(ROOT_DIR)/../config.mk
APPS_OUT := $(OUT)/bin
APP_NAME := $(notdir $(shell pwd))
SECUREC_DIR := $(LITEOSTHIRDPARTY)/bounds_checking_function
LOCAL_SRCS = $(wildcard src/*.c)
LOCAL_SRCS += $(wildcard $(SECUREC_DIR)/src/strncpy_s.c)
LOCAL_SRCS += $(wildcard $(SECUREC_DIR)/src/memcpy_s.c)
LOCAL_SRCS += $(wildcard $(SECUREC_DIR)/src/memset_s.c)
LOCAL_SRCS += $(wildcard $(SECUREC_DIR)/src/strncat_s.c)
LOCAL_OBJ := $(LOCAL_SRCS:.c=.o)
LOCAL_SRCS += $(wildcard $(SECUREC_DIR)/src/*.c)
LOCAL_INCLUDE := \
-I $(ROOT_DIR)/include/ \
-I $(SECUREC_DIR)/include/\
-I include \
-I $(SECUREC_DIR)/include
LOCAL_FLAGS += $(CFLAGS)
LOCAL_FLAGS += $(LOCAL_INCLUDE)
LDPATH := -L$(ROOT_DIR)/
ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
LOCAL_FLAGS += -Wno-shift-op-parentheses -Wno-bitwise-op-parentheses $(LLVM_SYSROOT)
LDCFLAGS += $(LLVM_EXTRA_LD_OPTS) $(LLVM_SYSROOT)
endif
TARGETNAME := tftp
all: $(TARGETNAME)
$(LOCAL_OBJ): %.o : %.c
$(HIDE) $(CC) $(LOCAL_FLAGS) -fPIE $(LOCAL_INCLUDE) -c $< -o $@
$(TARGETNAME): $(LOCAL_OBJ)
$(HIDE) $(CC) -pie -s $(LDPATH) $(BASE_OPTS) -o $(TARGETNAME) $^ $(LDCFLAGS)
$(HIDE) mkdir -p $(APPS_OUT)
$(HIDE) $(MV) $(TARGETNAME) $(APPS_OUT)
$(HIDE) $(RM) $(LOCAL_OBJ)
clean:
$(HIDE) $(RM) $(LOCAL_OBJ)
$(HIDE) $(RM) $(TARGETNAME)
.PHONY: all $(TARGETNAME) clean
include $(APP)

View File

@@ -27,42 +27,27 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
TOYBOX:= toybox
include $(APPSTOPDIR)/config.mk
TOYBOX_DIR := $(shell pwd)
LITEOSTOPDIR = $(TOYBOX_DIR)/../../
include $(TOYBOX_DIR)/../config.mk
BUILD_DIR := $(OUT)/toybox_build
BUILD_LOG := $(BUILD_DIR)/build.log
APPS_OUT := $(OUT)/bin
BUILD_DIR := $(TOYBOX_DIR)/build
BUILD_LOG := $(TOYBOX_DIR)/build.log
OUTNAME := $(TOYBOX)
CFLAGS += -Wno-error
CFLAGS := -D_FORTIFY_SOURCE=2 -fstack-protector-strong
LDFLAGS :=
ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
CFLAGS += --target=$(LLVM_TARGET) $(LLVM_SYSROOT)
LDFLAGS += --target=$(LLVM_TARGET) $(LLVM_SYSROOT)
endif
$(TOYBOX):
all:
ifneq ($(wildcard $(BUILD_DIR)),)
$(HIDE)echo "not clean, rebuilding now";
$(HIDE)echo "not clean, rebuilding now"
else
$(HIDE)mkdir $(BUILD_DIR)
$(HIDE)$(CP) $(LITEOSTHIRDPARTY)/$(TOYBOX)/. $(BUILD_DIR)
$(HIDE)$(CP) -p $(LITEOSTHIRDPARTY)/$(TOYBOX)/porting/liteos_a/. $(BUILD_DIR)
$(HIDE)mkdir -p $(BUILD_DIR)
$(HIDE)$(CP) $(LITEOSTHIRDPARTY)/toybox/. $(BUILD_DIR)
$(HIDE)$(CP) $(LITEOSTHIRDPARTY)/toybox/porting/liteos_a/. $(BUILD_DIR)
$(HIDE)$(CP) liteos_a_custom.config $(BUILD_DIR)/../
endif
$(HIDE)CFLAGS="$(CFLAGS)" CC="$(CC)" OUTNAME="$(OUTNAME)" \
LDFLAGS="$(LDFLAGS)" STRIP="$(STRIP)" \
$(HIDE)unset KCONFIG_CONFIG CROSS_COMPILE && \
env CC="$(CC)" OUTNAME="$(OUT)/bin/toybox" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" STRIP="$(STRIP)" \
make -C $(BUILD_DIR) toybox -j> $(BUILD_LOG) 2>&1
$(HIDE)$(CP) $(BUILD_DIR)/$(TOYBOX) .
$(HIDE)mkdir -p $(APPS_OUT)
$(HIDE)$(CP) $(TOYBOX) $(APPS_OUT)
$(HIDE)$(RM) $(BUILD_DIR) $(BUILD_LOG)
clean:
$(HIDE)$(RM) $(TOYBOX) $(BUILD_DIR) $(BUILD_LOG)
$(HIDE)$(RM) $(BUILD_DIR)
.PHONY: all $(TOYBOX) clean
.PHONY: all clean

View File

@@ -27,8 +27,8 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
DYNLOADTESTDIR := $(LITEOSTOPDIR)/test/kernel/sample/kernel_extend/dynload
export DYNLOADTESTDIR
import("//kernel/liteos_a/liteos.gni")
##### command to test dynload #####
-include $(DYNLOADTESTDIR)/test_dynload.mk
executable("trace") {
sources = [ "src/trace.c" ]
}

View File

@@ -1,53 +1,36 @@
# Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
# Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of
# conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
# of conditions and the following disclaimer in the documentation and/or other materials
# provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be used
# to endorse or promote products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
SRC_MODULES := fs/proc
ifeq ($(LOSCFG_USER_TEST_LLT), y)
LLT_MODULES := fs/proc/llt
endif
ifeq ($(LOSCFG_USER_TEST_SMOKE), y)
SMOKE_MODULES := fs/proc/smoke
endif
ifeq ($(LOSCFG_USER_TEST_FULL), y)
FULL_MODULES := fs/proc/full
endif
ifeq ($(LOSCFG_USER_TEST_PRESSURE), y)
PRESSURE_MODULES := fs/proc/pressure
endif
LOCAL_MODULES := $(SRC_MODULES) $(LLT_MODULES) $(PRESSURE_MODULES) $(SMOKE_MODULES) $(FULL_MODULES)
LOCAL_SRCS += $(foreach dir,$(LOCAL_MODULES),$(wildcard $(dir)/*.c))
LOCAL_CHS += $(foreach dir,$(LOCAL_MODULES),$(wildcard $(dir)/*.h))
LOCAL_FLAGS += -I./fs/proc
# Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
# Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of
# conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
# of conditions and the following disclaimer in the documentation and/or other materials
# provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be used
# to endorse or promote products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
include $(APPSTOPDIR)/config.mk
APP_NAME := $(notdir $(shell pwd))
LOCAL_SRCS := src/trace.c
include $(APP)

135
apps/trace/src/trace.c Normal file
View File

@@ -0,0 +1,135 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <stdint.h>
#define TRACE_IOC_MAGIC 'T'
#define TRACE_START _IO(TRACE_IOC_MAGIC, 1)
#define TRACE_STOP _IO(TRACE_IOC_MAGIC, 2)
#define TRACE_RESET _IO(TRACE_IOC_MAGIC, 3)
#define TRACE_DUMP _IO(TRACE_IOC_MAGIC, 4)
#define TRACE_SET_MASK _IO(TRACE_IOC_MAGIC, 5)
#define TRACE_USR_MAX_PARAMS 3
typedef struct {
unsigned int eventType;
uintptr_t identity;
uintptr_t params[TRACE_USR_MAX_PARAMS];
} UsrEventInfo;
static void TraceUsage(void)
{
printf("\nUsage: ./trace [start] Start to trace events.\n");
printf("\nUsage: ./trace [stop] Stop trace.\n");
printf("\nUsage: ./trace [reset] Clear the trace record buffer.\n");
printf("\nUsage: ./trace [dump 0/1] Format printf trace data,"
"0/1 stands for whether to send data to studio for analysis.\n");
printf("\nUsage: ./trace [mask num] Set trace filter event mask.\n");
printf("\nUsage: ./trace [read nBytes] Read nBytes raw data from trace buffer.\n");
printf("\nUsage: ./trace [write type id params..] Write a user event, no more than 3 parameters.\n");
}
static void TraceRead(int fd, size_t size)
{
ssize_t i;
ssize_t len;
char *buffer = (char *)malloc(size);
if (buffer == NULL) {
printf("Read buffer malloc failed.\n");
return;
}
len = read(fd, buffer, size);
for (i = 0; i < len; i++) {
printf("%02x ", buffer[i] & 0xFF);
}
printf("\n");
free(buffer);
}
static void TraceWrite(int fd, int argc, char **argv)
{
int i;
UsrEventInfo info = {0};
info.eventType = strtoul(argv[2], NULL, 0);
info.identity = strtoul(argv[3], NULL, 0);
int paramNum = (argc - 4) > TRACE_USR_MAX_PARAMS ? TRACE_USR_MAX_PARAMS : (argc - 4);
for (i = 0; i < paramNum; i++) {
info.params[i] = strtoul(argv[4 + i], NULL, 0);
}
(void)write(fd, &info, sizeof(UsrEventInfo));
}
int main(int argc, char **argv)
{
int fd = open("/dev/trace", O_RDWR);
if (fd == -1) {
printf("Trace open failed.\n");
exit(EXIT_FAILURE);
}
if (argc == 1) {
TraceUsage();
} else if (argc == 2 && strcmp(argv[1], "start") == 0) {
ioctl(fd, TRACE_START, NULL);
} else if (argc == 2 && strcmp(argv[1], "stop") == 0) {
ioctl(fd, TRACE_STOP, NULL);
} else if (argc == 2 && strcmp(argv[1], "reset") == 0) {
ioctl(fd, TRACE_RESET, NULL);
} else if (argc == 3 && strcmp(argv[1], "mask") == 0) {
size_t mask = strtoul(argv[2], NULL, 0);
ioctl(fd, TRACE_SET_MASK, mask);
} else if (argc == 3 && strcmp(argv[1], "dump") == 0) {
size_t flag = strtoul(argv[2], NULL, 0);
ioctl(fd, TRACE_DUMP, flag);
} else if (argc == 3 && strcmp(argv[1], "read") == 0) {
size_t size = strtoul(argv[2], NULL, 0);
TraceRead(fd, size);
} else if (argc >= 4 && strcmp(argv[1], "write") == 0) {
TraceWrite(fd, argc, argv);
} else {
printf("Unsupported trace command.\n");
TraceUsage();
}
close(fd);
return 0;
}

View File

@@ -31,17 +31,10 @@ import("//kernel/liteos_a/liteos.gni")
group("arm") {
deps = [ "gic" ]
if (defined(LOSCFG_ARCH_ARM_AARCH32)) {
deps += [ "arm" ]
}
deps += [ ARCH ]
}
config("public") {
include_dirs = [ "include" ]
configs = []
if (defined(LOSCFG_ARCH_ARM_AARCH32)) {
configs += [ "arm:public" ]
} else if (defined(LOSCFG_ARCH_ARM_AARCH64)) {
configs += [ "aarch64:public" ]
}
configs = [ "$ARCH:public" ]
}

View File

@@ -36,15 +36,15 @@ LOSCFG_ARCH_FPU_STRIP := $(subst $\",,$(LOSCFG_ARCH_FPU))
LOSCFG_ARCH_FPU = $(LOSCFG_ARCH_FPU_STRIP)
ifeq ($(LOSCFG_ARCH_ARM_AARCH32), y)
LITEOS_ARCH_ARM := arm
ARCH := arm
else ifeq ($(LOSCFG_ARCH_ARM_AARCH64), y)
LITEOS_ARCH_ARM :=
ARCH := aarch64
endif
LITEOS_BASELIB += -l$(LOSCFG_ARCH_CPU)
LITEOS_BASELIB += -lgic
LIB_SUBDIRS += arch/arm/$(LITEOS_ARCH_ARM)
LIB_SUBDIRS += arch/arm/$(ARCH)
LIB_SUBDIRS += arch/arm/gic
# CPU compile options
@@ -66,14 +66,12 @@ LITEOS_GCCLIB := $(subst cortex-,,$(LOSCFG_ARCH_CPU))_softfp_$(LOSCFG_
endif
LITEOS_CORE_COPTS = $(or $(ARCH_CFLAGS),$(LITEOS_CPU_OPTS) $(LITEOS_FLOAT_OPTS) $(LITEOS_FPU_OPTS))
LITEOS_INTERWORK += $(LITEOS_CORE_COPTS)
LITEOS_NODEBUG += $(LITEOS_CORE_COPTS)
LITEOS_ASOPTS += $(LITEOS_CPU_OPTS)
LITEOS_CXXOPTS_BASE += $(LITEOS_CORE_COPTS)
ARCH_INCLUDE := -I $(LITEOSTOPDIR)/arch/arm/include \
-I $(LITEOSTOPDIR)/arch/arm/$(LITEOS_ARCH_ARM)/include \
-I $(LITEOSTOPDIR)/arch/arm/$(LITEOS_ARCH_ARM)/src/include
-I $(LITEOSTOPDIR)/arch/arm/$(ARCH)/include \
-I $(LITEOSTOPDIR)/arch/arm/$(ARCH)/src/include
LITEOS_PLATFORM_INCLUDE += $(ARCH_INCLUDE)
@@ -85,17 +83,3 @@ else ifeq ($(LOSCFG_ARCH_FPU_VFP_D16), y)
else ifeq ($(LOSCFG_ARCH_FPU_VFP_D32), y)
LITEOS_CMACRO += -DLOSCFG_ARCH_FPU_VFP_D32
endif
# extra definition for other module
LITEOS_CPU_TYPE = $(LOSCFG_ARCH_CPU)
LITEOS_ARM_ARCH := -march=$(subst $\",,$(LOSCFG_ARCH_ARM_VER))
# linux style macros
LINUX_ARCH_$(LOSCFG_ARCH_ARM_V7A) = -D__LINUX_ARM_ARCH__=7
LINUX_ARCH_$(LOSCFG_ARCH_ARM_V7R) = -D__LINUX_ARM_ARCH__=7
LINUX_ARCH_$(LOSCFG_ARCH_ARM_V7M) = -D__LINUX_ARM_ARCH__=7
LINUX_ARCH_$(LOSCFG_ARCH_ARM_V8A) = -D__LINUX_ARM_ARCH__=8
LINUX_ARCH_$(LOSCFG_ARCH_ARM_V8R) = -D__LINUX_ARM_ARCH__=8
LINUX_ARCH_$(LOSCFG_ARCH_ARM_V8M) = -D__LINUX_ARM_ARCH__=8
AS_OBJS_LIBC_FLAGS += $(LINUX_ARCH_y)

View File

@@ -49,6 +49,7 @@ kernel_module(module_name) {
"src/strncpy_from_user.c",
"src/strnlen_user.c",
"src/user_copy.c",
"src/smp.c",
]
if (LOSCFG_ARCH_ARM_VER == "armv7-a") {
@@ -64,7 +65,7 @@ kernel_module(module_name) {
include_dirs = [ "src/include" ]
if (defined(LOSCFG_GDB)) {
configs += [ "$LITEOSTOPDIR:as_objs_libc_flags" ]
configs += [ ":as_objs_libc_flags" ]
}
public_configs = [ ":public" ]
@@ -76,3 +77,14 @@ config("public") {
"src/include",
]
}
config("as_objs_libc_flags") {
defines = [ "__ASSEMBLY__" ]
# linux style macros
if (defined(LOSCFG_ARCH_ARM_V7A) || defined(LOSCFG_ARCH_ARM_V7R) || defined(LOSCFG_ARCH_ARM_V7M)) {
defines += [ "__LINUX_ARM_ARCH__=7" ]
} else if (defined(LOSCFG_ARCH_ARM_V8A) || defined(LOSCFG_ARCH_ARM_V8R) || defined(LOSCFG_ARCH_ARM_V8M)) {
defines += [ "__LINUX_ARM_ARCH__=8" ]
}
}

View File

@@ -38,7 +38,7 @@ LOCAL_INCLUDE := \
-I $(LITEOSTOPDIR)/kernel/extended/dynload/include \
-I $(LITEOSTOPDIR)/arch/arm/arm/include \
ifeq ($(LITEOS_ARM_ARCH), -march=armv7-a)
ifeq ($(LOSCFG_ARCH_ARM_VER), "armv7-a")
LOCAL_SRCS += $(wildcard src/armv7a/*.S)
endif
@@ -50,6 +50,16 @@ endif
LOCAL_FLAGS := $(LOCAL_INCLUDE) $(LITEOS_GCOV_OPTS)
AS_OBJS_LIBC_FLAGS = -D__ASSEMBLY__
# linux style macros
LINUX_ARCH_$(LOSCFG_ARCH_ARM_V7A) = -D__LINUX_ARM_ARCH__=7
LINUX_ARCH_$(LOSCFG_ARCH_ARM_V7R) = -D__LINUX_ARM_ARCH__=7
LINUX_ARCH_$(LOSCFG_ARCH_ARM_V7M) = -D__LINUX_ARM_ARCH__=7
LINUX_ARCH_$(LOSCFG_ARCH_ARM_V8A) = -D__LINUX_ARM_ARCH__=8
LINUX_ARCH_$(LOSCFG_ARCH_ARM_V8R) = -D__LINUX_ARM_ARCH__=8
LINUX_ARCH_$(LOSCFG_ARCH_ARM_V8M) = -D__LINUX_ARM_ARCH__=8
AS_OBJS_LIBC_FLAGS += $(LINUX_ARCH_y)
ifeq ($(LOSCFG_GDB), y)
LOCAL_FLAGS += $(AS_OBJS_LIBC_FLAGS)
endif

View File

@@ -53,6 +53,8 @@ extern "C" {
#define ISB __asm__ volatile("isb" ::: "memory")
#define WFI __asm__ volatile("wfi" ::: "memory")
#define BARRIER __asm__ volatile("":::"memory")
#define WFE __asm__ volatile("wfe" ::: "memory")
#define SEV __asm__ volatile("sev" ::: "memory")
#define ARM_SYSREG_READ(REG) \
({ \

View File

@@ -0,0 +1,58 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _ARCH_SMP_H
#define _ARCH_SMP_H
#include "los_config.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
struct SmpOps {
INT32 (*SmpCpuOn)(UINT32 cpuNum, UINTPTR startEntry); /* The startEntry is physical addr. */
};
typedef VOID (*ArchCpuStartFunc)(VOID *arg);
VOID HalArchCpuOn(UINT32 cpuNum, ArchCpuStartFunc func, struct SmpOps *ops, VOID *arg);
#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */
#endif /* _ARCH_SMP_H */

View File

@@ -790,7 +790,7 @@ STATUS_T LOS_ArchMmuDestroy(LosArchMmu *archMmu)
LOS_PhysPageFree(page);
}
OsArmWriteTlbiasid(archMmu->asid);
OsArmWriteTlbiasidis(archMmu->asid);
OsFreeAsid(archMmu->asid);
#endif
(VOID)LOS_MuxDestroy(&archMmu->mtx);

View File

@@ -228,7 +228,8 @@ UINT32 OsArmSharedPageFault(UINT32 excType, ExcContext *frame, UINT32 far, UINT3
break;
}
default:
ret = LOS_ERRNO_VM_NOT_FOUND;
OsArmWriteTlbimvaais(ROUNDDOWN(far, PAGE_SIZE));
ret = LOS_OK;
break;
}
#if defined(LOSCFG_KERNEL_SMP) && defined(LOSCFG_DEBUG_VERSION)
@@ -276,8 +277,8 @@ STATIC const CHAR *g_excTypeString[] = {
#ifdef LOSCFG_KERNEL_VM
STATIC VADDR_T OsGetTextRegionBase(LosVmMapRegion *region, LosProcessCB *runProcess)
{
struct file *curFilep = NULL;
struct file *lastFilep = NULL;
struct Vnode *curVnode = NULL;
struct Vnode *lastVnode = NULL;
LosVmMapRegion *curRegion = NULL;
LosVmMapRegion *lastRegion = NULL;
@@ -296,9 +297,9 @@ STATIC VADDR_T OsGetTextRegionBase(LosVmMapRegion *region, LosProcessCB *runProc
if ((lastRegion == NULL) || !LOS_IsRegionFileValid(lastRegion)) {
goto DONE;
}
curFilep = curRegion->unTypeData.rf.file;
lastFilep = lastRegion->unTypeData.rf.file;
} while (!strcmp(curFilep->f_path, lastFilep->f_path));
curVnode = curRegion->unTypeData.rf.vnode;
lastVnode = lastRegion->unTypeData.rf.vnode;
} while (curVnode == lastVnode);
DONE:
#ifdef LOSCFG_KERNEL_DYNLOAD
@@ -454,7 +455,7 @@ STATIC VOID OsDumpExcVaddrRegion(LosVmSpace *space, LosVmMapRegion *region)
mmuFlag = FALSE;
}
PrintExcInfo(" 0x%08x 0x%08x 0x%08x\n",
startVaddr, LOS_PaddrToKVaddr(startPaddr), (UINT32)pageCount << PAGE_SHIFT);
startVaddr, (UINTPTR)LOS_PaddrToKVaddr(startPaddr), (UINT32)pageCount << PAGE_SHIFT);
pageCount = 0;
startPaddr = 0;
}
@@ -515,7 +516,7 @@ VOID OsDumpContextMem(const ExcContext *excBufAddr)
for (excReg = &(excBufAddr->R0); count <= DUMPREGS; excReg++, count++) {
if (IS_VALID_ADDR(*excReg)) {
PrintExcInfo("\ndump mem around R%u:%p", count, (*excReg));
PrintExcInfo("\ndump mem around R%u:0x%x", count, (*excReg));
OsDumpMemByte(DUMPSIZE, ((*excReg) - (DUMPSIZE >> 1)));
}
}
@@ -811,7 +812,7 @@ VOID OsCallStackInfo(VOID)
PrintExcInfo("runTask->stackPointer = 0x%x\n"
"runTask->topOfStack = 0x%x\n"
"text_start:0x%x,text_end:0x%x\n",
stackPointer, runTask->topOfStack, &__text_start, &__text_end);
(UINTPTR)stackPointer, runTask->topOfStack, &__text_start, &__text_end);
while ((stackPointer > (UINT32 *)runTask->topOfStack) && (count < OS_MAX_BACKTRACE)) {
if ((*stackPointer > (UINTPTR)(&__text_start)) &&
@@ -994,10 +995,12 @@ STATIC VOID OsCheckAllCpuStatus(VOID)
g_currHandleExcCpuID = currCpuID;
g_currHandleExcPID = OsCurrProcessGet()->processID;
LOS_SpinUnlock(&g_excSerializerSpin);
#ifndef LOSCFG_SAVE_EXCINFO
if (g_excFromUserMode[currCpuID] == FALSE) {
target = (UINT32)(OS_MP_CPU_ALL & ~CPUID_TO_AFFI_MASK(currCpuID));
HalIrqSendIpi(target, LOS_MP_IPI_HALT);
}
#endif
} else if (g_excFromUserMode[currCpuID] == TRUE) {
/* Both cores raise exceptions, and the current core is a user-mode exception.
* Both cores are abnormal and come from the same process
@@ -1022,11 +1025,12 @@ STATIC VOID OsCheckAllCpuStatus(VOID)
while (1) {}
}
}
#ifndef LOSCFG_SAVE_EXCINFO
/* use halt ipi to stop other active cores */
if (g_excFromUserMode[ArchCurrCpuid()] == FALSE) {
WaitAllCpuStop(currCpuID);
}
#endif
}
#endif

View File

@@ -85,7 +85,7 @@ LITE_OS_SEC_TEXT_INIT VOID *OsTaskStackInit(UINT32 taskID, UINT32 stackSize, VOI
taskContext->LR = (UINTPTR)OsTaskExit; /* LR should be kept, to distinguish it's THUMB or ARM instruction */
taskContext->R0 = taskID; /* R0 */
#ifdef LOSCFG_INTERWORK_THUMB
#ifdef LOSCFG_THUMB
taskContext->regCPSR = PSR_MODE_SVC_THUMB; /* CPSR (Enable IRQ and FIQ interrupts, THUMNB-mode) */
#else
taskContext->regCPSR = PSR_MODE_SVC_ARM; /* CPSR (Enable IRQ and FIQ interrupts, ARM-mode) */
@@ -123,7 +123,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsUserTaskStackInit(TaskContext *context, UINTPTR tas
{
LOS_ASSERT(context != NULL);
#ifdef LOSCFG_INTERWORK_THUMB
#ifdef LOSCFG_THUMB
context->regCPSR = PSR_MODE_USR_THUMB;
#else
context->regCPSR = PSR_MODE_USR_ARM;

View File

@@ -36,7 +36,7 @@
#include "los_cpup_pri.h"
#endif
#include "los_sched_pri.h"
#include "los_hook.h"
/* spinlock for hwi module, only available on SMP mode */
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_hwiSpin);
@@ -84,7 +84,7 @@ VOID OsInterrupt(UINT32 intNum)
#ifdef LOSCFG_CPUP_INCLUDE_IRQ
OsCpupIrqStart();
#endif
OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, intNum);
hwiForm = (&g_hwiForm[intNum]);
#ifndef LOSCFG_NO_SHARED_IRQ
while (hwiForm->pstNext != NULL) {
@@ -107,6 +107,7 @@ VOID OsInterrupt(UINT32 intNum)
#endif
++g_hwiFormCnt[intNum];
OsHookCall(LOS_HOOK_TYPE_ISR_EXIT, intNum);
#ifdef LOSCFG_CPUP_INCLUDE_IRQ
OsCpupIrqEnd(intNum);
#endif

106
arch/arm/arm/src/smp.c Normal file
View File

@@ -0,0 +1,106 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "smp.h"
#include "arch_config.h"
#include "los_base.h"
#include "los_hw.h"
#include "los_atomic.h"
#include "los_arch_mmu.h"
#include "los_init_pri.h"
#include "gic_common.h"
#include "los_task_pri.h"
#ifdef LOSCFG_KERNEL_SMP
extern VOID reset_vector(VOID);
struct OsCpuInit {
ArchCpuStartFunc cpuStart;
VOID *arg;
Atomic initFlag;
};
STATIC struct OsCpuInit g_cpuInit[CORE_NUM - 1] = {0};
VOID HalArchCpuOn(UINT32 cpuNum, ArchCpuStartFunc func, struct SmpOps *ops, VOID *arg)
{
struct OsCpuInit *cpuInit = &g_cpuInit[cpuNum - 1];
UINTPTR startEntry = (UINTPTR)&reset_vector - KERNEL_VMM_BASE + SYS_MEM_BASE;
INT32 ret = 0;
cpuInit->cpuStart = func;
cpuInit->arg = arg;
cpuInit->initFlag = 0;
DCacheFlushRange((UINTPTR)cpuInit, (UINTPTR)cpuInit + sizeof(struct OsCpuInit));
LOS_ASSERT(ops != NULL);
ret = ops->SmpCpuOn(cpuNum, startEntry);
if (ret < 0) {
PRINT_ERR("cpu start failed, cpu num: %u, ret: %d\n", cpuNum, ret);
return;
}
while (!LOS_AtomicRead(&cpuInit->initFlag)) {
WFE;
}
}
VOID HalSecondaryCpuStart(VOID)
{
UINT32 cpuid = ArchCurrCpuid();
struct OsCpuInit *cpuInit = &g_cpuInit[cpuid - 1];
OsCurrTaskSet(OsGetMainTask());
LOS_AtomicSet(&cpuInit->initFlag, 1);
SEV;
#ifdef LOSCFG_KERNEL_MMU
OsArchMmuInitPerCPU();
#endif
/* store each core's hwid */
CPU_MAP_SET(cpuid, OsHwIDGet());
HalIrqInitPercpu();
OsInitCall(LOS_INIT_LEVEL_ARCH);
cpuInit->cpuStart(cpuInit->arg);
while (1) {
WFI;
}
}
#endif

View File

@@ -28,6 +28,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#define ASSEMBLY
#include "arch_config.h"
#include "los_vm_boot.h"
@@ -54,6 +55,8 @@
.extern __stack_chk_guard_setup
.extern g_firstPageTable
.extern g_mmuJumpPageTable
.extern g_archMmuInitMapping
.extern HalSecondaryCpuStart
.equ MPIDR_CPUID_MASK, 0xffU
@@ -77,14 +80,6 @@
bl excstack_magic
.endm
/* param0 is physical address, param1 virtual address, param2 is sizes, param3 is flag */
.macro PAGE_TABLE_SET param0, param1, param2, param3
ldr r6, =\param0
ldr r7, =\param1
ldr r8, =\param2
ldr r10, =\param3
bl page_table_build
.endm
.code 32
.section ".vectors","ax"
@@ -184,12 +179,15 @@ reloc_img_to_bottom_done:
mov r2, #MMU_DESCRIPTOR_L1_SMALL_ENTRY_NUMBERS
bl memset_optimized /* optimized memset since r0 is 64-byte aligned */
PAGE_TABLE_SET SYS_MEM_BASE, KERNEL_VMM_BASE, KERNEL_VMM_SIZE, MMU_DESCRIPTOR_KERNEL_L1_PTE_FLAGS
PAGE_TABLE_SET SYS_MEM_BASE, UNCACHED_VMM_BASE, UNCACHED_VMM_SIZE, MMU_INITIAL_MAP_NORMAL_NOCACHE
PAGE_TABLE_SET PERIPH_PMM_BASE, PERIPH_DEVICE_BASE, PERIPH_DEVICE_SIZE, MMU_INITIAL_MAP_DEVICE
PAGE_TABLE_SET PERIPH_PMM_BASE, PERIPH_CACHED_BASE, PERIPH_CACHED_SIZE, MMU_DESCRIPTOR_KERNEL_L1_PTE_FLAGS
PAGE_TABLE_SET PERIPH_PMM_BASE, PERIPH_UNCACHED_BASE, PERIPH_UNCACHED_SIZE, MMU_INITIAL_MAP_STRONGLY_ORDERED
ldr r5, =g_archMmuInitMapping
add r5, r5, r11
init_mmu_loop:
ldmia r5!, {r6-r10} /* r6 = phys, r7 = virt, r8 = size, r9 = mmu_flags, r10 = name */
cmp r8, 0 /* if size = 0, the mmu init done */
beq init_mmu_done
bl page_table_build
b init_mmu_loop
init_mmu_done:
orr r8, r4, #MMU_TTBRx_FLAGS /* r8 = r4 and set cacheable attributes on translation walk */
ldr r4, =g_mmuJumpPageTable /* r4: jump pagetable vaddr */
add r4, r4, r11
@@ -205,9 +203,7 @@ reloc_img_to_bottom_done:
str r12, [r4, r7, lsr #(20 - 2)] /* jumpTable[paIndex] = pt entry */
rsb r7, r11, r6, lsl #20 /* r7: va */
str r12, [r4, r7, lsr #(20 - 2)] /* jumpTable[vaIndex] = pt entry */
#endif
bl _bootaddr_setup
#ifdef LOSCFG_KERNEL_MMU
bl mmu_setup /* set up the mmu */
#endif
/* clear out the interrupt and exception stack and set magic num to check the overflow */
@@ -317,6 +313,7 @@ reset_platform:
mov r0, #0
mov pc, r0 // Jump to reset vector
#endif
cpu_start:
#ifdef LOSCFG_KERNEL_MMU
ldr r4, =g_firstPageTable /* r4 = physical address of translation table and clear it */
@@ -330,7 +327,8 @@ cpu_start:
bl mmu_setup
#endif
bl secondary_cpu_start
bl HalSecondaryCpuStart
b .
secondary_cpu_init:
@@ -370,9 +368,9 @@ sp_set:
*/
#ifdef LOSCFG_KERNEL_MMU
page_table_build:
mov r9, r6
bfc r9, #20, #12 /* r9: pa % MB */
add r8, r8, r9
mov r10, r6
bfc r10, #20, #12 /* r9: pa % MB */
add r8, r8, r10
add r8, r8, #(1 << 20)
sub r8, r8, #1
lsr r6, #20 /* r6 = physical address / MB */
@@ -380,7 +378,7 @@ page_table_build:
lsr r8, #20 /* r8 = roundup(size, MB) */
page_table_build_loop:
orr r12, r10, r6, lsl #20 /* r12: flags | physAddr */
orr r12, r9, r6, lsl #20 /* r12: flags | physAddr */
str r12, [r4, r7, lsl #2] /* gPgTable[l1Index] = physAddr | flags */
add r6, #1 /* physAddr+ */
add r7, #1 /* l1Index++ */
@@ -422,24 +420,6 @@ excstack_magic_loop:
blt excstack_magic_loop
bx lr
/*
* 0xe51ff004 = "ldr pc, [pc, #-4]"
* next addr value will be the real booting addr
*/
_bootaddr_setup:
mov r0, #0
ldr r1, =0xe51ff004
str r1, [r0]
add r0, r0, #4
ldr r1, =SYS_MEM_BASE
str r1, [r0]
dsb
isb
bx lr
#ifdef LOSCFG_KERNEL_MMU
memset_optimized:
mov r3, r0

View File

@@ -54,6 +54,7 @@
.extern __stack_chk_guard_setup
.extern g_firstPageTable
.extern g_mmuJumpPageTable
.extern g_archMmuInitMapping
.equ MPIDR_CPUID_MASK, 0xffU
@@ -77,14 +78,6 @@
bl excstack_magic
.endm
/* param0 is physical address, param1 virtual address, param2 is sizes, param3 is flag */
.macro PAGE_TABLE_SET param0, param1, param2, param3
ldr r6, =\param0
ldr r7, =\param1
ldr r8, =\param2
ldr r10, =\param3
bl page_table_build
.endm
.code 32
.section ".vectors","ax"
@@ -161,12 +154,15 @@ reloc_img_to_bottom_done:
mov r2, #MMU_DESCRIPTOR_L1_SMALL_ENTRY_NUMBERS
bl memset_optimized /* optimized memset since r0 is 64-byte aligned */
PAGE_TABLE_SET SYS_MEM_BASE, KERNEL_VMM_BASE, KERNEL_VMM_SIZE, MMU_DESCRIPTOR_KERNEL_L1_PTE_FLAGS
PAGE_TABLE_SET SYS_MEM_BASE, UNCACHED_VMM_BASE, UNCACHED_VMM_SIZE, MMU_INITIAL_MAP_NORMAL_NOCACHE
PAGE_TABLE_SET PERIPH_PMM_BASE, PERIPH_DEVICE_BASE, PERIPH_DEVICE_SIZE, MMU_INITIAL_MAP_DEVICE
PAGE_TABLE_SET PERIPH_PMM_BASE, PERIPH_CACHED_BASE, PERIPH_CACHED_SIZE, MMU_DESCRIPTOR_KERNEL_L1_PTE_FLAGS
PAGE_TABLE_SET PERIPH_PMM_BASE, PERIPH_UNCACHED_BASE, PERIPH_UNCACHED_SIZE, MMU_INITIAL_MAP_STRONGLY_ORDERED
ldr r5, =g_archMmuInitMapping
add r5, r5, r11
init_mmu_loop:
ldmia r5!, {r6-r10} /* r6 = phys, r7 = virt, r8 = size, r9 = mmu_flags, r10 = name */
cmp r8, 0 /* if size = 0, the mmu init done */
beq init_mmu_done
bl page_table_build
b init_mmu_loop
init_mmu_done:
orr r8, r4, #MMU_TTBRx_FLAGS /* r8 = r4 and set cacheable attributes on translation walk */
ldr r4, =g_mmuJumpPageTable /* r4: jump pagetable vaddr */
add r4, r4, r11
@@ -231,9 +227,6 @@ warm_reset:
LDR r0, =__exception_handlers
MCR p15, 0, r0, c12, c0, 0
cmp r11, #0
bne cpu_start
clear_bss:
ldr r0, =__bss_start
ldr r2, =__bss_end
@@ -310,11 +303,6 @@ reset_platform:
mov r0, #0
mov pc, r0 // Jump to reset vector
#endif
cpu_start:
bl secondary_cpu_start
b .
/*
* set sp for current cpu
@@ -336,9 +324,9 @@ sp_set:
*/
#ifdef LOSCFG_KERNEL_MMU
page_table_build:
mov r9, r6
bfc r9, #20, #12 /* r9: pa % MB */
add r8, r8, r9
mov r10, r6
bfc r10, #20, #12 /* r9: pa % MB */
add r8, r8, r10
add r8, r8, #(1 << 20)
sub r8, r8, #1
lsr r6, #20 /* r6 = physical address / MB */
@@ -346,7 +334,7 @@ page_table_build:
lsr r8, #20 /* r8 = roundup(size, MB) */
page_table_build_loop:
orr r12, r10, r6, lsl #20 /* r12: flags | physAddr */
orr r12, r9, r6, lsl #20 /* r12: flags | physAddr */
str r12, [r4, r7, lsl #2] /* gPgTable[l1Index] = physAddr | flags */
add r6, #1 /* physAddr+ */
add r7, #1 /* l1Index++ */
@@ -388,24 +376,6 @@ excstack_magic_loop:
blt excstack_magic_loop
bx lr
/*
* 0xe51ff004 = "ldr pc, [pc, #-4]"
* next addr value will be the real booting addr
*/
_bootaddr_setup:
mov r0, #0
ldr r1, =0xe51ff004
str r1, [r0]
add r0, r0, #4
ldr r1, =SYS_MEM_BASE
str r1, [r0]
dsb
isb
bx lr
#ifdef LOSCFG_KERNEL_MMU
memset_optimized:
mov r3, r0

View File

@@ -46,7 +46,7 @@ INT32 LOS_StrncpyFromUser(CHAR *dst, const CHAR *src, INT32 count)
}
maxCount = (LOS_IsUserAddressRange((VADDR_T)(UINTPTR)src, (size_t)count)) ? \
count : (USER_ASPACE_TOP_MAX - (UINTPTR)src);
count : (INT32)(USER_ASPACE_TOP_MAX - (UINTPTR)src);
for (i = 0; i < maxCount; ++i) {
if (LOS_GetUser(&character, src + offset) != LOS_OK) {

View File

@@ -33,8 +33,8 @@ MODULE_NAME := $(notdir $(shell pwd))
LOCAL_SRCS := $(wildcard kern/*.c)
LOCAL_SRCS += $(wildcard $(LITEOS_ARCH_ARM)/*.c)
LOCAL_SRCS += $(wildcard $(LITEOS_ARCH_ARM)/*.S)
LOCAL_SRCS += $(wildcard $(ARCH)/*.c)
LOCAL_SRCS += $(wildcard $(ARCH)/*.S)
ifeq ($(LOSCFG_DRIVERS_RANDOM), y)
LOCAL_SRCS += $(wildcard crypto/rijndael/*.c) \

View File

@@ -42,41 +42,11 @@ ohos_version=${9}
sysroot_path=${10}
arch_cflags=${11}
device_path=${12}
compile_prefix=${13}
liteos_config_file=${14}
echo "${board_name}" "${device_company}"
echo "sh param:" "$@"
destination="defconfig"
function main() {
tee=""
if [ "${tee_enable}" = "true" ]; then
tee="_tee"
fi
config_file="${product_path}/kernel_configs/${ohos_build_type}${tee}.config"
if [ -f "${config_file}" ]; then
cp "${config_file}" "${destination}"
return
fi
product_name=$(basename "${product_path}")
config_file="${product_name}_release.config"
if [ "${ohos_build_compiler}" = "clang" ]; then
if [ "${ohos_build_type}" = "debug" ]; then
config_file="debug/${product_name}_${ohos_build_compiler}${tee}.config"
else
config_file="${product_name}_${ohos_build_compiler}_release${tee}.config"
fi
elif [ "${ohos_build_compiler}" = "gcc" ]; then
if [ "${ohos_build_type}" = "debug" ]; then
config_file="${product_name}_debug_shell${tee}.config"
else
config_file="${product_name}_release${tee}.config"
fi
fi
cp "tools/build/config/${config_file}" "${destination}"
}
if [ "x" != "x${sysroot_path}" ]; then
export SYSROOT_PATH=${sysroot_path}
fi
@@ -88,9 +58,12 @@ fi
export PRODUCT_PATH="${product_path}"
export DEVICE_PATH="${device_path}"
OUTDIR="${outdir}"
CONFIG="$(realpath ${destination})"
export OUTDIR="${outdir}"
export KCONFIG_CONFIG="${liteos_config_file}"
export LITEOS_MENUCONFIG_H="${outdir}/config.h"
export LITEOS_CONFIG_FILE="${outdir}/.config"
export LITEOS_COMPILER_PATH="${compile_prefix%/*}/"
export CROSS_COMPILE="${compile_prefix##*/}"
main && \
make clean CONFIG="$CONFIG" OUTDIR="$OUTDIR" && \
make -j all VERSION="${ohos_version}" CONFIG="$CONFIG" OUTDIR="$OUTDIR"
mkdir -p "${outdir}"
make -j all VERSION="${ohos_version}"

59
bundle.json Normal file
View File

@@ -0,0 +1,59 @@
{
"name": "@ohos/kernel_liteos_a",
"version": "",
"description": "liteos-a内核",
"homePage": "https://gitee.com/openharmony",
"license": "BSD 3-clause",
"repository": "https://gitee.com/openharmony/kernel_liteos_a",
"domain": "os",
"language": "",
"publishAs": "code-segment",
"private": false,
"scripts": {},
"tags": [
"kernel"
],
"keywords": [
"kernel",
"liteos-a"
],
"envs": [],
"dirs": [],
"author": {
"name": "",
"email": "",
"url": ""
},
"contributors": [
{
"name": "",
"email": "",
"url": ""
}
],
"segment": {
"destPath": "kernel/liteos_a"
},
"component": {
"name": "liteos-a",
"subsystem": "liteos_a",
"syscap": [
"SystemCapability.Kernel.liteos-a"
],
"features": [],
"adated_system_type": [
"small"
],
"rom": "",
"ram": "",
"deps": {
"components": [],
"third_party": []
},
"build": {
"sub_component": [],
"inner_kits": [],
"test": []
}
}
}

View File

@@ -33,6 +33,8 @@ module_switch = defined(LOSCFG_COMPAT_POSIX)
module_name = get_path_info(rebase_path("."), "name")
kernel_module(module_name) {
sources = [
"src/errno.c",
"src/malloc.c",
"src/map_error.c",
"src/misc.c",
"src/mqueue.c",
@@ -44,6 +46,8 @@ kernel_module(module_name) {
"src/sched.c",
"src/semaphore.c",
"src/socket.c",
"src/stdio.c",
"src/stdlib.c",
"src/time.c",
]

51
compat/posix/src/errno.c Normal file
View File

@@ -0,0 +1,51 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "errno.h"
#include "los_errno.h"
#include "los_task_pri.h"
/* the specific errno get or set in interrupt service routine */
static int errno_isr;
int *__errno_location(void)
{
LosTaskCB *runTask = NULL;
if (OS_INT_INACTIVE) {
runTask = OsCurrTaskGet();
return &runTask->errorNo;
} else {
return &errno_isr;
}
}
int *__errno(void) __attribute__((__weak__, __alias__("__errno_location")));

145
compat/posix/src/malloc.c Normal file
View File

@@ -0,0 +1,145 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "stdlib.h"
#include "string.h"
#include "los_vm_map.h"
/*
* Allocates the requested memory and returns a pointer to it. The requested
* size is nitems each size bytes long (total memory requested is nitems*size).
* The space is initialized to all zero bits.
*/
void *calloc(size_t nitems, size_t size)
{ /*lint !e578*/
size_t real_size;
void *ptr = NULL;
if (nitems == 0 || size == 0) {
return NULL;
}
real_size = (size_t)(nitems * size);
ptr = LOS_KernelMalloc((UINT32) real_size);
if (ptr != NULL) {
(void) memset_s((void *) ptr, real_size, 0, real_size);
}
return ptr;
}
/*
* Deallocates the memory previously allocated by a call to calloc, malloc, or
* realloc. The argument ptr points to the space that was previously allocated.
* If ptr points to a memory block that was not allocated with calloc, malloc,
* or realloc, or is a space that has been deallocated, then the result is undefined.
*/
void free(void *ptr)
{
if (ptr == NULL) {
return;
}
LOS_KernelFree(ptr);
}
/*
* Allocates the requested memory and returns a pointer to it. The requested
* size is size bytes. The value of the space is indeterminate.
*/
void *malloc(size_t size)
{ /*lint !e31 !e10*/
if (size == 0) {
return NULL;
}
return LOS_KernelMalloc((UINT32) size);
}
void *zalloc(size_t size)
{ /*lint !e10*/
void *ptr = NULL;
if (size == 0) {
return NULL;
}
ptr = LOS_KernelMalloc((UINT32) size);
if (ptr != NULL) {
(void) memset_s(ptr, size, 0, size);
}
return ptr;
}
/*
* allocates a block of size bytes whose address is a multiple of boundary.
* The boundary must be a power of two!
*/
void *memalign(size_t boundary, size_t size)
{
if (size == 0) {
return NULL;
}
return LOS_KernelMallocAlign((UINT32) size, (UINT32) boundary);
}
/*
* Attempts to resize the memory block pointed to by ptr that was previously
* allocated with a call to malloc or calloc. The contents pointed to by ptr are
* unchanged. If the value of size is greater than the previous size of the
* block, then the additional bytes have an undeterminate value. If the value
* of size is less than the previous size of the block, then the difference of
* bytes at the end of the block are freed. If ptr is null, then it behaves like
* malloc. If ptr points to a memory block that was not allocated with calloc
* or malloc, or is a space that has been deallocated, then the result is
* undefined. If the new space cannot be allocated, then the contents pointed
* to by ptr are unchanged. If size is zero, then the memory block is completely
* freed.
*/
void *realloc(void *ptr, size_t size)
{
if (ptr == NULL) {
ptr = malloc(size);
return ptr;
}
if (size == 0) {
free(ptr);
return NULL;
}
return LOS_KernelRealloc(ptr, (UINT32) size);
}

View File

@@ -231,7 +231,7 @@ int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
SetPthreadAttr(self, attr, &userAttr);
(VOID)snprintf_s(name, sizeof(name), sizeof(name) - 1, "pth%02d", pthreadNumber);
(VOID)snprintf_s(name, sizeof(name), sizeof(name) - 1, "pth%02u", pthreadNumber);
pthreadNumber++;
taskInitParam.pcName = name;

View File

@@ -138,3 +138,8 @@ int __sched_cpucount(size_t set_size, const cpu_set_t* set)
return count;
}
int sched_yield()
{
(void)LOS_TaskYield();
return 0;
}

121
compat/posix/src/stdio.c Normal file
View File

@@ -0,0 +1,121 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#ifdef LOSCFG_FS_VFS
#include <fs/fs.h>
off_t _lseek(int fd, off_t offset, int whence)
{
int ret;
struct file *filep = NULL;
/* Get the file structure corresponding to the file descriptor. */
ret = fs_getfilep(fd, &filep);
if (ret < 0) {
/* The errno value has already been set */
return (off_t)-get_errno();
}
/* libc seekdir function should set the whence to SEEK_SET, so we can discard
* the whence argument here */
if (filep->f_oflags & O_DIRECTORY) {
/* defensive coding */
if (filep->f_dir == NULL) {
return (off_t)-EINVAL;
}
if (offset == 0) {
rewinddir(filep->f_dir);
} else {
seekdir(filep->f_dir, offset);
}
ret = telldir(filep->f_dir);
if (ret < 0) {
return (off_t)-get_errno();
}
return ret;
}
/* Then let file_seek do the real work */
ret = file_seek(filep, offset, whence);
if (ret < 0) {
return -get_errno();
}
return ret;
}
off64_t _lseek64(int fd, int offsetHigh, int offsetLow, off64_t *result, int whence)
{
off64_t ret;
struct file *filep = NULL;
off64_t offset = ((off64_t)offsetHigh << 32) + (uint)offsetLow; /* 32: offsetHigh is high 32 bits */
/* Get the file structure corresponding to the file descriptor. */
ret = fs_getfilep(fd, &filep);
if (ret < 0) {
/* The errno value has already been set */
return (off64_t)-get_errno();
}
/* libc seekdir function should set the whence to SEEK_SET, so we can discard
* the whence argument here */
if (filep->f_oflags & O_DIRECTORY) {
/* defensive coding */
if (filep->f_dir == NULL) {
return (off64_t)-EINVAL;
}
if (offsetLow == 0) {
rewinddir(filep->f_dir);
} else {
seekdir(filep->f_dir, offsetLow);
}
ret = telldir(filep->f_dir);
if (ret < 0) {
return (off64_t)-get_errno();
}
goto out;
}
/* Then let file_seek do the real work */
ret = file_seek64(filep, offset, whence);
if (ret < 0) {
return (off64_t)-get_errno();
}
out:
*result = ret;
return 0;
}
#endif

View File

@@ -29,40 +29,43 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/statfs.h>
#include <sys/mount.h>
#include "proc_fs.h"
#include <stdlib.h>
#include <stdint.h>
#include <errno.h>
#include "los_printf.h"
#include "los_exc.h"
#ifdef LOSCFG_KERNEL_TRACE
#include "los_trace.h"
static int KernelTraceProcFill(struct SeqBuf *m, void *v)
char *getenv(const char *name)
{
(void)v;
if (m == NULL) {
return -LOS_EPERM;
}
if (m->buf == NULL) {
m->buf = (char *)LOS_TraceBufDataGet(&(m->size), &(m->count));
}
return 0;
return NULL;
}
static const struct ProcFileOperations KERNEL_TRACE_PROC_FOPS = {
.read = KernelTraceProcFill,
};
#endif
void ProcKernelTraceInit(void)
void srand(unsigned s)
{
#ifdef LOSCFG_KERNEL_TRACE
struct ProcDirEntry *pde = CreateProcEntry("ktrace", 0, NULL);
if (pde == NULL) {
PRINT_ERR("create /proc/ktrace error!\n");
return;
}
pde->procFileOps = &KERNEL_TRACE_PROC_FOPS;
#endif
return srandom(s);
}
int rand(void)
{
return random();
}
void _exit(int status)
{
PRINT_ERR("%s NOT SUPPORT\n", __FUNCTION__);
errno = ENOSYS;
while (1);
}
void exit(int status)
{
PRINT_ERR("%s NOT SUPPORT\n", __FUNCTION__);
errno = ENOSYS;
while (1);
}
void abort(void)
{
LOS_Panic("System was being aborted\n");
while (1);
}

View File

@@ -1135,3 +1135,19 @@ VOID OsVdsoTimeGet(VdsoDataPage *vdsoDataPage)
}
#endif
time_t time(time_t *t)
{
struct timeval tp;
int ret;
/* Get the current time from the system */
ret = gettimeofday(&tp, (struct timezone *)NULL);
if (ret == LOS_OK) {
/* Return the seconds since the epoch */
if (t) {
*t = tp.tv_sec;
}
return tp.tv_sec;
}
return (time_t)OS_ERROR;
}

View File

@@ -1 +0,0 @@
tools/build/config.mk

61
config.mk Normal file
View File

@@ -0,0 +1,61 @@
# Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
# Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of
# conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
# of conditions and the following disclaimer in the documentation and/or other materials
# provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be used
# to endorse or promote products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
############### this is a makefile that you can config it ###############
-include $(LITEOSTOPDIR)/tools/build/mk/los_config.mk
##### liteos tables -u ldflags #####
-include $(LITEOSTOPDIR)/tools/build/mk/liteos_tables_ldflags.mk
LITEOS_COPTS := $(LITEOS_COPTS_DEBUG) $(LITEOS_COPTS_BASE) \
$(LITEOS_COPTS_EXTRA) $(LITEOS_CORE_COPTS)
LITEOS_CXXOPTS := $(LITEOS_CXXOPTS_BASE)
LITEOS_INCLUDE := $(LITEOS_KERNEL_INCLUDE) $(LITEOS_EXTKERNEL_INCLUDE) \
$(LITEOS_COMPAT_INCLUDE) $(LITEOS_FS_INCLUDE) \
$(LITEOS_NET_INCLUDE) $(LITEOS_LIB_INCLUDE) \
$(LITEOS_DRIVERS_INCLUDE) $(LOSCFG_TOOLS_DEBUG_INCLUDE) \
$(LITEOS_PLATFORM_INCLUDE) $(LITEOS_DFX_INCLUDE) \
$(LITEOS_SECURITY_INCLUDE)
LITEOS_LIBDEP := $(LITEOS_BASELIB)
LITEOS_ASFLAGS := $(LITEOS_ASOPTS) $(LITEOS_INCLUDE)
LITEOS_CFLAGS := $(LITEOS_COPTS) $(LITEOS_CMACRO) \
$(LITEOS_CMACRO_TEST) $(LITEOS_IMAGE_MACRO) \
$(LITEOS_INCLUDE)
LITEOS_CXXFLAGS := $(LITEOS_CXXOPTS) $(LITEOS_CXXMACRO) \
$(LITEOS_CMACRO) $(LITEOS_CXXINCLUDE)
LITEOS_LDFLAGS := $(LITEOS_LD_OPTS) $(LITEOS_LD_PATH) \
$(LITEOS_LD_SCRIPT)
# clear all local variables
LOCAL_FLAGS :=
LOCAL_CFLAGS :=
LOCAL_CPPFLAGS :=
LOCAL_ASFLAGS :=
LOCAL_SRCS :=
LOCAL_CHS :=
LOCAL_CPPHS :=

View File

@@ -36,6 +36,7 @@ group("drivers") {
"char/mem",
"char/quickstart",
"char/random",
"char/trace",
"char/video",
"mtd/multi_partition",
]
@@ -49,6 +50,7 @@ config("public") {
"char/quickstart:public",
"char/random:public",
"char/video:public",
"char/trace:public",
"mtd/multi_partition:public",
]
}

View File

@@ -165,6 +165,10 @@ extern "C" {
#define DISK_ATA_GET_MODEL 21 /* Get model name */
#define DISK_ATA_GET_SN 22 /* Get serial number */
#ifdef LOSCFG_FS_FAT_CACHE
#define DISK_DIRECT_BUFFER_SIZE 4 /* los_disk direct io buffer when bcache is off */
#endif
typedef enum _disk_status_ {
STAT_UNUSED,
STAT_INUSED,
@@ -187,6 +191,9 @@ typedef struct _los_disk_ {
CHAR *disk_name;
LOS_DL_LIST head; /* link head of all the partitions */
struct pthread_mutex disk_mutex;
#ifndef LOSCFG_FS_FAT_CACHE
UINT8 *buff;
#endif
} los_disk;
typedef struct _los_part_ {

View File

@@ -36,6 +36,10 @@
#include "sys/mount.h"
#include "linux/spinlock.h"
#include "path_cache.h"
#ifndef LOSCFG_FS_FAT_CACHE
#include "los_vm_common.h"
#include "user_copy.h"
#endif
los_disk g_sysDisk[SYS_MAX_DISK];
los_part g_sysPart[SYS_MAX_PART];
@@ -799,6 +803,78 @@ INT32 DiskPartitionRegister(los_disk *disk)
return ENOERR;
}
#ifndef LOSCFG_FS_FAT_CACHE
static INT32 disk_read_directly(los_disk *disk, VOID *buf, UINT64 sector, UINT32 count)
{
INT32 result = VFS_ERROR;
struct block_operations *bops = (struct block_operations *)((struct drv_data *)disk->dev->data)->ops;
if ((bops == NULL) || (bops->read == NULL)) {
return VFS_ERROR;
}
if (LOS_IsUserAddressRange((VADDR_T)buf, count * disk->sector_size)) {
UINT32 cnt = 0;
UINT8 *buffer = disk->buff;
for (; count != 0; count -= cnt) {
cnt = (count > DISK_DIRECT_BUFFER_SIZE) ? DISK_DIRECT_BUFFER_SIZE : count;
result = bops->read(disk->dev, buffer, sector, cnt);
if (result == (INT32)cnt) {
result = ENOERR;
} else {
break;
}
if (LOS_CopyFromKernel(buf, disk->sector_size * cnt, buffer, disk->sector_size * cnt)) {
result = VFS_ERROR;
break;
}
buf = (UINT8 *)buf + disk->sector_size * cnt;
sector += cnt;
}
} else {
result = bops->read(disk->dev, buf, sector, count);
if (result == count) {
result = ENOERR;
}
}
return result;
}
static INT32 disk_write_directly(los_disk *disk, const VOID *buf, UINT64 sector, UINT32 count)
{
struct block_operations *bops = (struct block_operations *)((struct drv_data *)disk->dev->data)->ops;
INT32 result = VFS_ERROR;
if ((bops == NULL) || (bops->read == NULL)) {
return VFS_ERROR;
}
if (LOS_IsUserAddressRange((VADDR_T)buf, count * disk->sector_size)) {
UINT32 cnt = 0;
UINT8 *buffer = disk->buff;
for (; count != 0; count -= cnt) {
cnt = (count > DISK_DIRECT_BUFFER_SIZE) ? DISK_DIRECT_BUFFER_SIZE : count;
if (LOS_CopyToKernel(buffer, disk->sector_size * cnt, buf, disk->sector_size * cnt)) {
result = VFS_ERROR;
break;
}
result = bops->write(disk->dev, buffer, sector, cnt);
if (result == (INT32)cnt) {
result = ENOERR;
} else {
break;
}
buf = (UINT8 *)buf + disk->sector_size * cnt;
sector += cnt;
}
} else {
result = bops->write(disk->dev, buf, sector, count);
if (result == count) {
result = ENOERR;
}
}
return result;
}
#endif
INT32 los_disk_read(INT32 drvID, VOID *buf, UINT64 sector, UINT32 count, BOOL useRead)
{
#ifdef LOSCFG_FS_FAT_CACHE
@@ -837,21 +913,14 @@ INT32 los_disk_read(INT32 drvID, VOID *buf, UINT64 sector, UINT32 count, BOOL us
PRINT_ERR("los_disk_read read err = %d, sector = %llu, len = %u\n", result, sector, len);
}
} else {
#endif
result = VFS_ERROR;
}
#else
if (disk->dev == NULL) {
goto ERROR_HANDLE;
}
struct block_operations *bops = (struct block_operations *)((struct drv_data *)disk->dev->data)->ops;
if ((bops != NULL) && (bops->read != NULL)) {
result = bops->read(disk->dev, (UINT8 *)buf, sector, count);
if (result == (INT32)count) {
result = ENOERR;
}
}
#ifdef LOSCFG_FS_FAT_CACHE
}
result = disk_read_directly(disk, buf, sector, count);
#endif
if (result != ENOERR) {
goto ERROR_HANDLE;
}
@@ -900,18 +969,14 @@ INT32 los_disk_write(INT32 drvID, const VOID *buf, UINT64 sector, UINT32 count)
PRINT_ERR("los_disk_write write err = %d, sector = %llu, len = %u\n", result, sector, len);
}
} else {
#endif
struct block_operations *bops = (struct block_operations *)((struct drv_data *)disk->dev->data)->ops;
if ((bops != NULL) && (bops->write != NULL)) {
result = bops->write(disk->dev, (UINT8 *)buf, sector, count);
if (result == (INT32)count) {
result = ENOERR;
}
result = VFS_ERROR;
}
#ifdef LOSCFG_FS_FAT_CACHE
#else
if (disk->dev == NULL) {
goto ERROR_HANDLE;
}
result = disk_write_directly(disk, buf, sector, count);
#endif
if (result != ENOERR) {
goto ERROR_HANDLE;
}
@@ -1153,7 +1218,8 @@ ERROR_HANDLE:
INT32 los_disk_cache_clear(INT32 drvID)
{
INT32 result;
INT32 result = ENOERR;
#ifdef LOSCFG_FS_FAT_CACHE
los_part *part = get_part(drvID);
los_disk *disk = NULL;
@@ -1161,7 +1227,7 @@ INT32 los_disk_cache_clear(INT32 drvID)
return VFS_ERROR;
}
result = OsSdSync(part->disk_id);
if (result != 0) {
if (result != ENOERR) {
PRINTK("[ERROR]disk_cache_clear SD sync failed!\n");
return result;
}
@@ -1174,7 +1240,7 @@ INT32 los_disk_cache_clear(INT32 drvID)
DISK_LOCK(&disk->disk_mutex);
result = BcacheClearCache(disk->bcache);
DISK_UNLOCK(&disk->disk_mutex);
#endif
return result;
}
@@ -1324,6 +1390,10 @@ static INT32 DiskDeinit(los_disk *disk)
#ifdef LOSCFG_FS_FAT_CACHE
DiskCacheDeinit(disk);
#else
if (disk->buff != NULL) {
free(disk->buff);
}
#endif
disk->dev = NULL;
@@ -1344,12 +1414,15 @@ static INT32 DiskDeinit(los_disk *disk)
return ENOERR;
}
static VOID OsDiskInitSub(const CHAR *diskName, INT32 diskID, los_disk *disk,
struct geometry *diskInfo, struct Vnode *blkDriver)
static UINT32 OsDiskInitSub(const CHAR *diskName, INT32 diskID, los_disk *disk,
struct geometry *diskInfo, struct Vnode *blkDriver)
{
pthread_mutexattr_t attr;
#ifdef LOSCFG_FS_FAT_CACHE
OsBcache *bc = DiskCacheInit((UINT32)diskID, diskInfo, blkDriver);
if (bc == NULL) {
return VFS_ERROR;
}
disk->bcache = bc;
#endif
@@ -1358,6 +1431,16 @@ static VOID OsDiskInitSub(const CHAR *diskName, INT32 diskID, los_disk *disk,
(VOID)pthread_mutex_init(&disk->disk_mutex, &attr);
DiskStructInit(diskName, diskID, diskInfo, blkDriver, disk);
#ifndef LOSCFG_FS_FAT_CACHE
disk->buff = malloc(diskInfo->geo_sectorsize * DISK_DIRECT_BUFFER_SIZE);
if (disk->buff == NULL) {
PRINT_ERR("OsDiskInitSub: direct buffer of disk init failed\n");
return VFS_ERROR;
}
#endif
return ENOERR;
}
INT32 los_disk_init(const CHAR *diskName, const struct block_operations *bops,
@@ -1382,14 +1465,12 @@ INT32 los_disk_init(const CHAR *diskName, const struct block_operations *bops,
ret = VnodeLookup(diskName, &blkDriver, 0);
if (ret < 0) {
VnodeDrop();
PRINT_ERR("disk_init : find %s fail!\n", diskName);
ret = ENOENT;
goto DISK_FIND_ERROR;
}
struct block_operations *bops2 = (struct block_operations *)((struct drv_data *)blkDriver->data)->ops;
if ((bops2 == NULL) || (bops2->geometry == NULL) ||
(bops2->geometry(blkDriver, &diskInfo) != 0)) {
if ((bops2 == NULL) || (bops2->geometry == NULL) || (bops2->geometry(blkDriver, &diskInfo) != 0)) {
goto DISK_BLKDRIVER_ERROR;
}
@@ -1397,7 +1478,12 @@ INT32 los_disk_init(const CHAR *diskName, const struct block_operations *bops,
goto DISK_BLKDRIVER_ERROR;
}
OsDiskInitSub(diskName, diskID, disk, &diskInfo, blkDriver);
ret = OsDiskInitSub(diskName, diskID, disk, &diskInfo, blkDriver);
if (ret != ENOERR) {
(VOID)DiskDeinit(disk);
VnodeDrop();
return VFS_ERROR;
}
VnodeDrop();
if (DiskDivideAndPartitionRegister(info, disk) != ENOERR) {
(VOID)DiskDeinit(disk);

View File

@@ -1,5 +1,3 @@
#!/bin/bash
#
# Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
# Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
#
@@ -29,31 +27,16 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
set -e
declare CROSS_COMPILER="$1"
declare HMOS_TOP_DIR="$2"
declare gcc_path=${HMOS_TOP_DIR}/../../prebuilts/gcc/linux-x86/arm/arm-linux-ohoseabi-gcc
declare windows_gcc_path=${HMOS_TOP_DIR}/../../prebuilts/gcc/win-x86/arm/arm-linux-ohoseabi-gcc
function get_compiler_path()
{
local system=$(uname -s)
local user_gcc="${CROSS_COMPILER}"gcc
local gcc_install_path=$(which "${user_gcc}")
import("//kernel/liteos_a/liteos.gni")
if [ "$system" != "Linux" ] ; then
if [ -e "${windows_gcc_path}" ] ; then
gcc_install_path=$windows_gcc_path
else
gcc_install_path=$(dirname $gcc_install_path)/../
fi
else
if [ -e "${gcc_path}" ] ; then
gcc_install_path=$gcc_path
else
gcc_install_path=$(dirname $gcc_install_path)/../
fi
fi
module_switch = defined(LOSCFG_DRIVERS_TRACE)
module_name = "trace_dev"
kernel_module(module_name) {
sources = [ "src/trace.c" ]
echo "$gcc_install_path"
public_configs = [ ":public" ]
}
config("public") {
include_dirs = [ "include" ]
}
get_compiler_path

View File

@@ -0,0 +1,6 @@
config DRIVERS_TRACE
bool "Enable TRACE DRIVER"
default y
depends on DRIVERS && FS_VFS && KERNEL_TRACE
help
Answer Y to enable LiteOS support trace in userspace.

View File

@@ -27,20 +27,14 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
APP_SUBDIRS :=
include $(LITEOSTOPDIR)/config.mk
##build modules config##
MODULE_NAME := trace_dev
ifeq ($(LOSCFG_SHELL), y)
APP_SUBDIRS += shell
#APP_SUBDIRS += mksh
#APP_SUBDIRS += toybox
endif
LOCAL_SRCS := $(wildcard src/*.c)
ifeq ($(LOSCFG_USER_INIT_DEBUG), y)
APP_SUBDIRS += init
endif
LOCAL_INCLUDE := -I $(LITEOSTOPDIR)/drivers/char/trace/include
ifeq ($(LOSCFG_NET_LWIP_SACK_TFTP), y)
APP_SUBDIRS += tftp
endif
LOCAL_FLAGS := $(LOCAL_INCLUDE) $(LITEOS_GCOV_OPTS)
include $(MODULE)

View File

@@ -0,0 +1,49 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __LOS_DEV_TRACE_H__
#define __LOS_DEV_TRACE_H__
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
int DevTraceRegister(void);
#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */
#endif

View File

@@ -0,0 +1,160 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "fcntl.h"
#include "linux/kernel.h"
#include "sys/ioctl.h"
#include "fs/driver.h"
#include "los_dev_trace.h"
#include "los_trace.h"
#include "los_hook.h"
#include "los_init.h"
#define TRACE_DRIVER "/dev/trace"
#define TRACE_DRIVER_MODE 0666
/* trace ioctl */
#define TRACE_IOC_MAGIC 'T'
#define TRACE_START _IO(TRACE_IOC_MAGIC, 1)
#define TRACE_STOP _IO(TRACE_IOC_MAGIC, 2)
#define TRACE_RESET _IO(TRACE_IOC_MAGIC, 3)
#define TRACE_DUMP _IO(TRACE_IOC_MAGIC, 4)
#define TRACE_SET_MASK _IO(TRACE_IOC_MAGIC, 5)
static int TraceOpen(struct file *filep)
{
return 0;
}
static int TraceClose(struct file *filep)
{
return 0;
}
static ssize_t TraceRead(struct file *filep, char *buffer, size_t buflen)
{
/* trace record buffer read */
ssize_t len = buflen;
OfflineHead *records;
int ret;
int realLen;
if (len % sizeof(unsigned int)) {
PRINT_ERR("Buffer size not aligned by 4 bytes\n");
return -EINVAL;
}
records = LOS_TraceRecordGet();
if (records == NULL) {
PRINT_ERR("Trace read failed, check whether trace mode is set to offline\n");
return -EINVAL;
}
realLen = buflen < records->totalLen ? buflen : records->totalLen;
ret = LOS_CopyFromKernel((void *)buffer, buflen, (void *)records, realLen);
if (ret != 0) {
return -EINVAL;
}
return realLen;
}
static ssize_t TraceWrite(struct file *filep, const char *buffer, size_t buflen)
{
/* trace usr event here */
int ret;
UsrEventInfo *info = NULL;
int infoLen = sizeof(UsrEventInfo);
if (buflen != infoLen) {
PRINT_ERR("Buffer size not %d bytes\n", infoLen);
return -EINVAL;
}
info = LOS_MemAlloc(m_aucSysMem0, infoLen);
if (info == NULL) {
return -ENOMEM;
}
memset_s(info, infoLen, 0, infoLen);
ret = LOS_CopyToKernel(info, infoLen, buffer, buflen);
if (ret != 0) {
LOS_MemFree(m_aucSysMem0, info);
return -EINVAL;
}
OsHookCall(LOS_HOOK_TYPE_USR_EVENT, info, infoLen);
return 0;
}
static int TraceIoctl(struct file *filep, int cmd, unsigned long arg)
{
switch (cmd) {
case TRACE_START:
return LOS_TraceStart();
case TRACE_STOP:
LOS_TraceStop();
break;
case TRACE_RESET:
LOS_TraceReset();
break;
case TRACE_DUMP:
LOS_TraceRecordDump((BOOL)arg);
break;
case TRACE_SET_MASK:
LOS_TraceEventMaskSet((UINT32)arg);
break;
default:
PRINT_ERR("Unknown trace ioctl cmd:%d\n", cmd);
return -EINVAL;
}
return 0;
}
static const struct file_operations_vfs g_traceDevOps = {
TraceOpen, /* open */
TraceClose, /* close */
TraceRead, /* read */
TraceWrite, /* write */
NULL, /* seek */
TraceIoctl, /* ioctl */
NULL, /* mmap */
#ifndef CONFIG_DISABLE_POLL
NULL, /* poll */
#endif
NULL, /* unlink */
};
int DevTraceRegister(void)
{
return register_driver(TRACE_DRIVER, &g_traceDevOps, TRACE_DRIVER_MODE, 0); /* 0666: file mode */
}
LOS_MODULE_INIT(DevTraceRegister, LOS_INIT_LEVEL_KMOD_EXTENDED);

View File

@@ -37,10 +37,7 @@ kernel_module(module_name) {
"src/mtd_shellcmd.c",
]
include_dirs = [
"$LITEOSTOPDIR/fs/jffs2/include",
"//device/hisilicon/drivers/include/mtd/common/include",
]
include_dirs = [ "$LITEOSTOPDIR/fs/jffs2/include" ]
if (defined(LOSCFG_PLATFORM_QEMU_ARM_VIRT_CA7)) {
include_dirs += [ "//device/qemu/drivers/cfiflash" ]

View File

@@ -35,8 +35,8 @@ LOCAL_SRCS := $(wildcard src/*.c)
LOCAL_INCLUDE := \
-I $(LITEOSTOPDIR)/fs/jffs2/include \
-I $(LITEOSTOPDIR)/drivers/mtd/multi_partition/include \
-I $(LITEOSTOPDIR)/../../device/hisilicon/drivers/include/mtd/common/include
-I $(LITEOSTOPDIR)/../../drivers/framework/model/storage/include \
-I $(LITEOSTOPDIR)/../../drivers/adapter/khdf/liteos/model/storage/include
ifeq ($(LOSCFG_PLATFORM_QEMU_ARM_VIRT_CA7), y)
LOCAL_INCLUDE += -I $(LITEOSTOPDIR)/../../device/qemu/drivers/cfiflash

View File

@@ -37,7 +37,7 @@
#include "los_config.h"
#include "los_mux.h"
#include "fs/driver.h"
#include "mtd_common.h"
#include "mtd_legacy_lite.h"
#ifdef LOSCFG_PLATFORM_QEMU_ARM_VIRT_CA7
#include "cfiflash.h"

View File

@@ -39,7 +39,6 @@ LOCAL_INCLUDE := \
-I $(LITEOSTOPDIR)/fs/fat/os_adapt \
-I $(LITEOSTOPDIR)/fs/fat/virpart/include \
-I $(LITEOSTOPDIR)/fs/vfs \
-I $(LITEOSTHIRDPARTY)/NuttX/include
LOCAL_FLAGS := $(LOCAL_INCLUDE) $(LITEOS_GCOV_OPTS)

View File

@@ -47,6 +47,7 @@
#include "user_copy.h"
#include "los_vm_filemap.h"
#include "los_hash.h"
#include "los_vm_common.h"
#include <time.h>
#include <errno.h>
#include <dirent.h>
@@ -1848,6 +1849,7 @@ int fatfs_mkfs (struct Vnode *device, int sectors, int option)
BYTE *work_buff = NULL;
los_part *part = NULL;
FRESULT result;
MKFS_PARM opt = {0};
int ret;
part = los_part_find(device);
@@ -1872,7 +1874,9 @@ int fatfs_mkfs (struct Vnode *device, int sectors, int option)
return -ENOMEM;
}
result = _mkfs(part, sectors, option, work_buff, FF_MAX_SS);
opt.n_sect = sectors;
opt.fmt = (BYTE)option;
result = _mkfs(part, &opt, work_buff, FF_MAX_SS);
free(work_buff);
if (result != FR_OK) {
return -fatfs_2_vfs(result);
@@ -2032,45 +2036,18 @@ static UINT get_oldest_time(DIR_FILE df[], DWORD *oldest_time, UINT len)
return index;
}
int fatfs_fscheck(struct Vnode* vp, struct fs_dirent_s *dir)
static FRESULT fscheck(DIR *dp)
{
FATFS *fs = (FATFS *)vp->originMount->data;
DIR_FILE df[CHECK_FILE_NUM] = {0};
DIR *dp = NULL;
FILINFO *finfo = &(((DIR_FILE *)(vp->data))->fno);
FILINFO fno;
DWORD old_time = -1;
DWORD time;
UINT count;
UINT index = 0;
los_part *part = NULL;
UINT count;
DWORD time;
DWORD old_time = -1;
FRESULT result;
int ret;
if (fs->fs_type != FS_FAT32) {
return -EINVAL;
}
if ((finfo->fattrib & AM_DIR) == 0) {
return -ENOTDIR;
}
ret = fatfs_opendir(vp, dir);
if (ret < 0) {
return ret;
}
ret = lock_fs(fs);
if (ret == FALSE) {
result = FR_TIMEOUT;
goto ERROR_WITH_DIR;
}
dp = (DIR *)dir->u.fs_dir;
dp->obj.id = fs->id;
for (count = 0; count < CHECK_FILE_NUM; count++) {
if ((result = f_readdir(dp, &fno)) != FR_OK) {
goto ERROR_UNLOCK;
return result;
} else {
if (fno.fname[0] == 0 || fno.fname[0] == (TCHAR)0xFF) {
break;
@@ -2095,15 +2072,50 @@ int fatfs_fscheck(struct Vnode* vp, struct fs_dirent_s *dir)
index = get_oldest_time(df, &old_time, CHECK_FILE_NUM);
}
}
if (result != FR_OK) {
goto ERROR_UNLOCK;
index = 0;
while (result == FR_OK && index < count) {
result = f_fcheckfat(&df[index]);
++index;
}
for (index = 0; index < count; index++) {
result = f_fcheckfat(&df[index]);
if (result != FR_OK) {
goto ERROR_UNLOCK;
}
return result;
}
int fatfs_fscheck(struct Vnode* vp, struct fs_dirent_s *dir)
{
FATFS *fs = (FATFS *)vp->originMount->data;
DIR *dp = NULL;
FILINFO *finfo = &(((DIR_FILE *)(vp->data))->fno);
#ifdef LOSCFG_FS_FAT_CACHE
los_part *part = NULL;
#endif
FRESULT result;
int ret;
if (fs->fs_type != FS_FAT32) {
return -EINVAL;
}
if ((finfo->fattrib & AM_DIR) == 0) {
return -ENOTDIR;
}
ret = fatfs_opendir(vp, dir);
if (ret < 0) {
return ret;
}
ret = lock_fs(fs);
if (ret == FALSE) {
result = FR_TIMEOUT;
goto ERROR_WITH_DIR;
}
dp = (DIR *)dir->u.fs_dir;
dp->obj.id = fs->id;
result = fscheck(dp);
if (result != FR_OK) {
goto ERROR_UNLOCK;
}
unlock_fs(fs, FR_OK);
@@ -2180,6 +2192,207 @@ ERROUT:
return -fatfs_2_vfs(res);
}
ssize_t fatfs_readpage(struct Vnode *vnode, char *buff, off_t pos)
{
FATFS *fs = (FATFS *)(vnode->originMount->data);
DIR_FILE *dfp = (DIR_FILE *)(vnode->data);
FILINFO *finfo = &(dfp->fno);
FAT_ENTRY *ep = &(dfp->fat_entry);
DWORD clust;
DWORD sclust;
QWORD sect;
QWORD step;
QWORD n;
size_t position; /* byte offset */
BYTE *buf = (BYTE *)buff;
size_t buflen = PAGE_SIZE;
FRESULT result;
int ret;
ret = lock_fs(fs);
if (ret == FALSE) {
result = FR_TIMEOUT;
goto ERROR_OUT;
}
if (finfo->fsize <= pos) {
result = FR_OK;
goto ERROR_UNLOCK;
}
if (ep->clst == 0) {
ep->clst = finfo->sclst;
}
if (pos >= ep->pos) {
clust = ep->clst;
position = ep->pos;
} else {
clust = finfo->sclst;
position = 0;
}
/* Get to the current cluster */
n = pos / SS(fs) / fs->csize - position / SS(fs) / fs->csize;
while (n--) {
clust = get_fat(&(dfp->f_dir.obj), clust);
if ((clust == BAD_CLUSTER) || (clust == DISK_ERROR)) {
result = FR_DISK_ERR;
goto ERROR_UNLOCK;
}
}
/* Get to the currnet sector */
sect = clst2sect(fs, clust);
sect += (pos / SS(fs)) & (fs->csize - 1);
/* How many sectors do we need to read once */
if (fs->csize < buflen / SS(fs)) {
step = fs->csize;
} else {
step = buflen / SS(fs);
}
n = 0;
sclust = clust;
while (n < buflen / SS(fs)) {
if (disk_read(fs->pdrv, buf, sect, step) != RES_OK) {
result = FR_DISK_ERR;
goto ERROR_UNLOCK;
}
n += step;
if (n >= buflen / SS(fs)) {
break;
}
/* As cluster size is aligned, it must jump to next cluster when cluster size is less than pagesize */
clust = get_fat(&(dfp->f_dir.obj), clust);
if ((clust == BAD_CLUSTER) || (clust == DISK_ERROR)) {
result = FR_DISK_ERR;
goto ERROR_UNLOCK;
} else if (fatfs_is_last_cluster(fs, clust)) {
break; /* read end */
}
sect = clst2sect(fs, clust);
buf += step * SS(fs);
}
ep->clst = sclust;
ep->pos = pos;
unlock_fs(fs, FR_OK);
return (ssize_t)min(finfo->fsize - pos, n * SS(fs));
ERROR_UNLOCK:
unlock_fs(fs, result);
ERROR_OUT:
return -fatfs_2_vfs(result);
}
ssize_t fatfs_writepage(struct Vnode *vnode, char *buff, off_t pos, size_t buflen)
{
FATFS *fs = (FATFS *)(vnode->originMount->data);
DIR_FILE *dfp = (DIR_FILE *)(vnode->data);
FILINFO *finfo = &(dfp->fno);
FAT_ENTRY *ep = &(dfp->fat_entry);
DWORD clust;
DWORD sclst;
QWORD sect;
QWORD step;
QWORD n;
size_t position; /* byte offset */
BYTE *buf = (BYTE *)buff;
FRESULT result;
FIL fil;
int ret;
ret = lock_fs(fs);
if (ret == FALSE) {
result = FR_TIMEOUT;
goto ERROR_OUT;
}
if (finfo->fsize <= pos) {
result = FR_OK;
goto ERROR_UNLOCK;
}
if (ep->clst == 0) {
ep->clst = finfo->sclst;
}
if (pos >= ep->pos) {
clust = ep->clst;
position = ep->pos;
} else {
clust = finfo->sclst;
position = 0;
}
/* Get to the current cluster */
n = pos / SS(fs) / fs->csize - position / SS(fs) / fs->csize;
while (n--) {
clust = get_fat(&(dfp->f_dir.obj), clust);
if ((clust == BAD_CLUSTER) || (clust == DISK_ERROR)) {
result = FR_DISK_ERR;
goto ERROR_UNLOCK;
}
}
/* Get to the currnet sector */
sect = clst2sect(fs, clust);
sect += (pos / SS(fs)) & (fs->csize - 1);
/* How many sectors do we need to read once */
if (fs->csize < buflen / SS(fs)) {
step = fs->csize;
} else {
step = buflen / SS(fs);
}
n = 0;
sclst = clust;
while (n < buflen / SS(fs)) {
if (disk_write(fs->pdrv, buf, sect, step) != RES_OK) {
result = FR_DISK_ERR;
goto ERROR_UNLOCK;
}
n += step;
if (n >= buflen / SS(fs)) {
break;
}
/* As cluster size is aligned, it must jump to next cluster when cluster size is less than pagesize */
clust = get_fat(&(dfp->f_dir.obj), clust);
if ((clust == BAD_CLUSTER) || (clust == DISK_ERROR)) {
result = FR_DISK_ERR;
goto ERROR_UNLOCK;
} else if (fatfs_is_last_cluster(fs, clust)) {
break; /* read end */
}
sect = clst2sect(fs, clust);
buf += step * SS(fs);
}
ep->clst = sclst;
ep->pos = pos;
fil.obj.fs = fs;
if (update_filbuff(finfo, &fil, NULL) < 0) {
result = FR_DISK_ERR;
goto ERROR_UNLOCK;
}
unlock_fs(fs, FR_OK);
return (ssize_t)min(finfo->fsize - pos, n * SS(fs));
ERROR_UNLOCK:
unlock_fs(fs, result);
ERROR_OUT:
return -fatfs_2_vfs(result);
}
struct VnodeOps fatfs_vops = {
/* file ops */
.Getattr = fatfs_stat,
@@ -2187,6 +2400,8 @@ struct VnodeOps fatfs_vops = {
.Lookup = fatfs_lookup,
.Rename = fatfs_rename,
.Create = fatfs_create,
.ReadPage = fatfs_readpage,
.WritePage = fatfs_writepage,
.Unlink = fatfs_unlink,
.Reclaim = fatfs_reclaim,
.Truncate = fatfs_truncate,

View File

@@ -146,7 +146,7 @@ int fatfs_fscheck(struct Vnode* vnode, struct fs_dirent_s *dir);
FRESULT find_fat_partition(FATFS *fs, los_part *part, BYTE *format, QWORD *start_sector);
FRESULT init_fatobj(FATFS *fs, BYTE fmt, QWORD start_sector);
FRESULT _mkfs(los_part *partition, int sector, int opt, BYTE *work, UINT len);
FRESULT _mkfs(los_part *partition, const MKFS_PARM *opt, BYTE *work, UINT len);
#ifdef __cplusplus
#if __cplusplus

View File

@@ -525,7 +525,7 @@ FRESULT f_checkvirpart(FATFS *fs, const TCHAR *path, BYTE vol)
}
/* Lock the filesystem object */
res = find_volume(&path, &fs, FA_WRITE); /* Update the filesystem info to the parent fs */
res = mount_volume(&path, &fs, FA_WRITE); /* Update the filesystem info to the parent fs */
if (res != FR_OK) {
LEAVE_FF(fs, res);
}
@@ -683,7 +683,7 @@ FRESULT f_makevirpart(FATFS *fs, const TCHAR *path, BYTE vol)
}
/* Lock the filesystem object */
res = find_volume(&path, &fs, FA_WRITE); /* Update the filesystem info to the parent fs */
res = mount_volume(&path, &fs, FA_WRITE); /* Update the filesystem info to the parent fs */
if (res != FR_OK) {
LEAVE_FF(fs, res);
}
@@ -774,7 +774,7 @@ FRESULT f_getvirfree(const TCHAR *path, DWORD *nclst, DWORD *cclst)
DIR dj;
/* Find volume to Update the global FSINFO */
res = find_volume(&path, &fs, 0);
res = mount_volume(&path, &fs, 0);
if (res != FR_OK) {
LEAVE_FF(fs, res);
}

View File

@@ -41,81 +41,6 @@ extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
/* vfs/fs_file_mapping.c ****************************************************/
/****************************************************************************
* Name: init_file_mapping
*
* Description:
* Init the global management structure of path <-> page_mapping
*
****************************************************************************/
extern UINT32 init_file_mapping(void);
/****************************************************************************
* Name: add_mapping
*
* Description:
* Create a new path <-> page_mapping mapping and add to global list.
*
****************************************************************************/
extern void add_mapping(struct file *filep, const char *fullpath);
/****************************************************************************
* Name: find_mapping
*
* Description:
* Find the page_mapping for path in global list.
*
****************************************************************************/
extern struct page_mapping *find_mapping(const char *path);
/****************************************************************************
* Name: remove_mapping
*
* Description:
* Drop all the page-caches for the file, and then remove mapping between
* the file and pagecache.
* ex_filp NULL: do not exclude any file, just matching the fullpath;
* ex_filp not NULL: exclude it, which means, ex_filp can be open.
*
****************************************************************************/
extern int remove_mapping(const char *fullpath);
/****************************************************************************
* Name: rename_mapping
*
* Description:
* Rename the mapping from global path <-> page_mapping list.
*
****************************************************************************/
extern void rename_mapping(const char *src, const char *dst);
/****************************************************************************
* Name: dec_mapping
*
* Description:
* Decrease the refcnt of mapping.
*
****************************************************************************/
extern void dec_mapping_nolock(struct page_mapping *mapping);
/****************************************************************************
* Name: update_file_path
*
* Description:
* Update the path in file descriptors when do renaming.
*
****************************************************************************/
extern int update_file_path(const char *old_path, const char *new_path);
/**
* @ingroup fs
* @brief Initializes the vfs filesystem

View File

@@ -201,13 +201,13 @@ int VfsJffs2Lookup(struct Vnode *parentVnode, const char *path, int len, struct
}
(void)VfsHashGet(parentVnode->originMount, node->i_ino, &newVnode, NULL, NULL);
LOS_MuxUnlock(&g_jffs2FsLock);
if (newVnode) {
if (newVnode->data == NULL) {
LOS_Panic("#####VfsHashGet error#####\n");
}
newVnode->parent = parentVnode;
*ppVnode = newVnode;
LOS_MuxUnlock(&g_jffs2FsLock);
return 0;
}
ret = VnodeAlloc(&g_jffs2Vops, &newVnode);
@@ -276,7 +276,7 @@ int VfsJffs2Close(struct file *filep)
return 0;
}
ssize_t VfsJffs2Read(struct file *filep, char *buffer, size_t bufLen)
ssize_t VfsJffs2ReadPage(struct Vnode *vnode, char *buffer, off_t off)
{
struct jffs2_inode *node = NULL;
struct jffs2_inode_info *f = NULL;
@@ -285,6 +285,32 @@ ssize_t VfsJffs2Read(struct file *filep, char *buffer, size_t bufLen)
LOS_MuxLock(&g_jffs2FsLock, (uint32_t)JFFS2_WAITING_FOREVER);
node = (struct jffs2_inode *)vnode->data;
f = JFFS2_INODE_INFO(node);
c = JFFS2_SB_INFO(node->i_sb);
off_t pos = min(node->i_size, off);
ssize_t len = min(PAGE_SIZE, (node->i_size - pos));
ret = jffs2_read_inode_range(c, f, (unsigned char *)buffer, off, len);
if (ret) {
LOS_MuxUnlock(&g_jffs2FsLock);
return ret;
}
node->i_atime = Jffs2CurSec();
LOS_MuxUnlock(&g_jffs2FsLock);
return len;
}
ssize_t VfsJffs2Read(struct file *filep, char *buffer, size_t bufLen)
{
struct jffs2_inode *node = NULL;
struct jffs2_inode_info *f = NULL;
struct jffs2_sb_info *c = NULL;
int ret;
LOS_MuxLock(&g_jffs2FsLock, (uint32_t)JFFS2_WAITING_FOREVER);
node = (struct jffs2_inode *)filep->f_vnode->data;
f = JFFS2_INODE_INFO(node);
c = JFFS2_SB_INFO(node->i_sb);
@@ -293,7 +319,6 @@ ssize_t VfsJffs2Read(struct file *filep, char *buffer, size_t bufLen)
off_t len = min(bufLen, (node->i_size - pos));
ret = jffs2_read_inode_range(c, f, (unsigned char *)buffer, filep->f_pos, len);
if (ret) {
PRINTK("VfsJffs2Read(): read_inode_range failed %d\n", ret);
LOS_MuxUnlock(&g_jffs2FsLock);
return ret;
}
@@ -305,6 +330,59 @@ ssize_t VfsJffs2Read(struct file *filep, char *buffer, size_t bufLen)
return len;
}
ssize_t VfsJffs2WritePage(struct Vnode *vnode, char *buffer, off_t pos, size_t buflen)
{
struct jffs2_inode *node = NULL;
struct jffs2_inode_info *f = NULL;
struct jffs2_sb_info *c = NULL;
struct jffs2_raw_inode ri = {0};
struct IATTR attr = {0};
int ret;
uint32_t writtenLen;
LOS_MuxLock(&g_jffs2FsLock, (uint32_t)JFFS2_WAITING_FOREVER);
node = (struct jffs2_inode *)vnode->data;
f = JFFS2_INODE_INFO(node);
c = JFFS2_SB_INFO(node->i_sb);
if (pos < 0) {
LOS_MuxUnlock(&g_jffs2FsLock);
return -EINVAL;
}
ri.ino = cpu_to_je32(f->inocache->ino);
ri.mode = cpu_to_jemode(node->i_mode);
ri.uid = cpu_to_je16(node->i_uid);
ri.gid = cpu_to_je16(node->i_gid);
ri.atime = ri.ctime = ri.mtime = cpu_to_je32(Jffs2CurSec());
if (pos > node->i_size) {
int err;
attr.attr_chg_valid = CHG_SIZE;
attr.attr_chg_size = pos;
err = jffs2_setattr(node, &attr);
if (err) {
LOS_MuxUnlock(&g_jffs2FsLock);
return err;
}
}
ri.isize = cpu_to_je32(node->i_size);
ret = jffs2_write_inode_range(c, f, &ri, (unsigned char *)buffer, pos, buflen, &writtenLen);
if (ret) {
node->i_mtime = node->i_ctime = je32_to_cpu(ri.mtime);
LOS_MuxUnlock(&g_jffs2FsLock);
return ret;
}
node->i_mtime = node->i_ctime = je32_to_cpu(ri.mtime);
LOS_MuxUnlock(&g_jffs2FsLock);
return (ssize_t)writtenLen;
}
ssize_t VfsJffs2Write(struct file *filep, const char *buffer, size_t bufLen)
{
struct jffs2_inode *node = NULL;
@@ -878,6 +956,8 @@ const struct MountOps jffs_operations = {
struct VnodeOps g_jffs2Vops = {
.Lookup = VfsJffs2Lookup,
.Create = VfsJffs2Create,
.ReadPage = VfsJffs2ReadPage,
.WritePage = VfsJffs2WritePage,
.Rename = VfsJffs2Rename,
.Mkdir = VfsJffs2Mkdir,
.Getattr = VfsJffs2Stat,

View File

@@ -3,5 +3,6 @@ config FS_NFS
default y
depends on FS_VFS
depends on NET_LWIP_SACK
depends on DEBUG_VERSION
help
Answer Y to enable LiteOS support nfs filesystem.

View File

@@ -32,7 +32,6 @@ include $(LITEOSTOPDIR)/config.mk
MODULE_NAME := $(notdir $(shell pwd))
LOCAL_SRCS := $(wildcard $(LITEOSTHIRDPARTY)/NuttX/fs/nfs/*.c)
LOCAL_INCLUDE := -I $(wildcard $(LITEOSTHIRDPARTY)/NuttX/include)
LOCAL_FLAGS := $(LOCAL_INCLUDE) $(LITEOS_GCOV_OPTS)

View File

@@ -35,7 +35,6 @@ kernel_module(module_name) {
sources = [
"os_adapt/fd_proc.c",
"os_adapt/fs_cache_proc.c",
"os_adapt/kernel_trace_proc.c",
"os_adapt/mounts_proc.c",
"os_adapt/power_proc.c",
"os_adapt/proc_init.c",

View File

@@ -51,8 +51,6 @@ void ProcVmmInit(void);
void ProcProcessInit(void);
void ProcKernelTraceInit(void);
int ProcMatch(unsigned int len, const char *name, struct ProcDirEntry *pde);
struct ProcDirEntry *ProcFindEntry(const char *path);

View File

@@ -53,6 +53,9 @@ extern "C" {
typedef unsigned short fmode_t;
#define PROC_ERROR (-1)
/* Default file mode for procfs */
#define PROCFS_DEFAULT_MODE 0550
/* 64bit hashes as llseek() offset (for directories) */
#define FMODE_64BITHASH ((fmode_t)0x400)
/* 32bit hashes as llseek() offset (for directories) */

View File

@@ -75,7 +75,7 @@ static void FillFdInfo(struct SeqBuf *seqBuf, struct filelist *fileList, unsigne
}
if (hasPrivilege) {
(void)LosBufPrintf(seqBuf, "%u\t%d\t%6d <%d>\t%s\n", pid, fd, sysFd, filp->f_refcount, name);
(void)LosBufPrintf(seqBuf, "%u\t%d\t%6d <%lu>\t%s\n", pid, fd, sysFd, filp ? filp->f_refcount : 1, name);
} else {
(void)LosBufPrintf(seqBuf, "%u\t%d\t%s\n", pid, fd, name);
}

View File

@@ -71,9 +71,9 @@ static int VnodeListProcess(struct SeqBuf *buf, LIST_HEAD* list)
struct Vnode *nextItem = NULL;
LOS_DL_LIST_FOR_EACH_ENTRY_SAFE(item, nextItem, list, struct Vnode, actFreeEntry) {
LosBufPrintf(buf, "%-10p %-10p %-10p %10p 0x%08x %-3d %-4s %-3d %-3d %o\n",
LosBufPrintf(buf, "%-10p %-10p %-10p %10p 0x%08x %-3d %-4s %-3d %-3d %-8o\t%s\n",
item, item->parent, item->data, item->vop, item->hash, item->useCount,
VnodeTypeToStr(item->type), item->gid, item->uid, item->mode);
VnodeTypeToStr(item->type), item->gid, item->uid, item->mode, item->filePath);
count++;
}
@@ -104,7 +104,7 @@ static int PageCacheEntryProcess(struct SeqBuf *buf, struct page_mapping *mappin
int total = 0;
LosFilePage *fpage = NULL;
if (mapping == NULL) {
if (mapping->nrpages == 0) {
LosBufPrintf(buf, "null]\n");
return total;
}
@@ -119,18 +119,18 @@ static int PageCacheEntryProcess(struct SeqBuf *buf, struct page_mapping *mappin
static int PageCacheMapProcess(struct SeqBuf *buf)
{
struct file_map *mapList = GetFileMappingList();
char *name = NULL;
struct file_map *curMap = NULL;
LIST_HEAD *vnodeList = GetVnodeActiveList();
struct page_mapping *mapping = NULL;
struct Vnode *vnode = NULL;
int total = 0;
(VOID)LOS_MuxLock(&mapList->lock, LOS_WAIT_FOREVER);
LOS_DL_LIST_FOR_EACH_ENTRY(curMap, &mapList->head, struct file_map, head) {
name = curMap->rename ? curMap->rename: curMap->owner;
LosBufPrintf(buf, "%s:[", name);
total += PageCacheEntryProcess(buf, &curMap->mapping);
VnodeHold();
LOS_DL_LIST_FOR_EACH_ENTRY(vnode, vnodeList, struct Vnode, actFreeEntry) {
mapping = &vnode->mapping;
LosBufPrintf(buf, "%p, %s:[", vnode, vnode->filePath);
total += PageCacheEntryProcess(buf, mapping);
}
(VOID)LOS_MuxUnlock(&mapList->lock);
VnodeDrop();
return total;
}

View File

@@ -45,7 +45,7 @@ void ProcFsInit(void)
{
int ret;
ret = mkdir(PROCFS_MOUNT_POINT, 0);
ret = mkdir(PROCFS_MOUNT_POINT, PROCFS_DEFAULT_MODE);
if (ret < 0) {
PRINT_ERR("failed to mkdir %s, errno = %d\n", PROCFS_MOUNT_POINT, get_errno());
return;
@@ -63,7 +63,6 @@ void ProcFsInit(void)
#endif
ProcProcessInit();
ProcUptimeInit();
ProcKernelTraceInit();
ProcFsCacheInit();
ProcFdInit();
#ifdef LOSCFG_KERNEL_PM

View File

@@ -41,8 +41,6 @@
#include "los_tables.h"
#include "internal.h"
#define PROCFS_DEFAULT_MODE 0555
#ifdef LOSCFG_FS_PROC
static struct VnodeOps g_procfsVops;
static struct file_operations_vfs g_procfsFops;

View File

@@ -49,7 +49,7 @@ static struct ProcFile g_procPf = {
static struct ProcDirEntry g_procRootDirEntry = {
.nameLen = 5,
.mode = S_IFDIR | S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH,
.mode = S_IFDIR | PROCFS_DEFAULT_MODE,
.count = ATOMIC_INIT(1),
.procFileOps = NULL,
.parent = &g_procRootDirEntry,

View File

@@ -32,7 +32,6 @@ include $(LITEOSTOPDIR)/config.mk
MODULE_NAME := $(notdir $(shell pwd))
LOCAL_SRCS := $(wildcard $(LITEOSTHIRDPARTY)/NuttX/fs/tmpfs/*.c)
LOCAL_INCLUDE := -I $(wildcard $(LITEOSTHIRDPARTY)/NuttX/include)
LOCAL_FLAGS := $(LOCAL_INCLUDE) $(LITEOS_GCOV_OPTS)

View File

@@ -40,7 +40,6 @@ kernel_module(module_name) {
"operation/vfs_fallocate.c",
"operation/vfs_fallocate64.c",
"operation/vfs_fcntl.c",
"operation/vfs_file_mapping.c",
"operation/vfs_force_umount.c",
"operation/vfs_init.c",
"operation/vfs_other.c",
@@ -110,7 +109,10 @@ kernel_module(module_name) {
"$LITEOSTOPDIR/fs/vfs/vnode_hash.c",
]
include_dirs = [ "$LITEOSTOPDIR/syscall" ]
include_dirs = [
"$LITEOSTOPDIR/syscall",
"$LITEOSTOPDIR/fs/zpfs/include",
]
public_configs = [ ":public" ]
}

View File

@@ -101,6 +101,7 @@ LOCAL_INCLUDE := \
-I $(LITEOSTOPDIR)/drivers/mtd/multi_partition/include\
-I $(LITEOSTOPDIR)/fs/vfs/include/operation\
-I $(LITEOSTOPDIR)/syscall\
-I $(LITEOSTOPDIR)/fs/zpfs/include
ifeq ($(LOSCFG_FS_FAT), y)
LOCAL_INCLUDE += -I $(LITEOSTHIRDPARTY)/FatFs/source

View File

@@ -125,12 +125,16 @@ struct Vnode {
LIST_ENTRY actFreeEntry; /* vnode active/free list entry */
struct Mount *originMount; /* fs info about this vnode */
struct Mount *newMount; /* fs info about who mount on this vnode */
char *filePath; /* file path of the vnode */
struct page_mapping mapping; /* page mapping of the vnode */
};
struct VnodeOps {
int (*Create)(struct Vnode *parent, const char *name, int mode, struct Vnode **vnode);
int (*Lookup)(struct Vnode *parent, const char *name, int len, struct Vnode **vnode);
int (*Open)(struct Vnode *vnode, int fd, int mode, int flags);
ssize_t (*ReadPage)(struct Vnode *vnode, char *buffer, off_t pos);
ssize_t (*WritePage)(struct Vnode *vnode, char *buffer, off_t pos, size_t buflen);
int (*Close)(struct Vnode *vnode);
int (*Reclaim)(struct Vnode *vnode);
int (*Unlink)(struct Vnode *parent, struct Vnode *vnode, const char *fileName);
@@ -159,6 +163,7 @@ int VnodeDevInit(void);
int VnodeAlloc(struct VnodeOps *vop, struct Vnode **vnode);
int VnodeFree(struct Vnode *vnode);
int VnodeLookup(const char *path, struct Vnode **vnode, uint32_t flags);
int VnodeLookupAt(const char *path, struct Vnode **vnode, uint32_t flags, struct Vnode *orgVnode);
int VnodeHold(void);
int VnodeDrop(void);
void VnodeRefDec(struct Vnode *vnode);

View File

@@ -50,7 +50,10 @@ void CloseOnExec(struct files_struct *files)
if (FD_ISSET(i, files->fdt->proc_fds) &&
FD_ISSET(i, files->fdt->cloexec_fds)) {
sysFd = DisassociateProcessFd(i);
close(sysFd);
if (sysFd >= 0) {
close(sysFd);
}
FreeProcessFd(i);
}
}

View File

@@ -134,7 +134,7 @@ int fallocate64(int fd, int mode, off64_t offset, off64_t len)
return VFS_ERROR;
}
if (filep->f_oflags & O_DIRECTORY)
if ((unsigned int)filep->f_oflags & O_DIRECTORY)
{
set_errno(EBADF);
return VFS_ERROR;

View File

@@ -1,303 +0,0 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "fs/file.h"
#include "fs/file.h"
#include "fs/fs_operation.h"
#include "unistd.h"
#include "los_mux.h"
#include "los_list.h"
#include "los_atomic.h"
#include "los_vm_filemap.h"
#ifdef LOSCFG_KERNEL_VM
static struct file_map g_file_mapping = {0};
uint init_file_mapping()
{
uint ret;
LOS_ListInit(&g_file_mapping.head);
ret = LOS_MuxInit(&g_file_mapping.lock, NULL);
if (ret != LOS_OK) {
PRINT_ERR("Create mutex for file map of page cache failed, (ret=%u)\n", ret);
}
return ret;
}
static void clear_file_mapping(const struct page_mapping *mapping)
{
unsigned int i = 3; /* file start fd */
struct file *filp = NULL;
while (i < CONFIG_NFILE_DESCRIPTORS) {
filp = &tg_filelist.fl_files[i];
if (filp->f_mapping == mapping) {
filp->f_mapping = NULL;
}
i++;
}
}
static struct page_mapping *find_mapping_nolock(const char *fullpath)
{
char *map_name = NULL;
struct file_map *fmap = NULL;
int name_len = strlen(fullpath);
LOS_DL_LIST_FOR_EACH_ENTRY(fmap, &g_file_mapping.head, struct file_map, head) {
map_name = fmap->rename ? fmap->rename: fmap->owner;
if ((name_len == fmap->name_len) && !strcmp(map_name, fullpath)) {
return &fmap->mapping;
}
}
return NULL;
}
void add_mapping(struct file *filep, const char *fullpath)
{
int path_len;
status_t retval;
struct file_map *fmap = NULL;
struct page_mapping *mapping = NULL;
if (filep == NULL || fullpath == NULL) {
return;
}
(VOID)LOS_MuxLock(&g_file_mapping.lock, LOS_WAIT_FOREVER);
mapping = find_mapping_nolock(fullpath);
if (mapping) {
LOS_AtomicInc(&mapping->ref);
filep->f_mapping = mapping;
mapping->host = filep;
goto out;
}
path_len = strlen(fullpath);
fmap = (struct file_map *)zalloc(sizeof(struct file_map) + path_len + 1);
if (!fmap) {
PRINT_WARN("%s %d, Mem alloc failed.\n", __FUNCTION__, __LINE__);
goto out;
}
LOS_AtomicSet(&fmap->mapping.ref, 1);
fmap->name_len = path_len;
(void)strcpy_s(fmap->owner, path_len + 1, fullpath);
LOS_ListInit(&fmap->mapping.page_list);
LOS_SpinInit(&fmap->mapping.list_lock);
retval = LOS_MuxInit(&fmap->mapping.mux_lock, NULL);
if (retval != LOS_OK) {
PRINT_ERR("%s %d, Create mutex for mapping.mux_lock failed, status: %d\n", __FUNCTION__, __LINE__, retval);
goto out;
}
LOS_ListTailInsert(&g_file_mapping.head, &fmap->head);
filep->f_mapping = &fmap->mapping;
filep->f_mapping->host = filep;
out:
(VOID)LOS_MuxUnlock(&g_file_mapping.lock);
}
int remove_mapping_nolock(struct page_mapping *mapping)
{
struct file_map *fmap = NULL;
if (mapping == NULL) {
set_errno(EINVAL);
return EINVAL;
}
(VOID)LOS_MuxDestroy(&mapping->mux_lock);
clear_file_mapping(mapping);
OsFileCacheRemove(mapping);
fmap = LOS_DL_LIST_ENTRY(mapping, struct file_map, mapping);
LOS_ListDelete(&fmap->head);
if (fmap->rename) {
LOS_MemFree(m_aucSysMem0, fmap->rename);
}
LOS_MemFree(m_aucSysMem0, fmap);
return OK;
}
void dec_mapping_nolock(struct page_mapping *mapping)
{
if (mapping == NULL) {
return;
}
(VOID)LOS_MuxLock(&g_file_mapping.lock, LOS_WAIT_FOREVER);
if (LOS_AtomicRead(&mapping->ref) > 0) {
LOS_AtomicDec(&mapping->ref);
}
if (LOS_AtomicRead(&mapping->ref) <= 0) {
remove_mapping_nolock(mapping);
} else {
OsFileCacheFlush(mapping);
}
(VOID)LOS_MuxUnlock(&g_file_mapping.lock);
}
int remove_mapping(const char *fullpath)
{
int ret;
struct filelist *f_list = NULL;
struct page_mapping *mapping = NULL;
f_list = &tg_filelist;
ret = sem_wait(&f_list->fl_sem);
if (ret < 0) {
PRINTK("sem_wait error, ret=%d\n", ret);
return VFS_ERROR;
}
(VOID)LOS_MuxLock(&g_file_mapping.lock, LOS_WAIT_FOREVER);
mapping = find_mapping_nolock(fullpath);
if (mapping) {
ret = remove_mapping_nolock(mapping);
}
(VOID)LOS_MuxUnlock(&g_file_mapping.lock);
(void)sem_post(&f_list->fl_sem);
return OK;
}
void rename_mapping(const char *src_path, const char *dst_path)
{
int ret;
char *tmp = NULL;
int path_len;
struct file_map *fmap = NULL;
struct page_mapping *mapping = NULL;
if (src_path == NULL || dst_path == NULL) {
return;
}
path_len = strlen(dst_path);
/* protect the whole list in case of this node been deleted just after we found it */
(VOID)LOS_MuxLock(&g_file_mapping.lock, LOS_WAIT_FOREVER);
mapping = find_mapping_nolock(src_path);
if (!mapping) {
goto out;
}
fmap = LOS_DL_LIST_ENTRY(mapping, struct file_map, mapping);
tmp = LOS_MemAlloc(m_aucSysMem0, path_len + 1);
if (!tmp) {
PRINT_ERR("%s-%d: Mem alloc failed, path length(%d)\n", __FUNCTION__, __LINE__, path_len);
goto out;
}
ret = strncpy_s(tmp, path_len, dst_path, strlen(dst_path));
if (ret != 0) {
(VOID)LOS_MemFree(m_aucSysMem0, tmp);
goto out;
}
tmp[path_len] = '\0';
fmap->rename = tmp;
out:
(VOID)LOS_MuxUnlock(&g_file_mapping.lock);
}
int update_file_path(const char *old_path, const char *new_path)
{
struct filelist *f_list = NULL;
struct file *filp = NULL;
int ret;
f_list = &tg_filelist;
ret = sem_wait(&f_list->fl_sem);
if (ret < 0) {
PRINTK("sem_wait error, ret=%d\n", ret);
return VFS_ERROR;
}
(VOID)LOS_MuxLock(&g_file_mapping.lock, LOS_WAIT_FOREVER);
for (int i = 3; i < CONFIG_NFILE_DESCRIPTORS; i++) {
if (!get_bit(i)) {
continue;
}
filp = &tg_filelist.fl_files[i];
if (filp->f_path == NULL || strcmp(filp->f_path, old_path)) {
continue;
}
int len = strlen(new_path) + 1;
char *tmp_path = LOS_MemAlloc(m_aucSysMem0, len);
if (tmp_path == NULL) {
PRINT_ERR("%s-%d: Mem alloc failed, path length(%d)\n", __FUNCTION__, __LINE__, len);
ret = VFS_ERROR;
goto out;
}
ret = strncpy_s(tmp_path, strlen(new_path) + 1, new_path, len);
if (ret != 0) {
(VOID)LOS_MemFree(m_aucSysMem0, tmp_path);
PRINT_ERR("%s-%d: strcpy failed.\n", __FUNCTION__, __LINE__);
ret = VFS_ERROR;
goto out;
}
free(filp->f_path);
filp->f_path = tmp_path;
}
ret = LOS_OK;
out:
(VOID)LOS_MuxUnlock(&g_file_mapping.lock);
(void)sem_post(&f_list->fl_sem);
return ret;
}
#ifdef LOSCFG_DEBUG_VERSION
struct file_map* GetFileMappingList(void)
{
return &g_file_mapping;
}
#endif
#endif

View File

@@ -265,6 +265,10 @@ static struct Mount* GetDevMountPoint(struct Vnode *dev)
{
struct Mount *mnt = NULL;
LIST_HEAD *mntList = GetMountList();
if (mntList == NULL) {
return NULL;
}
LOS_DL_LIST_FOR_EACH_ENTRY(mnt, mntList, struct Mount, mountList) {
if (mnt->vnodeDev == dev) {
return mnt;
@@ -302,7 +306,7 @@ static void FileDisableAndClean(struct Mount *mnt)
{
struct filelist *flist = &tg_filelist;
struct file *filep = NULL;
const struct file_operations_vfs *originOps;
const struct file_operations_vfs *originOps = NULL;
for (int i = 3; i < CONFIG_NFILE_DESCRIPTORS; i++) {
if (!get_bit(i)) {
@@ -355,7 +359,7 @@ static void VnodeTryFreeAll(struct Mount *mount)
int ForceUmountDev(struct Vnode *dev)
{
int ret;
struct Vnode *origin;
struct Vnode *origin = NULL;
struct filelist *flist = &tg_filelist;
if (dev == NULL) {
return -EINVAL;

View File

@@ -59,34 +59,27 @@ void los_vfs_init(void)
retval = VnodesInit();
if (retval != LOS_OK) {
PRINT_ERR("los_vfs_init VnodeInit failed error %d\n", retval);
PRINT_ERR("los_vfs_init VnodeInit failed error %u\n", retval);
return;
}
retval = PathCacheInit();
if (retval != LOS_OK) {
PRINT_ERR("los_vfs_init PathCacheInit failed error %d\n", retval);
PRINT_ERR("los_vfs_init PathCacheInit failed error %u\n", retval);
return;
}
retval = VnodeHashInit();
if (retval != LOS_OK) {
PRINT_ERR("los_vfs_init VnodeHashInit failed error %d\n", retval);
PRINT_ERR("los_vfs_init VnodeHashInit failed error %u\n", retval);
return;
}
retval = VnodeDevInit();
if (retval != LOS_OK) {
PRINT_ERR("los_vfs_init VnodeDevInit failed error %d\n", retval);
PRINT_ERR("los_vfs_init VnodeDevInit failed error %u\n", retval);
return;
}
#ifdef LOSCFG_KERNEL_VM
retval = init_file_mapping();
if (retval != LOS_OK) {
PRINT_ERR("Page cache file map init failed\n");
return;
}
#endif
g_vfs_init = true;
}

View File

@@ -535,7 +535,7 @@ static void PrintFileInfo64(const struct stat64 *stat64Info, const char *name)
dirFlag = '-';
}
PRINTK("%c%s%s%s %-8lld u:%-5d g:%-5d %-10s\n", dirFlag,
PRINTK("%c%s%s%s %-8lld u:%-5u g:%-5u %-10s\n", dirFlag,
str[0], str[1], str[UGO_NUMS - 1], stat64Info->st_size, stat64Info->st_uid, stat64Info->st_gid, name);
}
@@ -561,7 +561,7 @@ static void PrintFileInfo(const struct stat *statInfo, const char *name)
dirFlag = '-';
}
PRINTK("%c%s%s%s %-8lld u:%-5d g:%-5d %-10s\n", dirFlag,
PRINTK("%c%s%s%s %-8lld u:%-5u g:%-5u %-10s\n", dirFlag,
str[0], str[1], str[UGO_NUMS - 1], statInfo->st_size, statInfo->st_uid, statInfo->st_gid, name);
}
@@ -736,7 +736,7 @@ void lsfd(void)
while (i < CONFIG_NFILE_DESCRIPTORS) {
node = files_get_openfile(i);
if (node) {
PRINTK("%5d %s\n", i, f_list->fl_files[i].f_path);
PRINTK("%5u %s\n", i, f_list->fl_files[i].f_path);
}
i++;
}

View File

@@ -71,7 +71,7 @@ void PathCacheDump(void)
LIST_HEAD *nhead = &g_pathCacheHashEntrys[i];
LOS_DL_LIST_FOR_EACH_ENTRY(pc, nhead, struct PathCache, hashEntry) {
PRINTK(" pathCache dump hash %d item %s %p %p %d\n", i,
PRINTK(" pathCache dump hash %d item %s %p %p %u\n", i,
pc->name, pc->parentVnode, pc->childVnode, pc->nameLen);
}
}

View File

@@ -65,6 +65,7 @@ int VnodesInit(void)
}
g_rootVnode->mode = S_IRWXU | S_IRWXG | S_IRWXO | S_IFDIR;
g_rootVnode->type = VNODE_TYPE_DIR;
g_rootVnode->filePath = "/";
return LOS_OK;
}
@@ -155,6 +156,11 @@ int VnodeAlloc(struct VnodeOps *vop, struct Vnode **newVnode)
LOS_ListTailInsert(&g_vnodeActiveList, &(vnode->actFreeEntry));
vnode->vop = vop;
}
LOS_ListInit(&vnode->mapping.page_list);
LOS_SpinInit(&vnode->mapping.list_lock);
(VOID)LOS_MuxInit(&vnode->mapping.mux_lock, NULL);
vnode->mapping.host = vnode;
VnodeDrop();
*newVnode = vnode;
@@ -182,6 +188,9 @@ int VnodeFree(struct Vnode *vnode)
vnode->vop->Reclaim(vnode);
}
if (vnode->filePath) {
free(vnode->filePath);
}
if (vnode->vop == &g_devfsOps) {
/* for dev vnode, just free it */
free(vnode->data);
@@ -360,14 +369,23 @@ STEP_FINISH:
return ret;
}
int VnodeLookup(const char *path, struct Vnode **result, uint32_t flags)
int VnodeLookupAt(const char *path, struct Vnode **result, uint32_t flags, struct Vnode *orgVnode)
{
int ret;
int vnodePathLen;
char *vnodePath = NULL;
struct Vnode *startVnode = NULL;
char *normalizedPath = NULL;
int ret = PreProcess(path, &startVnode, &normalizedPath);
if (ret != LOS_OK) {
goto OUT_FREE_PATH;
if (orgVnode != NULL) {
startVnode = orgVnode;
normalizedPath = strdup(path);
} else {
ret = PreProcess(path, &startVnode, &normalizedPath);
if (ret != LOS_OK) {
PRINT_ERR("[VFS]lookup failed, invalid path err = %d\n", ret);
goto OUT_FREE_PATH;
}
}
if (normalizedPath[0] == '/' && normalizedPath[1] == '\0') {
@@ -384,7 +402,12 @@ int VnodeLookup(const char *path, struct Vnode **result, uint32_t flags)
if (currentDir == NULL || *currentDir == '\0') {
// return target or parent vnode as result
*result = currentVnode;
goto OUT_FREE_PATH;
if (currentVnode->filePath == NULL) {
currentVnode->filePath = normalizedPath;
} else {
free(normalizedPath);
}
return ret;
} else if (VfsVnodePermissionCheck(currentVnode, EXEC_OP)) {
ret = -EACCES;
goto OUT_FREE_PATH;
@@ -394,16 +417,36 @@ int VnodeLookup(const char *path, struct Vnode **result, uint32_t flags)
// no such file, lookup failed
goto OUT_FREE_PATH;
}
if (currentVnode->filePath == NULL) {
vnodePathLen = currentDir - normalizedPath;
vnodePath = malloc(vnodePathLen + 1);
if (vnodePath == NULL) {
ret = -ENOMEM;
goto OUT_FREE_PATH;
}
ret = strncpy_s(vnodePath, vnodePathLen + 1, normalizedPath, vnodePathLen);
if (ret != EOK) {
ret = -ENAMETOOLONG;
free(vnodePath);
goto OUT_FREE_PATH;
}
currentVnode->filePath = vnodePath;
currentVnode->filePath[vnodePathLen] = 0;
}
}
OUT_FREE_PATH:
if (normalizedPath) {
free(normalizedPath);
}
return ret;
}
int VnodeLookup(const char *path, struct Vnode **vnode, uint32_t flags)
{
return VnodeLookupAt(path, vnode, flags, NULL);
}
static void ChangeRootInternal(struct Vnode *rootOld, char *dirname)
{
int ret;
@@ -522,6 +565,9 @@ int VnodeCreate(struct Vnode *parent, const char *name, int mode, struct Vnode *
newVnode->uid = parent->uid;
newVnode->gid = parent->gid;
newVnode->mode = mode;
/* The 'name' here is not full path, but for device we don't depend on this path, it's just a name for DFx.
When we have devfs, we can get a fullpath. */
newVnode->filePath = strdup(name);
*vnode = newVnode;
return 0;
@@ -623,7 +669,7 @@ void VnodeMemoryDump(void)
}
PRINTK("Vnode number = %d\n", vnodeCount);
PRINTK("Vnode memory size = %d(B)\n", vnodeCount * sizeof(struct Vnode));
PRINTK("Vnode memory size = %u(B)\n", vnodeCount * sizeof(struct Vnode));
}
LIST_HEAD* GetVnodeFreeList()

View File

@@ -33,7 +33,9 @@ module_switch = defined(LOSCFG_FS_ZPFS)
module_name = get_path_info(rebase_path("."), "name")
kernel_module(module_name) {
sources = [
"vfs_zpfs.c",
"zpfs.c",
"src/vfs_zpfs.c",
"src/zpfs.c",
]
include_dirs = [ "include" ]
}

View File

@@ -31,14 +31,10 @@ include $(LITEOSTOPDIR)/config.mk
MODULE_NAME := $(notdir $(shell pwd))
LOCAL_SRCS := $(wildcard *.c)
LOCAL_INCLUDE = \
-I $(LITEOSTOPDIR)/fs/include \
-I $(LITEOSTOPDIR)/fs/zpfs \
-I $(LITEOSTOPDIR)/../../third_party/NuttX/liteos/fs/include\
-I $(LITEOSTOPDIR)/../../third_party/NuttX/liteos/fs/include/inode
LOCAL_SRCS := $(wildcard src/*.c)
LOCAL_INCLUDE := \
-I $(LITEOSTOPDIR)/fs/zpfs/include
LOCAL_FLAGS := $(LITEOS_GCOV_OPTS)
LOCAL_FLAGS := $(LOCAL_INCLUDE) $(LITEOS_GCOV_OPTS)
include $(MODULE)

View File

@@ -1,458 +0,0 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "vfs_zpfs.h"
#include <fcntl.h>
#include <stdlib.h>
#include <sys/statfs.h>
#include <unistd.h>
#include "fs/dirent_fs.h"
#include "inode/inode.h"
#include "internal.h"
#include "los_tables.h"
#include "los_vm_filemap.h"
#ifdef LOSCFG_FS_ZPFS
static int CheckEntryExist(const struct ZpfsEntry *zpfsEntry, char **fPath, struct stat *buf)
{
int ret;
struct inode *inode = zpfsEntry->mountedInode;
const char *path = zpfsEntry->mountedPath;
const char *relPath = zpfsEntry->mountedRelpath;
int len = strlen(path) + strlen(relPath) + 1;
int fullLen = len + 1;
char *fullPath = (char *)malloc(fullLen);
if (fullPath == NULL) {
return -1;
}
ret = snprintf_s(fullPath, fullLen, len, "%s/%s", path, relPath);
if (ret < 0) {
free(fullPath);
return -1;
}
if (inode->u.i_mops->stat != NULL) {
ret = inode->u.i_mops->stat(inode, fullPath, buf);
} else {
ret = -ENOSYS;
}
if (fPath == NULL) {
free(fullPath);
} else {
*fPath = fullPath;
}
return ret;
}
static struct inode *GetRelInodeFromVInode(const ZpfsConfig *zpfsCfg,
const char* relPath, struct stat *buf, char **finalPath)
{
int ret;
struct ZpfsEntry entry;
for (int i = 0; i < zpfsCfg->entryCount; i++) {
entry.mountedPath = zpfsCfg->orgEntry[i].mountedRelpath;
entry.mountedRelpath = (char*)relPath;
entry.mountedInode = zpfsCfg->orgEntry[i].mountedInode;
ret = CheckEntryExist(&entry, finalPath, buf);
if (ret == OK) {
return entry.mountedInode;
}
}
return NULL;
}
/****************************************************************************
* Name: VfsZpfsRealInode
*
* Description:
* Get the inode which is hidden.
*
* Input Parameters:
* The relative path.
* Returned Value:
* finalPath the relative path of the mount point.
* OK
* NULL memory is not enough.
****************************************************************************/
static inline struct inode *VfsZpfsRealInode(const ZpfsConfig *zpfsCfg, const char *relPath, char **finalPath)
{
struct stat buf;
struct inode *inode = GetRelInodeFromVInode(zpfsCfg, relPath, &buf, finalPath);
return inode;
}
static int VfsZpfsOpen(struct file *file, const char *relPath, int oflAgs, mode_t mode)
{
char *finalPath = NULL;
struct inode *swapInode = NULL;
int ret;
struct inode *inode = file->f_inode;
ZpfsConfig *zpfsCfg = GetZpfsConfig(inode);
inode = VfsZpfsRealInode(zpfsCfg, relPath, &finalPath);
if ((inode == NULL) || (!inode->u.i_mops->open)) {
if (finalPath) {
free(finalPath);
}
return -ENOENT;
}
swapInode = file->f_inode;
file->f_inode = inode;
ret = inode->u.i_mops->open(file, finalPath, oflAgs, mode);
free(finalPath);
finalPath = NULL;
file->f_inode = swapInode;
return ret;
}
static int VfsZpfsClose(struct file *file)
{
struct inode *swapInode = NULL;
int ret;
struct inode *inode = file->f_inode;
ZpfsConfig *zpfsCfg = GetZpfsConfig(inode);
inode = VfsZpfsRealInode(zpfsCfg, file->f_relpath, NULL);
if ((inode == NULL) || (!inode->u.i_mops->close)) {
return -ENOSYS;
}
swapInode = file->f_inode;
file->f_inode = inode;
ret = inode->u.i_mops->close(file);
file->f_inode = swapInode;
return ret;
}
static ssize_t VfsZpfsRead(struct file *file, char *buffer, size_t bufLen)
{
struct inode *swapInode = NULL;
ssize_t sret;
struct inode *inode = file->f_inode;
ZpfsConfig *zpfsCfg = GetZpfsConfig(inode);
inode = VfsZpfsRealInode(zpfsCfg, file->f_relpath, NULL);
if ((inode == NULL) || (!inode->u.i_mops->read)) {
return -ENOSYS;
}
swapInode = file->f_inode;
file->f_inode = inode;
sret = inode->u.i_mops->read(file, buffer, bufLen);
file->f_inode = swapInode;
return sret;
}
static off_t VfsZpfsLseek(struct file *file, off_t offset, int whence)
{
off_t off;
struct inode *swapInode = NULL;
struct inode *inode = file->f_inode;
ZpfsConfig *zpfsCfg = GetZpfsConfig(inode);
inode = VfsZpfsRealInode(zpfsCfg, file->f_relpath, NULL);
if ((inode == NULL) || (!inode->u.i_mops->seek)) {
return -ENOSYS;
}
swapInode = file->f_inode;
file->f_inode = inode;
off = inode->u.i_mops->seek(file, offset, whence);
file->f_inode = swapInode;
return off;
}
static loff_t VfsZpfsLseek64(struct file *file, loff_t offset, int whence)
{
loff_t off;
struct inode *swapInode = NULL;
struct inode *inode = file->f_inode;
ZpfsConfig *zpfsCfg = GetZpfsConfig(inode);
inode = VfsZpfsRealInode(zpfsCfg, file->f_relpath, NULL);
if ((inode == NULL) || (!inode->u.i_mops->seek64)) {
return -ENOSYS;
}
swapInode = file->f_inode;
file->f_inode = inode;
off = inode->u.i_mops->seek64(file, offset, whence);
file->f_inode = swapInode;
return off;
}
static int VfsZpfsDup(const struct file *oldFile, struct file *newFile)
{
int ret;
struct inode *inode = oldFile->f_inode;
ZpfsConfig *zpfsCfg = GetZpfsConfig(inode);
inode = VfsZpfsRealInode(zpfsCfg, oldFile->f_relpath, NULL);
if ((inode == NULL) || (!inode->u.i_mops->dup)) {
return -ENOSYS;
}
ret = inode->u.i_mops->dup(oldFile, newFile);
return ret;
}
static int VfsZpfsOpenDir(struct inode *mountpt, const char *relPath, struct fs_dirent_s *dir)
{
ZpfsConfig *zpfsCfg = GetZpfsConfig(mountpt);
if (!VfsZpfsRealInode(zpfsCfg, relPath, NULL)) {
return -ENOENT;
}
struct ZpfsDir *zpfsDir = malloc(sizeof(struct ZpfsDir));
if (zpfsDir == NULL) {
return -ENOMEM;
}
zpfsDir->relPath = strdup(relPath);
if (zpfsDir->relPath == NULL) {
return -ENOMEM;
}
zpfsDir->index = zpfsCfg->entryCount;
zpfsDir->openEntry = -1;
dir->u.zpfs = (void*)zpfsDir;
return OK;
}
static void CloseEntry(const struct ZpfsConfig *zpfsCfg, struct fs_dirent_s *dir, const int index)
{
struct inode *inode = zpfsCfg->orgEntry[index].mountedInode;
if (inode->u.i_mops->closedir != NULL) {
inode->u.i_mops->closedir(inode, dir);
}
}
static int VfsZpfsCloseDir(struct inode *mountpt, struct fs_dirent_s *dir)
{
struct ZpfsDir *zpfsDir = (struct ZpfsDir *)(dir->u.zpfs);
if (zpfsDir->relPath) {
free(zpfsDir->relPath);
zpfsDir->relPath = NULL;
}
free(zpfsDir);
zpfsDir = NULL;
return OK;
}
static int IsExistInEntries(const struct ZpfsConfig *zpfsCfg, const char* relPath, const int index)
{
struct ZpfsEntry entry;
struct stat buf;
for (int i = index; i >= 0; i--) {
entry.mountedPath = zpfsCfg->orgEntry[i].mountedRelpath;
entry.mountedRelpath = (char *)relPath;
entry.mountedInode = zpfsCfg->orgEntry[i].mountedInode;
if (CheckEntryExist(&entry, NULL, &buf) == OK) {
return OK;
}
}
return -1;
}
static int OpenEntry(const struct ZpfsConfig *zpfsCfg,
const struct ZpfsDir *zpfsDir, struct fs_dirent_s *dir, const int index)
{
int ret;
char *fullPath;
char *path = (char *)zpfsCfg->orgEntry[index].mountedRelpath;
char *relPath = zpfsDir->relPath;
struct inode *curInode = zpfsCfg->orgEntry[index].mountedInode;
int len = strlen(path) + strlen(relPath) + 1;
int fullLen = len + 1;
fullPath = (char *)malloc(fullLen);
if (fullPath == NULL) {
return -ENOMEM;
}
ret = snprintf_s(fullPath, fullLen, len, "%s/%s", path, relPath);
if (ret < 0) {
free(fullPath);
return -EINVAL;
}
ret = -ENOSYS;
if (curInode->u.i_mops->opendir != NULL) {
ret = curInode->u.i_mops->opendir(curInode, fullPath, dir);
}
free(fullPath);
return ret;
}
static int VfsZpfsReadDir(struct inode *mountpt, struct fs_dirent_s *dir)
{
int ret;
struct inode *oldInode = NULL;
struct inode *curInode = NULL;
struct ZpfsDir *zpfsDir = (struct ZpfsDir *)dir->u.zpfs;
ZpfsConfig *zpfsCfg = GetZpfsConfig(mountpt);
int index = zpfsDir->index;
do {
if (zpfsDir->openEntry == -1) {
zpfsDir->index--;
index = zpfsDir->index;
if (index < 0) {
ret = -1;
break;
}
ret = OpenEntry(zpfsCfg, zpfsDir, dir, index);
if (ret != OK) {
break;
}
zpfsDir->openEntry = 1;
}
curInode = zpfsCfg->orgEntry[index].mountedInode;
oldInode = dir->fd_root;
dir->fd_root = curInode;
ret = curInode->u.i_mops->readdir(curInode, dir);
dir->fd_root = oldInode;
if (ret != OK) {
if (index >= 0) {
CloseEntry(zpfsCfg, dir, index);
zpfsDir->openEntry = -1;
continue;
}
} else if (IsExistInEntries(zpfsCfg, dir->fd_dir[0].d_name, (index - 1)) == OK) {
continue;
}
ret = 1; // 1 means current op return one file
dir->fd_position++;
dir->fd_dir[0].d_off = dir->fd_position;
dir->fd_dir[0].d_reclen = (uint16_t)sizeof(struct dirent);
break;
} while (1);
return ret;
}
static int VfsZpfsRewindDir(struct inode *mountpt, struct fs_dirent_s *dir)
{
PRINT_DEBUG("%s NOT support!\n", __FUNCTION__);
return OK;
}
static int VfsZpfsBind(struct inode *blkDriver, const void *data, void **handle, const char *relPath)
{
if (data == NULL) {
return -1;
}
(*handle) = (void*)data;
return OK;
}
static int VfsZpfsUnbind(void *handle, struct inode **blkDriver)
{
struct inode *node = NULL;
ZpfsConfig *zpfsCfg = NULL;
if (handle != NULL) {
zpfsCfg = (ZpfsConfig *)handle;
node = inode_unlink(zpfsCfg->patchTarget);
INODE_SET_TYPE(node, FSNODEFLAG_DELETED);
if (node != zpfsCfg->patchInode) {
return -EINVAL;
}
}
return OK;
}
static int VfsZpfsStatFs(struct inode *mountpt, struct statfs *buf)
{
if (buf == NULL) {
return -EINVAL;
}
(void)memset_s(buf, sizeof(struct statfs), 0, sizeof(struct statfs));
buf->f_type = ZPFS_MAGIC;
return OK;
}
static int VfsZpfsStat(struct inode *mountpt, const char *relPath, struct stat *buf)
{
struct inode *inode = NULL;
ZpfsConfig *zpfsCfg = GetZpfsConfig(mountpt);
inode = GetRelInodeFromVInode(zpfsCfg, relPath, buf, NULL);
if (inode == NULL) {
return -ENOENT;
}
return OK;
}
const struct mountpt_operations zpfsOperations = {
VfsZpfsOpen, /* open */
VfsZpfsClose, /* close */
VfsZpfsRead, /* read */
NULL, /* write */
VfsZpfsLseek, /* seek */
NULL, /* ioctl */
OsVfsFileMmap, /* mmap */
NULL, /* sync */
VfsZpfsDup, /* dup */
NULL, /* fstat */
NULL, /* truncate */
VfsZpfsOpenDir, /* opendir */
VfsZpfsCloseDir, /* closedir */
VfsZpfsReadDir, /* readdir */
VfsZpfsRewindDir, /* rewinddir */
VfsZpfsBind, /* bind */
VfsZpfsUnbind, /* unbind */
VfsZpfsStatFs, /* statfs */
NULL, /* virstatfs */
NULL, /* unlink */
NULL, /* mkdir */
NULL, /* rmdir */
NULL, /* rename */
VfsZpfsStat, /* stat */
NULL, /* utime */
NULL, /* chattr */
VfsZpfsLseek64, /* seek64 */
NULL, /* getlabel */
NULL, /* fallocate */
NULL, /* fallocate64 */
NULL, /* truncate64 */
NULL, /* fscheck */
NULL, /* map_pages */
NULL, /* readpage */
NULL, /* writepage */
};
FSMAP_ENTRY(zpfs_fsmap, ZPFS_NAME, zpfsOperations, FALSE, FALSE);
#endif // LOSCFG_FS_ZPFS

View File

@@ -1,464 +0,0 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "vfs_zpfs.h"
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/statfs.h>
#include "fs/dirent_fs.h"
#include "inode/inode.h"
#include "internal.h"
#include "los_tables.h"
#ifdef LOSCFG_FS_ZPFS
/****************************************************************************
* Name: CheckEntryExist
*
* Description:
* check if entry is exist or not.
* Input Parameters:
* The path
* Returned Value:
* true or false, it is true for the exist of path.
****************************************************************************/
bool CheckEntryExist(const char *entry)
{
struct stat64 stat64Info;
struct stat statInfo;
if (stat64(entry, &stat64Info) == 0) {
if (S_ISDIR(stat64Info.st_mode) != 0) {
return true;
} else {
return false;
}
} else if (stat(entry, &statInfo) == 0) {
if (S_ISDIR(statInfo.st_mode) != 0) {
return true;
} else {
return false;
}
}
return false;
}
/****************************************************************************
* Name: GetZpfsConfig
*
* Description:
* get the zpfs configuration
* Input Parameters:
* void
* Returned Value:
* g_zpfsConfig Save the patch gobal data.
****************************************************************************/
ZpfsConfig *GetZpfsConfig(const struct inode *inode)
{
ZpfsConfig *zpfsCfg = (ZpfsConfig*)(inode->i_private);
return zpfsCfg;
}
/****************************************************************************
* Name: GetSourceList
*
* Description:
* Get the source path list.
* eg: /patch/etc:/patch/etc1:/patch/etc2
* Input Parameters:
* source: /patch/etc:/patch/etc1:/patch/etc2
* sourcelist: output path arry
* num: output list num
*
* Returned Value:
* OK The mounted folder parameter is right.
* EINVAL The mounted folder parameter is wrong.
* ENOMEM The memory is not enough
****************************************************************************/
static int GetSourceList(const char *source, char *sourceList[ZPFS_LEVELS], int *num)
{
char *subSource = NULL;
char *path = NULL;
char *subPath = NULL;
int index;
int ret;
subSource = strdup(source);
if (subSource == NULL) {
return -ENOMEM;
}
subPath = strtok_r(subSource, ":", &path);
for (*num = 0; *num < ZPFS_LEVELS && subPath != NULL; (*num)++) {
sourceList[*num] = strdup(subPath);
if (sourceList[*num] == NULL) {
ret = -ENOMEM;
goto EXIT;
}
subPath = strtok_r(NULL, ":", &path);
}
if (subPath != NULL || *num == 0) {
PRINTK("source path num %d error\n", *num);
ret = -EINVAL;
goto EXIT;
}
free(subSource);
return OK;
EXIT:
free(subSource);
for (index = 0; index < *num; index++) {
free(sourceList[index]);
sourceList[index] = NULL;
}
*num = 0;
return ret;
}
/****************************************************************************
* Name: CheckInputParamsFormat
*
* Description:
* check the mounted folder format and validity. MAX three segment.
* eg: /patch/etc:/patch/etc1:/patch/etc2
* Input Parameters:
* check the mounted folder. eg:
* source: /patch/etc:/patch/etc1:/patch/etc2
* target: /etc
*
* Returned Value:
* OK The mounted folder parameter is right.
* EINVAL The mounted folder parameter is wrong.
* ENOMEM The memory is not enough
****************************************************************************/
static int CheckInputParamsFormat(const char *source, const char *target)
{
char *sourceList[ZPFS_LEVELS] = {0};
int num = 0;
int ret;
int index;
bool isTargetValid = false;
if (source == NULL || target == NULL) {
return -EINVAL;
}
ret = GetSourceList(source, sourceList, &num);
if (ret != OK) {
goto EXIT;
}
for (index = 0; index < num; index++) {
if (!CheckEntryExist(sourceList[index])) {
ret = -ENOENT;
goto EXIT;
}
/* target must same with one source path */
if (strcmp(target, sourceList[index]) == 0) {
isTargetValid = true;
}
}
if (!isTargetValid) {
ret = -EINVAL;
goto EXIT;
}
ret = OK;
EXIT:
for (index = 0; index < num; index++) {
free(sourceList[index]);
}
return ret;
}
static void ZpfsFreeEntry(ZpfsEntry *zpfsEntry)
{
if (zpfsEntry->mountedPath != NULL) {
free(zpfsEntry->mountedPath);
zpfsEntry->mountedPath = NULL;
}
if (zpfsEntry->mountedRelpath != NULL) {
free(zpfsEntry->mountedRelpath);
zpfsEntry->mountedRelpath = NULL;
}
zpfsEntry->mountedInode = NULL;
}
/****************************************************************************
* Name: ZpfsFreeConfig
*
* Description:
* Umount the patch file system,
* Delete the global patch data and the mount pseudo point.
*
* Input Parameters:
* void
* Returned Value:
* void
****************************************************************************/
void ZpfsFreeConfig(ZpfsConfig *zpfsCfg)
{
struct inode *pInode = NULL;
if (zpfsCfg == NULL) {
return;
}
pInode = zpfsCfg->patchInode;
if (pInode != NULL) {
INODE_SET_TYPE(pInode, FSNODEFLAG_DELETED);
inode_release(pInode);
pInode = NULL;
}
for (int i = 0; i < zpfsCfg->entryCount; i++) {
ZpfsFreeEntry(&(zpfsCfg->orgEntry[i]));
}
if (zpfsCfg->patchTarget != NULL) {
free(zpfsCfg->patchTarget);
zpfsCfg->patchTarget = NULL;
}
free(zpfsCfg);
zpfsCfg = NULL;
}
/****************************************************************************
* Name: IsTargetMounted
* Description:
* The mount patch target path must be the mounted path.
* Input Parameters:
* target: The mount point
* Returned Value:
* OK
* EINVAL The mount patch target path is not the mounted path.
****************************************************************************/
static int IsTargetMounted(const char *target)
{
struct inode *inode = NULL;
char *path = NULL;
struct statfs buf;
if (!CheckEntryExist(target)) {
return -EINVAL;
}
inode = inode_search((const char **)&target, (struct inode**)NULL,
(struct inode**)NULL, (const char **)&path);
if (inode == NULL || !INODE_IS_MOUNTPT(inode)) {
PRINT_ERR("Can't to mount to this inode %s\n", target);
return -EINVAL;
}
if ((inode->u.i_mops != NULL) && (inode->u.i_mops->statfs != NULL)) {
if (inode->u.i_mops->statfs(inode, &buf) == OK) {
if (buf.f_type == ZPFS_MAGIC) {
return -EEXIST;
}
}
}
if (path == NULL || path[0] == '\0') {
return -EEXIST;
}
return OK;
}
/****************************************************************************
* Name: SaveZpfsParameter
*
* Description:
* When the patch file system is mounted, the patch gobal data is built.
*
* Input Parameters:
* source: The mounted patch folder
* target: The mount point
* Returned Value:
* OK Save the patch gobal data.
* ENOMEM The memory is not enough.
* EBADMSG There is no data.
****************************************************************************/
static int SaveZpfsParameter(const char *source, const char *target, struct ZpfsConfig *zpfsCfg)
{
int ret;
const char *path = NULL;
int num = 0;
int index;
char *sourceList[ZPFS_LEVELS] = {0};
/* save the mount point */
zpfsCfg->patchTarget = strdup(target);
if (zpfsCfg->patchTarget == NULL) {
return -ENOMEM;
}
/* save the mount folder inode */
zpfsCfg->patchTargetInode = inode_search((const char **)&target,
(struct inode**)NULL, (struct inode**)NULL, &path);
if (zpfsCfg->patchTargetInode == NULL) {
return -EINVAL;
}
ret = GetSourceList(source, sourceList, &num);
if (ret != OK) {
return ret;
}
zpfsCfg->entryCount = num;
for (index = 0; index < num; index++) {
zpfsCfg->orgEntry[index].mountedPath = sourceList[index];
/* save the mounted folder inode */
zpfsCfg->orgEntry[index].mountedInode = inode_search((const char **)&sourceList[index],
(struct inode**)NULL, (struct inode**)NULL, &path);
if (zpfsCfg->orgEntry[index].mountedInode == NULL) {
ret = -EINVAL;
goto ERROR_PROCESS;
}
/* save the mounted relative path */
zpfsCfg->orgEntry[index].mountedRelpath = (char*)path;
}
return OK;
ERROR_PROCESS:
for (index = 0; index < num; index++) {
free(sourceList[index]);
sourceList[index] = NULL;
}
return ret;
}
/****************************************************************************
* Name: ZpfsPrepare
* Description:
* The main function of mount zpfs.
* Input Parameters:
* source: The mounted parameter
* target: The mount path
* inodePtr: the new inode info of target
* force: It is true for zpfs
* Returned Value:
* OK
* EINVAL The parameter is wrong.
* ENOMEM It is not enough memory.
****************************************************************************/
int ZpfsPrepare(const char *source, const char *target, struct inode **inodePtr, bool force)
{
/* Check the mounted folder parameter */
int ret = CheckInputParamsFormat(source, target);
if (ret != OK) {
PRINT_ERR("Parameter is err source:%s target:%s.\n", source, target);
return ret;
}
/* The mount target path must be the mounted path */
ret = IsTargetMounted(target);
if (ret != OK) {
PRINT_ERR("Can't to mount to this inode %s\n", target);
return ret;
}
ZpfsConfig *zpfsCfg = (ZpfsConfig*) malloc(sizeof(struct ZpfsConfig));
if (zpfsCfg == NULL) {
PRINT_ERR("Memory is not enought.\n");
return -ENOMEM;
}
(void)memset_s(zpfsCfg, sizeof(struct ZpfsConfig), 0, sizeof(struct ZpfsConfig));
/* Save the patch global data */
ret = SaveZpfsParameter(source, target, zpfsCfg);
if (ret != OK) {
ZpfsFreeConfig(zpfsCfg);
PRINT_ERR("Memory is not enought.\n");
return ret;
}
/* Create the patch inode */
ret = inode_reserve_rootdir(target, inodePtr, force);
if (ret != OK) {
ZpfsFreeConfig(zpfsCfg);
PRINT_ERR("failed to create mounted inode.\n");
return ret;
}
zpfsCfg->patchInode = *inodePtr;
(*inodePtr)->i_private = zpfsCfg;
return ret;
}
/****************************************************************************
* Name: ZpfsCleanUp
* Description:
* Clean the configuration of zpfs.
* Input Parameters:
* target: The mount path
* Returned Value:
* void
****************************************************************************/
void ZpfsCleanUp(const void *node, const char *target)
{
struct statfs buf;
struct inode *inode = (struct inode *)node;
if ((target == NULL) || (inode == NULL) ||
(inode->u.i_mops == NULL) ||
(inode->u.i_mops->statfs == NULL)) {
return;
}
if (inode->u.i_mops->statfs(inode, &buf) == OK) {
if (buf.f_type == ZPFS_MAGIC) {
ZpfsConfig *zpfsCfg = inode->i_private;
if (strcmp(zpfsCfg->patchTarget, target) == 0) {
ZpfsFreeConfig(zpfsCfg);
}
}
}
}
bool IsZpfsFileSystem(struct inode *inode)
{
struct statfs buf;
if (inode == NULL || inode->u.i_mops == NULL ||
inode->u.i_mops->statfs == NULL) {
return false;
}
if (inode->u.i_mops->statfs(inode, &buf) == OK) {
if (buf.f_type == ZPFS_MAGIC) {
return true;
}
}
return false;
}
#endif // LOSCFG_FS_ZPFS

View File

@@ -110,12 +110,88 @@ config KERNEL_VDSO
help
If you wish to speed up some system calls.
config KERNEL_HOOK
bool "Enable Hook Feature"
default n
depends on KERNEL_EXTKERNEL && DEBUG_VERSION
config KERNEL_TRACE
bool "Enable Trace Feature"
default n
depends on KERNEL_EXTKERNEL && DEBUG_VERSION
depends on KERNEL_HOOK
config TRACE_MSG_EXTEND
bool "Enable Record more extended content"
default n
depends on KERNEL_TRACE
config TRACE_FRAME_CORE_MSG
bool "Record cpuid, hardware interrupt status, task lock status"
default n
depends on TRACE_MSG_EXTEND
config TRACE_FRAME_EVENT_COUNT
bool "Record event count, which indicate the sequence of happend events"
default n
depends on TRACE_MSG_EXTEND
config TRACE_FRAME_MAX_PARAMS
int "Record max params"
default 3
depends on KERNEL_TRACE
help
If you wish to record LiteOS's task and interrupt switch trace.
Make sure the max value is bigger than the number defined by each #MODULE#_#TYPE#_PARMAS in los_trace.h, e.g. TASK_SWITCH_PARAMS
choice
prompt "Trace work mode"
default RECORDER_MODE_OFFLINE
depends on KERNEL_TRACE
config RECORDER_MODE_ONLINE
bool "Online mode"
select TRACE_CLIENT_INTERACT
config RECORDER_MODE_OFFLINE
bool "Offline mode"
endchoice
config TRACE_BUFFER_SIZE
int "Trace record buffer size"
default 10000
config TRACE_CLIENT_INTERACT
bool "Enable Trace Client Visualization and Control"
default n
depends on KERNEL_TRACE
choice
prompt "Trace Pipeline for Data Transmission"
depends on TRACE_CLIENT_INTERACT
config TRACE_PIPELINE_SERIAL
bool "Via Serial"
endchoice
choice
prompt "Trace Control"
default TRACE_CONTROL_VIA_SHELL
depends on TRACE_CLIENT_INTERACT
help
If you wish to control Trace's start/stop etc.,dynamically by Trace Client.
config TRACE_CONTROL_VIA_SHELL
bool "Via Shell"
select LOSCFG_SHELL
config TRACE_CONTROL_AGENT
bool "Via Trace Agent Task"
config TRACE_NO_CONTROL
bool "No Control"
endchoice
config KERNEL_SHM
bool "Enable Shared Memory"

View File

@@ -38,6 +38,7 @@ kernel_module(module_name) {
"core/los_sys.c",
"core/los_task.c",
"core/los_tick.c",
"core/los_smp.c",
"ipc/los_event.c",
"ipc/los_futex.c",
"ipc/los_ipcdebug.c",

View File

@@ -133,6 +133,59 @@ STATIC ProcessGroup *OsFindProcessGroup(UINT32 gid)
return NULL;
}
STATIC INT32 OsSendSignalToSpecifyProcessGroup(ProcessGroup *group, siginfo_t *info, INT32 permission)
{
INT32 ret, success, err;
LosProcessCB *childCB = NULL;
success = 0;
ret = -LOS_ESRCH;
LOS_DL_LIST_FOR_EACH_ENTRY(childCB, &(group->processList), LosProcessCB, subordinateGroupList) {
if (childCB->processID == 0) {
continue;
}
err = OsDispatch(childCB->processID, info, permission);
success |= !err;
ret = err;
}
/* At least one success. */
return success ? LOS_OK : ret;
}
LITE_OS_SEC_TEXT INT32 OsSendSignalToAllProcess(siginfo_t *info, INT32 permission)
{
INT32 ret, success, err;
ProcessGroup *group = NULL;
success = 0;
err = OsSendSignalToSpecifyProcessGroup(g_processGroup, info, permission);
success |= !err;
ret = err;
/* all processes group */
LOS_DL_LIST_FOR_EACH_ENTRY(group, &g_processGroup->groupList, ProcessGroup, groupList) {
/* all processes in the process group. */
err = OsSendSignalToSpecifyProcessGroup(group, info, permission);
success |= !err;
ret = err;
}
return success ? LOS_OK : ret;
}
LITE_OS_SEC_TEXT INT32 OsSendSignalToProcessGroup(INT32 pid, siginfo_t *info, INT32 permission)
{
ProcessGroup *group = NULL;
/* Send SIG to all processes in process group PGRP.
If PGRP is zero, send SIG to all processes in
the current process's process group. */
group = OsFindProcessGroup(pid ? -pid : LOS_GetCurrProcessGroupID());
if (group == NULL) {
return -LOS_ESRCH;
}
/* all processes in the process group. */
return OsSendSignalToSpecifyProcessGroup(group, info, permission);
}
STATIC LosProcessCB *OsFindGroupExitProcess(ProcessGroup *group, INT32 pid)
{
LosProcessCB *childCB = NULL;
@@ -285,10 +338,16 @@ STATIC VOID OsWaitCheckAndWakeParentProcess(LosProcessCB *parentCB, const LosPro
LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
{
if (!(processCB->processStatus & (OS_PROCESS_STATUS_INIT | OS_PROCESS_STATUS_RUNNING))) {
PRINT_ERR("The process(%d) has no permission to release process(%d) resources!\n",
PRINT_ERR("The process(%u) has no permission to release process(%u) resources!\n",
OsCurrProcessGet()->processID, processCB->processID);
}
#ifdef LOSCFG_KERNEL_VM
if (OsProcessIsUserMode(processCB)) {
(VOID)OsVmSpaceRegionFree(processCB->vmSpace);
}
#endif
#ifdef LOSCFG_FS_VFS
if (OsProcessIsUserMode(processCB)) {
delete_files(processCB->files);
@@ -315,7 +374,7 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
#ifdef LOSCFG_KERNEL_LITEIPC
if (OsProcessIsUserMode(processCB)) {
LiteIpcPoolDelete(&(processCB->ipcInfo));
LiteIpcPoolDelete(&(processCB->ipcInfo), processCB->processID);
(VOID)memset_s(&(processCB->ipcInfo), sizeof(ProcIpcInfo), 0, sizeof(ProcIpcInfo));
}
#endif
@@ -493,11 +552,11 @@ LITE_OS_SEC_TEXT VOID OsProcessCBRecycleToFree(VOID)
/* Clear the bottom 4 bits of process status */
OsInsertPCBToFreeList(processCB);
}
SCHEDULER_UNLOCK(intSave);
#ifdef LOSCFG_KERNEL_VM
SCHEDULER_UNLOCK(intSave);
(VOID)LOS_VmSpaceFree(space);
#endif
SCHEDULER_LOCK(intSave);
#endif
}
SCHEDULER_UNLOCK(intSave);
@@ -1006,12 +1065,19 @@ WAIT_BACK:
return LOS_OK;
}
STATIC UINT32 OsWaitRecycleChildProcess(const LosProcessCB *childCB, UINT32 intSave, INT32 *status)
STATIC UINT32 OsWaitRecycleChildProcess(const LosProcessCB *childCB, UINT32 intSave, INT32 *status, siginfo_t *info)
{
ProcessGroup *group = NULL;
UINT32 pid = childCB->processID;
UINT16 mode = childCB->processMode;
INT32 exitCode = childCB->exitCode;
UINT32 uid = 0;
#ifdef LOSCFG_SECURITY_CAPABILITY
if (childCB->user != NULL) {
uid = childCB->user->userID;
}
#endif
OsRecycleZombiesProcess((LosProcessCB *)childCB, &group);
SCHEDULER_UNLOCK(intSave);
@@ -1023,7 +1089,33 @@ STATIC UINT32 OsWaitRecycleChildProcess(const LosProcessCB *childCB, UINT32 intS
*status = exitCode;
}
}
/* get signal info */
if (info != NULL) {
siginfo_t tempinfo = { 0 };
tempinfo.si_signo = SIGCHLD;
tempinfo.si_errno = 0;
tempinfo.si_pid = pid;
tempinfo.si_uid = uid;
/*
* Process exit code
* 31 15 8 7 0
* | | exit code | core dump | signal |
*/
if ((exitCode & 0x7f) == 0) {
tempinfo.si_code = CLD_EXITED;
tempinfo.si_status = (exitCode >> 8U);
} else {
tempinfo.si_code = (exitCode & 0x80) ? CLD_DUMPED : CLD_KILLED;
tempinfo.si_status = (exitCode & 0x7f);
}
if (mode == OS_USER_MODE) {
(VOID)LOS_ArchCopyToUser((VOID *)(info), (const VOID *)(&(tempinfo)), sizeof(siginfo_t));
} else {
(VOID)memcpy_s((VOID *)(info), sizeof(siginfo_t), (const VOID *)(&(tempinfo)), sizeof(siginfo_t));
}
}
(VOID)LOS_MemFree(m_aucSysMem1, group);
return pid;
}
@@ -1057,7 +1149,7 @@ STATIC UINT32 OsWaitOptionsCheck(UINT32 options)
return LOS_OK;
}
LITE_OS_SEC_TEXT INT32 LOS_Wait(INT32 pid, USER INT32 *status, UINT32 options, VOID *rusage)
STATIC INT32 OsWait(INT32 pid, USER INT32 *status, USER siginfo_t *info, UINT32 options, VOID *rusage)
{
(VOID)rusage;
UINT32 ret;
@@ -1066,11 +1158,6 @@ LITE_OS_SEC_TEXT INT32 LOS_Wait(INT32 pid, USER INT32 *status, UINT32 options, V
LosProcessCB *processCB = NULL;
LosTaskCB *runTask = NULL;
ret = OsWaitOptionsCheck(options);
if (ret != LOS_OK) {
return -ret;
}
SCHEDULER_LOCK(intSave);
processCB = OsCurrProcessGet();
runTask = OsCurrTaskGet();
@@ -1082,7 +1169,7 @@ LITE_OS_SEC_TEXT INT32 LOS_Wait(INT32 pid, USER INT32 *status, UINT32 options, V
}
if (childCB != NULL) {
return (INT32)OsWaitRecycleChildProcess(childCB, intSave, status);
return (INT32)OsWaitRecycleChildProcess(childCB, intSave, status, info);
}
if ((options & LOS_WAIT_WNOHANG) != 0) {
@@ -1105,13 +1192,64 @@ LITE_OS_SEC_TEXT INT32 LOS_Wait(INT32 pid, USER INT32 *status, UINT32 options, V
goto ERROR;
}
return (INT32)OsWaitRecycleChildProcess(childCB, intSave, status);
return (INT32)OsWaitRecycleChildProcess(childCB, intSave, status, info);
ERROR:
SCHEDULER_UNLOCK(intSave);
return pid;
}
LITE_OS_SEC_TEXT INT32 LOS_Wait(INT32 pid, USER INT32 *status, UINT32 options, VOID *rusage)
{
(VOID)rusage;
UINT32 ret;
ret = OsWaitOptionsCheck(options);
if (ret != LOS_OK) {
return -ret;
}
return OsWait(pid, status, NULL, options, NULL);
}
STATIC UINT32 OsWaitidOptionsCheck(UINT32 options)
{
UINT32 flag = LOS_WAIT_WNOHANG | LOS_WAIT_WSTOPPED | LOS_WAIT_WCONTINUED | LOS_WAIT_WEXITED | LOS_WAIT_WNOWAIT;
flag = ~flag & options;
if ((flag != 0) || (options == 0)) {
return LOS_EINVAL;
}
/*
* only support LOS_WAIT_WNOHANG | LOS_WAIT_WEXITED
* notsupport LOS_WAIT_WSTOPPED | LOS_WAIT_WCONTINUED | LOS_WAIT_WNOWAIT
*/
if ((options & (LOS_WAIT_WSTOPPED | LOS_WAIT_WCONTINUED | LOS_WAIT_WNOWAIT)) != 0) {
return LOS_EOPNOTSUPP;
}
if (OS_INT_ACTIVE) {
return LOS_EINTR;
}
return LOS_OK;
}
LITE_OS_SEC_TEXT INT32 LOS_Waitid(INT32 pid, USER siginfo_t *info, UINT32 options, VOID *rusage)
{
(VOID)rusage;
UINT32 ret;
/* check options value */
ret = OsWaitidOptionsCheck(options);
if (ret != LOS_OK) {
return -ret;
}
return OsWait(pid, NULL, info, options, NULL);
}
STATIC UINT32 OsSetProcessGroupCheck(const LosProcessCB *processCB, UINT32 gid)
{
LosProcessCB *runProcessCB = OsCurrProcessGet();

View File

@@ -0,0 +1,84 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "los_smp.h"
#include "arch_config.h"
#include "los_atomic.h"
#include "los_task_pri.h"
#include "los_init_pri.h"
#include "los_process_pri.h"
#include "los_sched_pri.h"
#include "los_swtmr_pri.h"
#ifdef LOSCFG_KERNEL_SMP
STATIC struct SmpOps *g_smpOps = NULL;
STATIC VOID OsSmpSecondaryInit(VOID *arg)
{
UNUSED(arg);
OsInitCall(LOS_INIT_LEVEL_PLATFORM);
OsCurrProcessSet(OS_PCB_FROM_PID(OsGetKernelInitProcessID()));
OsInitCall(LOS_INIT_LEVEL_KMOD_BASIC);
#ifdef LOSCFG_BASE_CORE_SWTMR_ENABLE
OsSwtmrInit();
#endif
OsInitCall(LOS_INIT_LEVEL_KMOD_EXTENDED);
OsIdleTaskCreate();
OsInitCall(LOS_INIT_LEVEL_KMOD_TASK);
OsSchedStart();
}
VOID LOS_SmpOpsSet(struct SmpOps *ops)
{
g_smpOps = ops;
}
VOID OsSmpInit(VOID)
{
UINT32 cpuNum = 1; /* Start the secondary cpus. */
if (g_smpOps == NULL) {
PRINT_ERR("Must call the interface(LOS_SmpOpsSet) to register smp operations firstly!\n");
return;
}
for (; cpuNum < CORE_NUM; cpuNum++) {
HalArchCpuOn(cpuNum, OsSmpSecondaryInit, g_smpOps, 0);
}
return;
}
#endif

Some files were not shown because too many files have changed in this diff Show More